【问题标题】:Unity: Best way to make interface in Unity [closed]Unity:在 Unity 中制作界面的最佳方式 [关闭]
【发布时间】:2021-05-09 02:18:16
【问题描述】:

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

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

脚本

层次结构

唯一剩下的就是设置Dialog 游戏对象激活,当获胜条件为真时。它是在我的GameManager 脚本 中完成的。因此,在每个场景中,我必须手动将 Dialog object 拖到 GameManager scriptDialog 变量 上,以便它可以改变Dialog 对象。我尝试在GameManagerStart() 方法中获取(查找) Dialog object,但它可以' t 完成,因为 Dialog object 默认情况下是不活动的。有没有办法通过脚本查找和链接非活动游戏对象?

【问题讨论】:

  • 据我了解,您想要实现的目标是拥有一个可以在不同场景中重复使用的 WinPopUp 对话框。对吗?
  • 没错。它是可重用的,但是当我在另一个场景中实例化它时,它的每个按钮都需要手动重置 WinPopup 对象和 OnClick() 中的函数。
  • 您的 onClick 方法是由其他类调用函数还是仅从已经是对话框一部分的类调用函数?
  • 我想按钮调用其他类的方法...
  • 如果你想从其他类调用函数,你需要以不同于直接从 Unity 编辑器分配函数的方式进行。也许使用 Actions 来实现这一点。

标签: android unity3d user-interface game-development


【解决方案1】:

正如在 cmets 中所讨论的,由于您想要实现的是创建一个带有按钮的可重用对话框,该对话框将触发来自当前Scene 的一部分的其他类的不同功能,您可以实现这一点的方法是通过使用UnityAction。 假设您有一个 Dialog 脚本,其中有一个函数 OnButtonClickedAction

public class Dialog : MonoBehaviour {

public static UnityAction OnButtonClickedAction;

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

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

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 类,因此您可以从您的 Dialog 脚本中调用类似的内容。

public class Dialog : MonoBehaviour {

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

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

这是 Unity Editor 中的层次结构:

如您所见,Scene 内有一个Dialog 对象,该对象附加了Dialog 脚本,在ButtononClick 事件上,DialogOnButtonClicked 方法已分配。

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

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

【讨论】:

  • 所以 WinPopup 是 Dialog 并且在你的所有按钮的 onClick 中你应该从你的 WinPopup 脚本中攻击像 OnButtonClicked 这样的函数。
  • Script 应该附加到GameObject,它位于您要拍摄DialogScene 内。并且功能和可以是两个,FirstButtonClickSecondButtonClick取决于你有多少按钮。
  • 好的,给我一点时间把解决方案也上传为截图
  • 答案已更新。希望现在更容易理解
  • 没问题。不管你选择的是字符串还是整数,都是一样的。我只是认为字符串中出现拼写错误的可能性比使用 int 更大。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多