СКРИПТЫ ЕДИНСТВА: появляются в том же месте после уничтожения (через 3 секунды) - PullRequest
0 голосов
/ 15 октября 2018

эй, кто-нибудь знает, как создать сценарий C # для объекта, который будет порождаться после уничтожения пулей

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Если вы используете Destroy(yourObject);, объект удаляется, и вы теряете доступ.Вы можете превратить ваш объект в префаб и создать его там, где вы хотите, используя GameObject obj = Instantiate(...); Obj содержит ссылку на новый порожденный объект, а не на префаб, что означает, что вы можете позже снова использовать Destroy(obj);

0 голосов
/ 15 октября 2018

Есть несколько способов архивировать это.

Обратите внимание, что вы также можете работать полностью без сопрограмм, но обычно это отстой

private float timer;

private bool isRespawning;
private GameObject clone;

private void DestroyObject(GameObject obj)
{
    isRespawning = true;
    timer = 3f;

    // first make a clone of the current Object
    var clone = Instantiate(obj, obj.transform.position, obj.transform.rotation, objtransform.parent);

    // disable the clone
    clone.SetActive(false);

    // Destroy the original
    Destroy(obj);
}

private void Update()
{
    if(Mathf.Approximately(timer,0f)) return;

    timer += Time.deltaTime;

    if(timer > 0) return;

    // Set the clone active
    clone.SetActive(true);
    timer = 0;
}

Более простым будет сопрограмма:

private void DestroyAndRespawn(GameObject obj)
{
    StartCoroutine(DestroyAndRespawnRoutine(obj));
}

private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
    // first make a clone of the current Object
    var clone = Instantiate(obj, obj.transform.position, obj.transform.rotation, objtransform.parent);

    // disable the clone
    clone.SetActive(false);

    // Destroy the original
    Destroy(obj);

    // Wait 3 seconds
    yield return new WaitForSeconds(3f);

    // Set the clone active
    clone.SetActive(true);
}

Но зачем вам уничтожать объект и возрождать его?Вы можете просто отключить, а затем снова включить его

private void DestroyAndRespawn(GameObject obj)
{
    StartCoroutine(DestroyAndRespawnRoutine(obj));
}

private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
    // disable the obj
    obj.SetActive(false);

    // Wait 3 seconds
    yield return new WaitForSeconds(3f);

    // Set the objactive
    obj.SetActive(true);
}

Обновление

Поскольку вы хотите вызвать его при столкновении:

Вам понадобится еще один GameObject, который работает в качестве диспетчера для перезапуска / включения, отключая, поскольку вы не можете просто прикрепить этот скрипт к объекту, который вы отключаете -> также отключит скрипт и никогда не включит его снова.

  1. Создайте новый пустой GameObject, например с именем "RespawnManager"
  2. Создайте новый скрипт RespawnManager.cs:

    public class RespawnManager : MonoBehaviour
    {
        public static RespawnManager Singleton;
    
        private void Awake()
        {
            if(Singleton)
            {
                enabled = false;
                return;
            }
    
            Singleton = this;
        }
    
        private void DestroyAndRespawn(GameObject obj)
        {
            StartCoroutine(DestroyAndRespawnRoutine(obj));
        }
    
        private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
        {
            // disable the obj
            obj.SetActive(false);
    
            // Wait 3 seconds
            yield return new WaitForSeconds(3f);
    
            // Set the objactive
            obj.SetActive(true);
        }
    }
    
  3. Чем вы можете позвонитьэто при столкновении, как

    OnCollisionEnter(Collision obj)
    {
        if (obj.gameObject.name != "bullet") return;
    
        // pass this GameObject to the manager
        RespawnManager.Singleton.DestroyAndRespawn(gameObject);
    }
    
0 голосов
/ 15 октября 2018

Установить объект active на Ложь.используя

gameobject.SetActive(false);

И вы можете использовать Coroutine для этого.

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