假设我有三个简单的盒子状对象,我想通过按下键盘上的特定键(比如W键用于对象2,S键用于对象3),以任意顺序向场景中已经存在的第一个对象添加另一个对象,然后再添加另一个对象,来制作不同的组合。
例如:
之后,我想删除最后一个目前的对象,每次我想按Q键。
例如,我按W,W,S,W,S(对象2,对象2,对象3,对象2,对象3)。
之后,我按下Q三次(获得合成Obj 2,Obj 2,因为我用Q破坏了最后三个)。
然后我按W一次(获得Obj 2,Obj 2,Obj 2)。
模块化部分由放入空游戏对象(其在对象1、2和3内)中的脚本制成。
public class Placement : MonoBehaviour
{
public GameObject shape1, shape2, shape3;
public Counter count;
void Start()
{
count = FindObjectOfType<Counter>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
count.Array[count.i] = Instantiate(shape3, transform.position, transform.rotation);
this.enabled = false;
}
if (Input.GetKeyDown(KeyCode.S))
{
count.Array[count.i] = Instantiate(shape2, transform.position, transform.rotation);
this.enabled = false;
}
if (Input.GetKeyDown(KeyCode.Alpha6))
{
Destroy(count.Array[count.i]);
count.i = count.i - 1;
}
}
然后我使用一个计数器和一个GameObject数组来“保存”场景中的每个克隆,在另一个通用脚本中始终存在于场景中。
public class Counter : MonoBehaviour
{
public int i = 0;
public GameObject[] Array = new GameObject[50];
public void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
i = i + 1;
}
if (Input.GetKeyDown(KeyCode.S))
{
i = i + 1;
}
}
}
问题是:
1.第一个脚本每次都是“重新加载”的,因为它在我放入场景中的每个示例化对象中,所以我必须使用一个外部脚本来保存我需要的每个计数器和/或GameObject引用;
1.如果我移除这个。enabled = false;从每个示例化过程中,脚本部分工作,但它创建了太多的相同对象的克隆(因为它使用场景中的每个空游戏对象作为放置克隆的参考,而不仅仅是最后一个存在);
1.通过创建太多的克隆(即使我按下W/S一次),如果我试图销毁最后一个,它会销毁许多其他的,如果我试图把其他在销毁过程后,它会克隆的对象在每个位置可用,而不是最后一个。
我开始在一个愚蠢的过程中失去理智...:“)
2条答案
按热度按时间aiazj4mn1#
1.使用一个空的游戏对象作为
ObjectSpawnManager
来管理你的对象繁殖/毁灭行为,把第一个脚本放到这个对象上,这样你就不需要把同一个脚本放到多个示例上。1.删除
Counter
脚本中的Update
部分,添加UpdateCounter
公共方法,并在按下相应键时从ObjectSpawnManager
脚本中调用它。ao218c7q2#
既然你已经提出了一些问题,但没有具体的问题,我将向你提出一个可行的方法,并落实你的要求。如果你想澄清一个具体的问题,请随时提出。
正如你自己所说的,用一个脚本来管理放置对象的整个过程更有意义。将这个脚本,我们称之为
SpawnManagerScript
,附加到场景中的一个空的GameObject
上,例如SpawnManager
。如果你不确定某个时间点上有多少对象,我也建议你使用
List
而不是数组。如果你确实想把对象的数量限制在50(看你的代码),数组完全可以。假设你已经能够在产卵时找出对象的正确位置,我就不详细介绍了。
如果我没理解错的话,现在要做的是:
1.繁殖
GameObject
:区分用户输入(例如S
和W
)。对于每种类型的对象,您可以在SpawnManagerScript
类中拥有一个public
字段,该字段引用场景中的预置或模板GameObject
。您可以使用模板对象根据用户输入进行克隆。将此克隆添加到List
或对象数组中,并将其正确定位。1.删除
GameObject
:同样,在脚本中检测要删除的输入键。从相应的容器中获取List
中的最后一个元素或数组中最后添加的元素。销毁它或将其设置为非活动状态。从容器中删除条目。