我正在使用IEnumerator函数,并且我的if语句有问题:
IEnumerator Spawning()
{
Debug.Log("Spawning being called...");
if (GameObject.Find("FPSController").GetComponent<BoxCollide>().hitTrigger == true)
{
Debug.Log("CUSTOMER SHOULD SPAWN!");
while (countStop == false) {
yield return new WaitForSeconds(2);
Debug.Log("Fisher Spawned!");
counter++;
spawnNewCharacter.SpawnCharacter();
if (counter >= 3){
countStop = true;
}
}
}
}
经过一些调试后,事实证明我的if语句确实有效。这个问题实际上是我运行游戏时调用的IEnumerator
函数。我需要一种方法只在我的IEnumerator
时调用此hitTrigger == true
函数,但我似乎无法正常工作。
我已经在IEnumerator
函数上尝试了这个:
void Update()
{
if (GameObject.Find("FPSController").GetComponent<BoxCollide>().hitTrigger == true)
{
Debug.Log("Spawning now...");
StartCoroutine(Spawning());
}
}
但仍然无法让任何Debug.Log
得以通过。希望得到一些帮助!
答案 0 :(得分:0)
Find()和GetComponent()
您不想在Update方法中使用GameObject.Find(...),因为它是一个昂贵的调用。每帧调用Update方法,因此您以60fps的速度在1秒内调用GameObject.Find(...)60次。 因此,当您使用GetComponent()或Find()时,您希望保存对这些对象的引用,如下面的代码段所示。
使用GetComponent()或GameObject.Find()等方法的更好位置是Awake()和Start()方法。
<强>唤醒强>
唤醒用于初始化之前的任何变量或游戏状态 比赛开始。唤醒只在一生中被召唤一次 脚本实例。在初始化所有对象之后调用Awake 您可以安全地与其他对象交谈或使用例如查询它们。 GameObject.FindWithTag。 [...] 解释来自链接文档。
开始强>
当在任何脚本之前启用脚本时,在帧上调用Start Update方法的第一次调用。像清醒一样 function,Start在脚本的生命周期中只调用一次。 但是,初始化脚本对象时会调用Awake, 无论脚本是否已启用。开始可能不是 如果脚本未启用,则调用与Awake相同的帧 初始化时间。 解释也来自链接文档
将第一个Component(FPSControllerCollission)添加到保存FPSController的对象上。 它利用了统一性OnTriggerEnter&amp; OnTriggerExit方法。
当触发器进入盒子对撞机的空间时,此脚本会将IsTriggered bool设置为 true 。
注意:当&#34; Is Trigger&#34;时,对撞机充当触发器。复选框 检查组件。
当碰撞器进入箱式对撞机的空间时,您可以使用OnCollisionEnter / Exit进行类似的识别。
请注意,以下只是一个示例,您必须调整/ 将其集成到您的代码中
[RequireComponent(typeof(BoxCollider))]
public class FPSControllerCollission : MonoBehaviour {
public bool IsTriggered;
private void OnTriggerEnter(Collider other) {
this.IsTriggered = true;
}
private void OnTriggerExit(Collider other) {
//Maybe check the tag/type of the other object here
this.IsTriggered = false;
}
}
以下SpawnController类可以集成到您已经拥有的类中。
public class SpawnController : MonoBehaviour {
private FPSControllerCollission _fpsControllerCollission;
private void Awake() {
this._fpsControllerCollission = FindObjectOfType<FPSControllerCollission>();
}
private void Update() {
if (this._fpsControllerCollission.IsTriggered) {
StartCoroutine(nameof(Spawning));
}
}
IEnumerator Spawning() {
Debug.Log("Spawning being called...");
if (this._fpsControllerCollission == true) {
Debug.Log("CUSTOMER SHOULD SPAWN!");
bool countStop = false;
int counter;
while (countStop == false) {
yield return new WaitForSeconds(2);
Debug.Log("Fisher Spawned!");
counter++;
spawnNewCharacter.SpawnCharacter();
if (counter >= 3) {
countStop = true;
}
}
}
}
}