代码的目的是
但是,我被困在第2步了。 我成功地使“正常”和“病毒”预制件在随机位置生成。 顺便说一句,我不知道应该做什么来为预制件提供变换功能。
另外,如果“正常”预制件相互碰撞,我应该使用什么代码将它们替换为“病毒”预制件?
这些是我使用的代码和图片
using UnityEngine;
public class VirusSpawner : MonoBehaviour
{
[SerializeField]
private int objectSpawnCount = 5;
[SerializeField]
private GameObject[] prefabArray;
private void Awake()
{
for (int i = 0; i < objectSpawnCount; ++i)
{
int index = Random.Range(0, prefabArray.Length);
float x = Random.Range(-3, 3);
float y = Random.Range(-4, 4);
Vector3 position = new Vector3(x, y, 0);
Instantiate(prefabArray[index], position, Quaternion.identity);
}
}
}
据我了解,您需要的是对象的脚本,负责移动它们并控制所有这些“正常”和“病毒”状态。
2.1。创建一个 C# 脚本(即“病毒”),该脚本一旦存在就会移动该对象。
2.2。实例化预制件后,立即添加此脚本:
GameObject newGO = Instantiate(prefabArray[index], position, Quaternion.identity);
newGO.AddComponent<Virus>();
正如 @Caio Rocha 所说,您可以实例化新的病毒对象并向其添加组件,但还有一种更快的方法:
创建一个空游戏对象。
将两个(病毒和普通)预制件添加为该预制件的子项,然后拖放到项目窗口以创建新的预制件。
将此脚本附加到父级:
public class ParentObject : MonoBehaviour
{
public GameObject VirusObject;
public GameObject NormalObject;
private bool isVirus;
private void Awake()
{
isVirus = (Random.Range(0, 2) == 1); //Randomly Make an object
//virus or normal on instantiation
if (isVirus)
{
TurnToVirus();
}
else
{
TurntoNormal();
}
}
private void OnCollisionEnter(Collision other)
{
ParentObject coll =
other.collider.gameObject.GetComponent<ParentObject>();
if (coll && coll.isVirus) //if other object is virus
{
TurnToVirus();
}
}
private void TurnToVirus()
{
VirusObject.SetActive(true);
NormalObject.SetActive(false);
}
private void TurntoNormal()
{
VirusObject.SetActive(false);
NormalObject.SetActive(true);
}
}
现在在预制件数组内移动此父预制件而不是您自己的预制件,它将随机创建正常对象和病毒对象,并且当它们交互时,正常对象会变成病毒。确保此脚本和碰撞器现在位于父级上。这比仅针对单次检查单独添加组件进行了优化。
您可以像添加对象一样将新脚本添加到预制件中,方法是将其拖放到统一编辑器中的预制件上,或者添加组件脚本。
要沿随机方向移动实例化的对象,只需将翻译添加到 Update() 方法中即可。在触发事件(或类似事件)的碰撞器中检查自身是否正常而另一个是否是病毒,如果是,则实例化一个新病毒,将其变换设置为当前对象的变换,保存您要保存的任何其他属性进入新病毒,然后销毁this.gameobject。