我有自己的对话系统,它基本上是一个带对撞机的游戏对象。触发对撞机后,应显示Canvas
组件Text
。到目前为止,这是有效的。现在,我想让它只发生一次。它的工作原理如下:我启动水平触发器显示对话框。游戏非常硬核,所以玩家可能会死。当玩家死亡时,我会调用Application.LoadLevel(Application.loadedLevel);
(所以基本上我重新启动等级)
如果我在使用对撞机
的脚本中使用这样的东西 private static bool firstTimeText = true;
void OnTriggerEnter2D(Collider2D coll)
{
if (coll.tag == "Player" && firstTimeText)
{
GetComponent<BoxCollider2D>().enabled = false;
firstTimeText = false;
}
}
一切都像魅力一样。除非我复制了这个游戏对象,脚本中的静态变量将会处理&#34;处理&#34;第一次触发对话后,此对象的每个实例都会将firstTimeText设置为false。所以基本上我只能使用它一次。
那么是否有任何触发器只能运行一次而不会在Application.LoadLevel
后重置?
这也不起作用
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
答案 0 :(得分:1)
考虑只有一个静态类,它将设置一个标志来指示对话框是否应该出现。请注意,我不是在这里继承MonoBehaviour。
public static class ApplicationData {
public static bool ShowDialog = true;
}
用法:
if (ApplicationData.ShowDialog)
{
ShowDialog();
ApplicationData.ShowDialog = false;
}
静态类将在应用程序的生命周期内保留其值。因此,即使您重新加载场景,它也会保留FALSE值。
答案 1 :(得分:1)
静态变量是全局相同的 - 因此如果您需要有多个游戏对象表现出这种行为,他们需要以某种方式挂钩到不同的静态值。
执行此操作的一种方法是使用密钥,然后保留已显示的所有“密钥”的静态列表。我的建议是HashSet
- 因此
private static HashSet<string> firstTimeSet = new HashSet<string>();
public string singleRunKey;
void OnTriggerEnter2D(Collider2D coll)
{
if (coll.tag == "Player"
&& firstTimeSet.Add(singleRunKey))
{ GetComponent<BoxCollider2D>().enabled = false; }
}
请注意,.Add
如果项目不在集合中(并添加它),则返回true
,但如果已经是false
,则返回singleRunKey
(并且不添加它,因为没有一式两份)。您现在要做的就是通过Inspector为每个对象分配$em->persist($theCreatedEntity)
一个唯一值,每个对象只运行一次