Перемещение сборного дома в единстве

#visual-studio #unity3d #prefab

Вопрос:

Цель кодекса состоит в том, чтобы

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

    }
}
 

введите описание изображения здесь

Комментарии:

1. Вы не перемещаете сборные дома. Точно так же, как вы не готовите свою книгу рецептов, когда готовите. Вам нужно переместить созданный объект.

Ответ №1:

Как я понял, вам нужен скрипт для ваших объектов, отвечающий за их перемещение и управление всеми этими «Нормальными» и «вирусными» состояниями.

2.1. Создайте скрипт на C# (т. е. «Вирус»), который перемещает объект, как только он существует.

2.2. Сразу после создания экземпляра ваших сборных модулей добавьте в него этот скрипт:

 GameObject newGO = Instantiate(prefabArray[index], position, Quaternion.identity);
newGO.AddComponent<Virus>();
 
  1. В новом сценарии «Вирус» добавьте обнаружение столкновений и переменную, которая содержит состояние нормального или вирусного

Ответ №2:

Как сказал @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 amp;amp; 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);
            }
        }
     

Теперь внутри массива сборных блоков переместите этот родительский сборный блок вместо ваших собственных сборных блоков, и он будет случайным образом создавать обычные и вирусные объекты, а когда они взаимодействуют, нормальные превращаются в вирусы. Убедитесь, что этот сценарий и коллайдер теперь включены. Это значительно оптимизировано по сравнению с добавлением компонента по отдельности только для одной проверки.