在Unity的App Start上,每个会话只运行一次特定代码



我想在我的应用程序中每个用户会话只运行一次某些代码。

这里有一个例子:

public class RunCodeOnce : MonoBehaviour
{
public static bool ranOnce;
void Awake()
{
if (ranOnce) { return; }
... code to run only once ...
}
}

这是一个很好的方法吗?还是有其他推荐的方法?

谢谢。

简单的答案是有一个singleton。它是在你的游戏开始时制作的,运行代码,基本上是因为它从未被破坏,所以开始代码再也不会运行了。

你的代码几乎都是

public class RunCodeOnce : MonoBehaviour
{
public static RunCodeOnce Instance;
void Awake()
{
if (Instance!=null) { Destroy(gameObject); return; } // stops dups running
DontDestroyOnLoad(gameObject); // keep me forever
Instance = this; // set the reference to it
... code to run only once ...
}
}

这就形成了一个持久存在的对象,无论发生什么,它都不允许复制自己,因为无论你加载多少新场景或其他什么,它不会死,除非你在代码中亲自销毁它,否则它不会死——它将在整个会话中都在那里。

如果会话的意思是"自游戏启动以来",Start/Awake方法已经解决了这个问题,确保脚本只存在于一个实例中。

但是,如果你的意思是"自用户安装应用程序以来仅一次",那么你将不得不利用一些持久数据来进行切换。最简单的方法是PlayerPrefs类。

void Awake()
{
Init();
}
void Init()
{
if (!PlayerPrefs.HasKey("isInit"))
{
DoYourStuffHere();
PlayerPrefs.SetInt("isInit", 1);
}
}

您还可以使用RuntimeInitializeOnLoadMethod属性,如下面的代码示例所示。Unity只会调用一次,直到您的应用程序进程被终止。好处是它非常简单,并且完全独立于任何MonoBehavior,除非您需要通过SerializeFields引用资产。

请注意,枚举RuntimeInitializeLoadType可以设置为BeforeSceneLoadAfterSceneLoad

using UnityEngine;
public static class Services
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void Initialize()
{
Debug.Log("test");
}
}

最新更新