Как заставить программу сделать что-то, когда объект уничтожен? - PullRequest
1 голос
/ 31 мая 2019

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

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

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

Destroy(spawnedPlane, 5f);

Было бы идеально, если бы я мог просто взять немногокод, который «Уничтожить этот объект через X секунд И добавить это к этому значению».Потому что, как я понимаю, "destroy" принимает только 2 параметра и ничего больше.

Конечно, это возможно, но я в растерянности.Все еще очень плохо знакомы с этим.Извините, если это очень неясно, но я едва знаю, что я делаю сам.

Ответы [ 3 ]

5 голосов
/ 31 мая 2019

Вы можете использовать события , чтобы четко достичь того, что вы хотите.Ниже приведен пример события, которое может оказаться полезным.Другие объекты могут прослушивать событие, и как только оно будет запущено, они будут уведомлены.

[Serializable]
public class PlaneEvent : UnityEvent<Plane> { }

После того, как вы определили свое событие, вы можете добавить его в качестве поля на вашем самолете.Как только ваш самолет будет уничтожен, вы можете запустить событие, и оно, в свою очередь, уведомит любого, кто его слушает!

public class Plane : MonoBehaviour {

    public PlaneEvent OnDestroyed;

    public void Destroy () {
        Destroy(gameObject);
        OnDestroyed.Invoke(this);
        OnDestroyed.RemoveAllListeners();
    }

}

Теперь в нашем классе партитур мы добавим метод, который будет вызываться один раз.событие плоскости OnDestroyed запускается.

public class Score : MonoBehaviour { 

    public void AddPointsFor (Plane plane) {
        Debug.Log("A Plane was destroyed!");
        //Tick a counter, add points, do whatever you want!
    }

}

Как только у нас есть эти кусочки, легко заставить их работать вместе.Мы берем самолет и добавляем счет в качестве слушателя на событие OnDestroyed.Затем, когда самолет уничтожен, событие запускается и счет подсчитывается для добавления очков.

public class Game : MonoBehaviour {

    [SerializeField]
    private Score _score;
    [SerializeField]
    private Plane _plane;

    public void Start () {
        // When you are destroyed let me know so I can add some points.
        _plane.OnDestroyed.AddListener(_score.AddPointsFor);
        _plane.Destroy();
    } 
}

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

2 голосов
/ 31 мая 2019

Просто используйте сопрограмму, чтобы подождать, а затем вычесть точку и уничтожить объект одновременно.

void Start()
{
    // your startup script
    StartCoroutine(DestroyAfterSeconds(5f));
}

IEnumerator DestroyAfterSeconds(float seconds)
{
    // wait for X amount of seconds before continuing on
    yield return new WaitForSeconds(seconds);

    /*
     *  this runs after the wait.
     *  if the coroutine is on the same gameobject that you are
     *  destroying, it will stop after you run Destroy(), so subtract
     *  the point first.
     * */
    points--;
    Destroy(spawnedPlane);
}
1 голос
/ 31 мая 2019

Если бы это был я, я бы, конечно, пошел с событиями, предложенными CaTs.
Coroutine - еще один способ сделать это, но события лучше в целом , по крайней мере, в этом случае.Кроме того, использование сопрограммы только для одного Invoke - это немного излишнее (и сопрограммы Unity немного не производительны). Также сопрограмма должна находиться за пределами объекта, который вы хотите уничтожить, потому что сопрограммы Unity умирают, когда их MonoBehaviour уничтожается.

Если вам по-прежнему неуютно с событиями, вы ...
ну, вы должны преодолеть это и попробовать их в любом случае.

Вы можете использовать ярлык, который вы можете использовать Более эффективная сопрограмма - бесплатно .

И запустите этот код:

Timing.CallDelayed(5f, DestroyAndRemoveHP());

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

Полное описание метода .

С положительной стороны вы начнете использовать MEC, который лучше единицысопрограмма, но изучение событий делает вас также лучшим программистом.Вы могли бы сделать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...