Unity:在 Unity 中制作界面的最佳方式

Unity: Best way to make interface in Unity

对于我的 Android 游戏,我需要制作一个弹出界面 window,它应该在一个关卡完成时出现。最好的方法是什么?

更新 2:有效!我使用的最终版本:

脚本

层次结构

唯一剩下的事情就是设置 Dialog 游戏对象 在获胜条件为真时激活。它是在我的 GameManager 脚本 中完成的。因此,在每个场景中,我必须手动将 Dialog object 拖到 GameManager script 上对话框变量,以便它可以更改Dialog 对象。我已经尝试 Get (find) Dialog object in GameManager's Start ()方法,但是做不到,因为Dialogobject默认是不活动的。有没有办法通过脚本找到并 link 不活动的游戏对象?

按钮不起作用的一个可能原因可能是现场缺少事件系统。事件系统位于 UI 部分下,与 Canvas 相同。当您在舞台上创建第一个 UI 元素时,它会自动添加。 https://docs.unity3d.com/2018.3/Documentation/Manual/EventSystem.html

正如评论中所讨论的那样,由于您想要实现的是创建一个带有按钮的可重用对话框,这些按钮将触发与其他 classes 不同的功能,这些功能属于当前 Scene,实现这一点的方法是使用 UnityAction。 假设您有一个带有函数 OnButtonClickedAction :

Dialog 脚本
public class Dialog : MonoBehaviour {

public static UnityAction OnButtonClickedAction;

    public void OnButtonClicked(){
        if (OnButtonClickedAction != null){
            OnButtonClickedAction.Invoke();
        }
    }
}

并且在您要显示此对话框的 Scene 中,您应该有一个 class 订阅这些操作:

public class Script : MonoBehaviour {

    private void OnEnable() {
        Dialog.OnButtonClickedAction += CodeToRunOnButtonClick;
    }

    private void OnDisable(){
        Dialog.OnButtonClickedAction += CodeToRunOnButtonClick;
    }

    private void CodeToRunOnButtonClick(){
        // code
    }
}

通过这样做,您的 Dialog 可以在不同的 Scene 之间重复使用。

还有另一种使用单例模式的方法,通过从 GameObject 调用一个函数,该函数在更改 Scene 期间不会被破坏。假设您有一个 GameManager class 不会被破坏,因此您可以从 Dialog 脚本中调用类似的东西。

public class Dialog : MonoBehaviour {

    public void OnButtonClicked(){
        GameManager.Instance.CodeToRunOnButtonClick();
    }
}

我更喜欢第一个版本,但这取决于你。

这是 Unity 编辑器中的层次结构:

如您所见,在 Scene 中有一个 Dialog 对象,它附加了 Dialog 脚本,在 ButtononClick 事件,DialogOnButtonClicked 方法被赋值。

并且通过将 Script 对象添加到要显示此 Dialog/WinPopUp 的每个场景,您可以像这样收听该动作:

如果您有多个按钮,您可以轻松扩展 UnityAction 以支持为每个 Button (buttonId) 添加一个 id 并像这样传递它: