1

代码的目的是

  1. 制作“正常”和“病毒”的预制件
  2. 让它们向随机方向移动
  3. 当它们碰撞时,将“正常”更改为“病毒”预制件

但是,我被困在第 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);
        }

    }
}

在此处输入图像描述

4

2 回答 2

1

据我了解,您需要的是对象的脚本,负责移动它们并控制所有这些“正常”和“病毒”状态。

2.1。创建一个 C# 脚本(即“病毒”),在对象存在时立即移动它。

2.2. 在实例化你的 prefabs 之后,立即添加这个脚本:

GameObject newGO = Instantiate(prefabArray[index], position, Quaternion.identity);
newGO.AddComponent<Virus>();
  1. 在新的“病毒”脚本上,添加碰撞检测和保持正常或病毒状态的变量
于 2021-11-21T02:50:43.740 回答
1

正如@Caio Rocha 所说,您可以实例化新的病毒对象并向其添加组件,但还有一种更快的方法:

  1. 创建一个空游戏对象。

  2. 添加(病毒和普通)预制件作为该预制件的子代,然后拖放到项目窗口以创建新的预制件。

  3. 将此脚本附加到父级:

        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);
            }
        }
    

现在在预制数组内部移动这个父预制而不是你自己的预制,它会随机创建正常和病毒对象,当它们交互时正常转向病毒。确保此脚本和对撞机现在位于父级上。这比单独添加组件仅用于单次检查要优化得多。

于 2021-11-21T12:55:23.207 回答