仅显示一次对话框,而不是在级别重启后

时间:2015-08-19 13:36:34

标签: c# unity3d

我有自己的对话系统,它基本上是一个带对撞机的游戏对象。触发对撞机后,应显示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);
}

2 个答案:

答案 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)一个唯一值,每个对象只运行一次