在 Unity 中移动预制件

问题描述 投票:0回答:3

代码的目的是

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

    }
}

enter image description here

visual-studio unity-game-engine prefab
3个回答
1
投票

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

2.1。创建一个 C# 脚本(即“病毒”),该脚本一旦存在就会移动该对象。

2.2。实例化预制件后,立即添加此脚本:

GameObject newGO = Instantiate(prefabArray[index], position, Quaternion.identity);
newGO.AddComponent<Virus>();
  1. 在新的“病毒”脚本中,添加碰撞检测和保存正常或病毒状态的变量

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

现在在预制件数组内移动此父预制件而不是您自己的预制件,它将随机创建正常对象和病毒对象,并且当它们交互时,正常对象会变成病毒。确保此脚本和碰撞器现在位于父级上。这比仅针对单次检查单独添加组件进行了优化。


0
投票

您可以像添加对象一样将新脚本添加到预制件中,方法是将其拖放到统一编辑器中的预制件上,或者添加组件脚本。

要沿随机方向移动实例化的对象,只需将翻译添加到 Update() 方法中即可。在触发事件(或类似事件)的碰撞器中检查自身是否正常而另一个是否是病毒,如果是,则实例化一个新病毒,将其变换设置为当前对象的变换,保存您要保存的任何其他属性进入新病毒,然后销毁this.gameobject。

© www.soinside.com 2019 - 2024. All rights reserved.