我正在嘗試執行respawn,但如標題中所述,出現該錯誤。但是我該怎么做才能使物件被禁用,并在幾秒鐘后再次啟用它,而不會出現此錯誤?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerCollision : MonoBehaviour
{
public GameObject Destroy;
[SerializeField] private Transform spawnPoint;
[SerializeField] private Transform diePoint;
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.tag == "Enemy")
{
GameObject d = Instantiate(Destroy) as GameObject;
d.transform.position = transform.position;
d.SetActive(true);
gameObject.SetActive(false);
StartCoroutine(waitForRespawn());
StartCoroutine(DestroyOptimization());
IEnumerator DestroyOptimization()
{
yield return new WaitForSeconds(2);
d.SetActive(false);
}
}
}
IEnumerator waitForRespawn()
{
yield return new WaitForSeconds(3);
gameObject.SetActive(true);
gameObject.transform.position = spawnPoint.transform.position;
}
}
uj5u.com熱心網友回復:
您設定gameObject.SetActive(false);.. 以便錯誤正確地告訴您:您無法在未激活的物件上啟動協程。
由于您的協程沒有做任何花哨的事情,只會延遲某些事情,因此您可以使用Invoke它也適用于非活動物件:
public class playerCollision : MonoBehaviour
{
public GameObject Destroy;
[SerializeField] private Transform spawnPoint;
[SerializeField] private Transform diePoint;
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.tag == "Enemy")
{
GameObject d = Instantiate(Destroy) as GameObject;
d.transform.position = transform.position;
d.SetActive(true);
gameObject.SetActive(false);
// will invoke the method called "Respawn" after 3 seconds
Invoke(nameof(Respawn), 3f);;
// will invoke the methd called "DestroyOptimization" aftre 2 seconds
Invoke(nameof(DestroyOptimization), 2f);
}
}
private void DestroyOptimization()
{
d.SetActive(false);
}
private void Respawn()
{
gameObject.SetActive(true);
gameObject.transform.position = spawnPoint.transform.position;
}
}
另一種方法是讓協程在控制器腳本上運行,該腳本本身不會處于非活動狀態。它實際上可以是任何 MonoBehaviour但你也可以有一個中央控制器腳本,例如
// is attached to an empty object in your scene which always stays active
public class CoroutineRunner : MonoBehaviour
{
// Singleton instance
private static CoroutineRunner _instance;
// Lazy initialization of the Singleton
public static CoroutineRunner Instance
{
get
{
if(_instance) return _instance;
_instance = FindObjectOfType<CoroutineRunner>();
if(_instance) return _instance;
_instance = new GameObject(nameof(CoroutineRunner)).AddComponent<CoroutineRunner>();
}
}
private void Awake()
{
if(_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
DontDestroyOnLoad(gameObject);
}
}
然后做
public class playerCollision : MonoBehaviour
{
public GameObject Destroy;
[SerializeField] private Transform spawnPoint;
[SerializeField] private Transform diePoint;
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.tag == "Enemy")
{
GameObject d = Instantiate(Destroy) as GameObject;
d.transform.position = transform.position;
d.SetActive(true);
gameObject.SetActive(false);
CoroutineRunner.Instance.StartCoroutine(waitForRespawn());
CoroutineRunner.Instance.StartCoroutine(DestroyOptimization());
}
}
private IEnumerator DestroyOptimization()
{
yield return new WaitForSeconds(2);
d.SetActive(false);
}
private IEnumerator waitForRespawn()
{
yield return new WaitForSeconds(3);
gameObject.SetActive(true);
transform.position = spawnPoint.transform.position;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329221.html
下一篇:獲取列舉的值作為字體樣式
