禁用Unity 3D场景之外的脚本

时间:2017-12-09 13:36:58

标签: c# unity3d assets

在我的国际象棋比赛中,我有一个选择的场景 - 黑色或白色。用户点击其中一个棋子后,他/她会收到一条弹出消息/它看起来像这样:

enter image description here

单击“确定”按钮,场景将变为带有棋盘的场景:

enter image description here

当用户选择黑色片时,他/她应该看到他们更接近他/她,而如果用户选择白色片,则他们应该在前面。默认情况下,在我的场景中,较近的部分是黑色的。我试图通过在每个图形上添加纹理更改脚本来实现这一点(它们对于白色和黑色部分会有所不同):

void Start () {
        GetComponent<Renderer>().material = Resources.Load<Material>)"Materials/Pieces/Marble/White Pawn");
    }

但是,如果用户选择黑色片段并且需要默认视图,我如何在重定向到场景时禁用此脚本。 这是弹出窗口的代码:

void OnGUI()
    {
        if (showPopUp)
        {
            GUI.Window(0, new Rect((Screen.width / 2) - 200, (Screen.height / 2) - 115
                   , 420, 180), ShowGUI, "Figures choice");

        }
    }

    void ShowGUI(int windowID)
    {
        RedirectToMenu redirect = new RedirectToMenu();
        guiStyle.fontSize = 22;
        guiStyle.normal.textColor = Color.white;
        GUI.Label(new Rect(80, 40, 200, 30), "You have chosen black pieces", guiStyle);

        if (GUI.Button(new Rect(180, 110, 75, 35), "OK")){
            showPopUp = false;
            redirect.LoadAsset("UpgradedRoom");
            SceneManager.LoadScene("UpgradedRoom");
        }
    }

我想我应该在加载场景之前访问此脚本并在需要时禁用。但是如何使用桌子,棋盘和棋子在场景外访问它?或者我可以在另一个场景中更改游戏对象的纹理吗?

1 个答案:

答案 0 :(得分:0)

我要做的是使用static变量来记住碎片是黑色还是白色。因此,您在场景加载之前设置变量,然后在加载后进行检查。因此,如果您的类被称为象棋管理器,则用于设置变量的代码可能如下所示:

public class ChessManager : Monobehavior {
    public enum ChessColor { Black, White }
    public static ChessColor playerColor

    public void OnGUI() {
        if(user chooses black) {
            playerColor = ChessColor.Black;
            //Load scene
        }
        else if(user chooses white) {
            playerColor = ChessColor.White;
            //Load scene
        }
    }
}

...启用/禁用脚本的代码可能是这样的,其中ColorChanger是设置颜色的脚本:

public class ColorChanger : Monobehavior {
    public void Start() {
        if(ChessManager.playerColor == ChessManager.ChessColor.White) {
            //Set texture
        }
    }
}

当用户在加载新场景后选择白色时,这会将纹理设置为其他内容。不要忘记用ChessManager中的if语句替换选择了国际象棋棋子时执行的代码(我假设您正在使用传统按钮,因此您应该更换if(user chooses color)if(GUI.Button))。希望我能帮忙!

此外,正如之前评论中的其他人所指出的那样,如果您使用UnityEngine.UI而不是Unity过时的遗留GUI系统,那可能是最好的,但根据项目可能不值得努力。