我想在我的应用中每个用户会话仅运行1次代码。
这里是一个例子:
public class RunCodeOnce : MonoBehaviour
{
public static bool ranOnce;
void Awake()
{
if (ranOnce) { return; }
... code to run only once ...
}
}
这是执行此操作的好方法,还是建议使用其他方法执行此操作?
谢谢。
答案 0 :(得分:0)
在每次会话中,您的意思是“自游戏启动以来”,“开始/唤醒”方法已经解决了该问题,从而确保脚本仅存在于一个实例中。
但是,如果您的意思是“自用户安装应用程序以来仅一次”,则您将不得不利用一些持久性数据来进行切换。最简单的方法是PlayerPrefs类。
void Awake()
{
Init();
}
void Init()
{
if (!PlayerPrefs.HasKey("isInit"))
{
DoYourStuffHere();
PlayerPrefs.SetInt("isInit", 1);
}
}
答案 1 :(得分:0)
简单的答案是拥有一个单身人士。之所以这样,是因为您的游戏开始运行,运行代码,并且基本上是因为它从未破坏过启动代码,因此不再运行。
您拥有的代码几乎全部
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 ...
}
}
这将使对象持久化,无论该对象永远不允许其自身重复,而且无论您加载了多少新场景或任何场景,它都不会死亡,除非您亲自在代码中物理销毁它,否则它不会死亡整个会议期间都会在那里。
答案 2 :(得分:0)
您还可以使用RuntimeInitializeOnLoadMethod属性,如下面的代码示例中所示。这只会被Unity调用一次,直到您的应用程序进程终止。 好处是它非常简单,并且完全独立于任何MonoBehaviour,除非您需要通过SerializeFields引用资产。
请注意,枚举RuntimeInitializeLoadType可以设置为BeforeSceneLoad
或AfterSceneLoad
。
using UnityEngine;
public static class Services
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void Initialize()
{
Debug.Log("test");
}
}