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

时间:2018-12-12 04:07:20

标签: c# unity3d

我想在我的应用中每个用户会话仅运行1次代码。

这里是一个例子:

public class RunCodeOnce : MonoBehaviour
{
    public static bool ranOnce;

    void Awake()
    {
        if (ranOnce) { return; }

        ... code to run only once ...
    }
}

这是执行此操作的好方法,还是建议使用其他方法执行此操作?

谢谢。

3 个答案:

答案 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可以设置为BeforeSceneLoadAfterSceneLoad

using UnityEngine;

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