简体   繁体   中英

Show dialog only once, not after level restart

I have my own dialog system which is basically a gameobject with a collider. After triggering collider, Canvas with a Text component should show up. So far, this works. Now, I want to make it happen only once. Here how its work: I start level trigger showing dialog. Game is pretty hardcore so player probably will die. When player dies, I call Application.LoadLevel(Application.loadedLevel); (so basically I restart level)

If I use something like this in scrip with collider

 private static bool firstTimeText = true;

 void OnTriggerEnter2D(Collider2D coll)
 {
     if (coll.tag == "Player" && firstTimeText)
     {
         GetComponent<BoxCollider2D>().enabled = false;
         firstTimeText = false;
     }
 }

everything works like a charm. EXCEPT if I make copy of this gameobject, static variable in script will "handle" that every instantion of this object will have firstTimeText on false after trigger dialog first time. So basically I can use it only once.

So is there any sollution for making trigger which run only once and not reset after Application.LoadLevel ?

Also this doesn't work

void Awake()
{
    DontDestroyOnLoad(transform.gameObject);
}

Consider just having a static class that will set a flag to indicate if the dialog should appear or not. Note that I am not inheriting from MonoBehaviour here.

public static class ApplicationData {
    public static bool ShowDialog = true;
}

Usage:

if (ApplicationData.ShowDialog)
{
    ShowDialog();
    ApplicationData.ShowDialog = false;
}

The static class will retain its values during the lifetime of your application. So, it will retain the FALSE value even if you reload your scene.

Static variables are globally identical - therefore if you need to have multiple gameobjects exhibiting this behavior, they'll need to hook into different static values in some way.

One way to do this would be to have a key, and then keeping a static list of all "keys" already displayed. My recommendation would be a HashSet - thus

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; }
}

Note that .Add returns true if the item wasn't in the collection (and adds it), but false if it already was (and does not add it, because no duplicates). All you have to do now is assign singleRunKey a unique value per object via the Inspector, and each one will run exactly once

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM