手电筒在触发时关闭,但在退出触发时不打开
本文关键字:退出 手电筒 | 更新日期: 2023-09-27 18:07:57
我真的不明白这个?
似乎发生的是当我进入触发区手电筒关闭,但当退出触发区手电筒不再打开。如果我把效果反过来,也就是当场景开始时闪光灯是关闭的,然后当进入触发区域时手电筒不转?这与我用于主房间灯(有效)的脚本相同(名称略有变化)
所以下面的代码手电筒是关闭的,我想在进入触发区时打开它?
public class TurnFlashLightOn : MonoBehaviour
{
void Start()
{
GameObject[] allLights = GameObject.FindGameObjectsWithTag("flashLight");
foreach (GameObject i in allLights)
{
i.SetActive(true);
}
}
void OnTriggerEnter()
{
GameObject[] allLights = GameObject.FindGameObjectsWithTag("flashLight");
foreach (GameObject i in allLights)
{
i.SetActive(false);
}
}
void OnTriggerExit()
{
GameObject[] allLights = GameObject.FindGameObjectsWithTag("flashLight");
foreach (GameObject i in allLights)
{
i.SetActive(true);
}
}
}
知道为什么它会关闭而不是打开吗?
谢谢
微妙但重要的细节:GameObject.FindGameObjectsWithTag
只搜索活动对象。一旦你关掉手电筒,它就不会再出现在搜索中了。
你需要缓存一个手电筒对象列表。
如果列表永远不会改变(你永远不会创建或销毁手电筒),那么你可以在Start
期间填充列表一次,然后在你需要它的时候参考列表。
如果列表是动态的,你可以从一个空列表开始,然后在它被停用时添加任何手电筒到列表中。当该开灯的时候,激活清单上的每一盏灯,然后清空清单。
有很多方法可以做到这一点;最基本的问题是,您需要一些其他方法来跟踪那些不活动的对象。
根据你的代码和你告诉我的,你有一个事件,当一个对象通过一个阈值时,灯将关闭。这个阈值包含事件OnTriggerEnter();
Threshold或Zone()不能同时包含两个触发器,并且知道应该触发哪一个。我只能建议你有一个If-Else语句,它有助于定义触发器应该触发的逻辑。例如(这是伪代码)
If (EnteringZoneFromStart() = true)
{OnTriggerEnter()}
Else If (ExitingZone() = true)
{OnTriggerExit()}
Else
{OnTriggerEnter()}