Как мне предотвратить уничтожение всех экземпляров объекта в Unity?

#c# #unity3d #physics #instance-variables

#c# #unity3d #физика #переменные экземпляра

Вопрос:

У меня есть сборный объект под названием Beam, который содержит несколько объектов, но один из них — это объект, который при столкновении с его экземпляром и его запуске должен уничтожить сам себя.

В настоящее время у меня есть скрипт, который генерирует все экземпляры в переменной с именем Beams. Показано здесь:

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

Когда это выполняется, внутри него создаются клоны. Смотрите здесь:

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

На последнем изображении вы также увидите сборный элемент Beam, в котором содержится файл cookie. В этом cookie у меня есть скрипт, который говорит, что если я нажму на него, уничтожьте. Этот код выглядит следующим образом:

 ...

public class Collectibles : MonoBehaviour
{
    GameManager game;

    // Start is called before the first frame update
    void Start()
    {
        game = FindObjectOfType<GameManager> ();
    }

    ...

    void OnTriggerEnter2D(Collider2D other) {
        if(other.tag == "Player"){
            string coinType = "Cookie";
            game.AddCollectible(coinType);
            Destroy(gameObject);
        }


    }
}
  

В настоящее время, когда я сталкиваюсь с файлом cookie, он запускает Destroy (GameObject) и уничтожает ВСЕ экземпляры файла cookie (по одному на каждый клон).

Этот код хранится в Cookie, а не в Beams. Это правильно? Должен ли я хранить код где-то еще? Я также пытался уничтожить (это), но это не делает того, что я думал, что это будет делать (только экземпляр).

Возможно ли, что оттуда, откуда я вызывал Destroy, скрипт не имеет доступа к экземплярам, или я что-то упускаю? Заранее благодарю вас!

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

1. Все ли ваши файлы cookie находятся в разных позициях, чтобы вы не вводили все их коллайдеры одновременно?

2. Да, определенно, в разных позициях.

3. Не могли бы вы показать инспектору объект, к которому у вас прикреплен ваш Collectibles скрипт

4. Ваш Collectibles скрипт прикреплен к вашему игровому объекту «Cookie» или к объекту «collectibles»? Если collectibles скрипт прикреплен к вашему игровому объекту «Collectibles», он удалит этот игровой объект вместе со всеми его дочерними элементами. Если вы просто хотите удалить файл cookie, который попал в коллайдер, вам нужно прикрепить Collectibles скрипт к игровому объекту «Cookie»

Ответ №1:

Если я понимаю ваш вопрос, вы хотите, чтобы при столкновении «player» с экземпляром «beam» уничтожался только экземпляр Cookie (или gameobject, содержащий скрипт), в данном случае это делалось бы с тегом:

 public GameObject[] arrayofcookie;

public int destroyedinstances=1; 
//this int will tell how many instances you want to be destroyed (from the last instantiated to the first)

//for this example the last instance will be deleted


public void destroyCookie()
{
    arrayofcookie= GameObject.FindGameObjectsWithTag("Cookie");
    for (int i = 0; i < destroyedinstances; i  )
    {
        Destroy(arrayofcookie[i].gameObject);
    }
}
  

Вы вызываете этот метод в скрипте cookie, в collider или, если вы предпочитаете, с помощью метода invoke через N секунд.

Не думаю, что я очень хорошо понял ваш вопрос, но в этих задачах я предпочитаю использовать метку, и это также зависит от характера вашей игры

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

1. Убедитесь, что объект имеет метку Cookie

2. Я не думаю, что это то, чего хочет OP, это также уничтожит все экземпляры GameObject с тегом «Cookie», а не только тот, с которым столкнулся. OP поправьте меня, если я ошибаюсь.

3. да, вы правы, я неправильно понял вопрос, в таком случае это было бы то же самое, но без использования цикла:

4. public void destroyCookie() { Уничтожить(GameObject. Найдите gameobjectswithtag(«Cookie»)); }

5. Полезность этой схемы заключается в том, что вы можете уничтожить только некоторые объекты, например, последние два экземпляра: