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 ()方法,但是做不到,因为Dialog
object默认是不活动的。有没有办法通过脚本找到并 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
脚本,在 Button
的 onClick
事件,Dialog
的 OnButtonClicked
方法被赋值。
并且通过将 Script
对象添加到要显示此 Dialog/WinPopUp 的每个场景,您可以像这样收听该动作:
如果您有多个按钮,您可以轻松扩展 UnityAction
以支持为每个 Button
(buttonId
) 添加一个 id 并像这样传递它:
对于我的 Android 游戏,我需要制作一个弹出界面 window,它应该在一个关卡完成时出现。最好的方法是什么?
更新 2:有效!我使用的最终版本:
脚本
层次结构
唯一剩下的事情就是设置 Dialog
游戏对象 在获胜条件为真时激活。它是在我的 GameManager
脚本 中完成的。因此,在每个场景中,我必须手动将 Dialog
object 拖到 GameManager
script 的 上对话框变量,以便它可以更改Dialog
对象。我已经尝试 Get (find) Dialog
object in GameManager
's Start ()方法,但是做不到,因为Dialog
object默认是不活动的。有没有办法通过脚本找到并 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
脚本,在 Button
的 onClick
事件,Dialog
的 OnButtonClicked
方法被赋值。
并且通过将 Script
对象添加到要显示此 Dialog/WinPopUp 的每个场景,您可以像这样收听该动作:
如果您有多个按钮,您可以轻松扩展 UnityAction
以支持为每个 Button
(buttonId
) 添加一个 id 并像这样传递它: