每个脚本和游戏对象的全局可用变量

时间:2015-07-31 14:56:23

标签: unity3d

我为Unity应用程序制作了一个菜单场景,用户选择了一个训练场景:4个可用选项中的1个以切换组的形式:

public enum trainingScenarios
{
    None = 0,
    scenario_1,
    scenario_2,
    scenario_3,
    scenario_4
}

因此,一旦用户勾选复选标记,所选方案就变为:

public void confirmScenario(int index)
{
    switch (index)
    {
        case 1:
                selectedScenario = trainingScenarios.scenario_1;
                break;
        case 2:
                selectedScenario = trainingScenarios.scenario_2;
                break;
        case 3:
                selectedScenario = trainingScenarios.scenario_3;
                break;
        case 4:
                selectedScenario = trainingScenarios.scenario_4;
                break;
    }
}

现在......在下一个场景中,我想使用selectedScenario变量来显示这是正在应用的场景的消息。目前,我让Unity不破坏我的菜单游戏对象,所以我可以获得对象和脚本等的引用...只是为了使用这个变量。有道理,因为到目前为止,我是唯一一次需要在不同的场景中使用selectedScenario变量。

但是,现在我再次需要这个selectedScenario变量来确定要应用于角色的动画类型,例如走向场景1并运行场景2等等......

所以,再次,我需要执行以下操作才能访问在初始菜单场景中设置的selectedScenario变量,更糟糕的是,因为我在Start方法中执行此操作一个场景,我只能立即在那里使用,而不是在其他方法......

GameObject menuManager = GameObject.Find("Menu Manager");
MenuScript menuScript = menuManager.GetComponent<MenuScript>();
Debug.Log("Selected Training Scenario: " + menuScript.selectedScenario);

这是否是在需要时获取对此变量的引用的好方法,或者这可能是单例设计的良好候选者?

我是Unity和C#程序员的新手,所以我试图了解何时使用这种设计模式。我会很感激善意和内容丰富的评论,以帮助我重新设计这个小东西。

3 个答案:

答案 0 :(得分:4)

其中一个选项可能是为您的游戏创建包含全局参数的static class。像:

public static class Global 
{
    public static trainingScenarios selectedScenario;

    public static void confirmScenario(int index)
    {
        ...
    }
}

并从项目中的任何其他位置访问它,如下所示:

Global.selectedScenario;

答案 1 :(得分:2)

您只需使用静态类来存储全局数据。例如,

obj2.slice(obj1.length);

然后您可以从任何地方访问GlobalData.globalValue。

public static class GlobalData
{
    public static int globalValue;
    // you can add more variables here
}

答案 2 :(得分:1)

是的,它是 Singleton 模式的一个很好的候选者,但还有另一种选择。

从长远来看,我总觉得坚持最后一级比赛非常有用。例如,自动选择菜单中的最后一个播放级别,甚至跳过菜单并尽快让用户进行播放。

鉴于此,我会用这个:

PlayerPrefs.SetInt ("last-scenario-played", selectedScenario);

然后在另一个场景中,在下一个小时或下个月:

int lastPlayed = PlayerPrefs.GetInt ("last-scenario-played");