Unity4.6 UI实现的架构
Which architecture for Unity4.6 UI implementation
我正在处理一个 Unity 项目。它是一个可视化软件,所以大部分游戏机制都是基于按钮、滑块、颜色选择器来更新我的 GamesObjects。
我不知道如何组织我的 UI 实施。
将某种 MVC 模式应用到 unity 是个好主意吗,知道怎么做吗(我找到了一些关于它的文章,但我不太清楚)?
目前我正在场景中添加 UI 个元素。一个名为 UIManager 的空游戏对象保存着与 UI 有关的脚本。这些脚本包含对 UI 元素的引用,向它们添加侦听器并包含事件调用的方法。
我的做法正确吗?如何改进?
我的 UI 管理器包含这样的脚本:
public class someMenuGUI : MonoBehaviour {
public Button enable;
public void Start()
{
enable.onClick.AddListener(Enable);
}
public voidEnable()
{
GameObject[] Objs = Object.FindObjectsOfType (typeof(GameObject)) as GameObject[];
// then do something on them
};
这是一个非常好的问题,没有可以认为是普遍正确的答案。不过,我想分享一下我的做法。
当我编写 Unity 代码时,我会考虑两类用户:玩家和设计师。从本质上讲,由于几乎所有 Unity 代码都包含在 MonoBehaviours 中,而 MonoBehaviours 在编辑器中使用,因此您一直在为设计师编写一个他们用来实际创建游戏的工具。
即使您没有设计师并且独自工作,以这种方式思考代码也会很有用。这样,代码 space 和编辑器 space 之间就有了明确的区分:代码不必对编辑器中发生的事情做出任何假设;相反,设计师必须能够使用您的组件来构建他们想要的东西。
那么,你的底线在哪里?我认为如果你打算使用 MVC 模式,分离是非常清楚的:控制器逻辑应该包含在代码中,但是实际 UI 元素的连接应该掌握在设计者手中.最后,这让我们看到了代码。
实现 MVC 模式的一个好方法是使用事件而不是实体引用:这样控制器和视图就不必知道彼此的类型,它们只需要知道模型。但是由于您希望设计器在编辑器中连接事件,因此您不能使用 C# 委托事件。值得庆幸的是,Unity 的 UI 系统有一个新功能专门用于此:UnityEvent。
因此,假设您的脚本扮演控制器的角色,必须与视图进行双向通信:从控制器到视图更新信息,从视图到控制器再到运行 用户的操作。事实证明,它的设置非常简单。 Create a public UnityEvent
(with a correct generic argument) for update of the data、public 用户操作方法,代码就完成了!设计师所要做的就是在脚本上设置 Unity 事件以更新 UI,并设置 UI 元素的 Unity 事件以调用控制器的方法。
我正在处理一个 Unity 项目。它是一个可视化软件,所以大部分游戏机制都是基于按钮、滑块、颜色选择器来更新我的 GamesObjects。
我不知道如何组织我的 UI 实施。 将某种 MVC 模式应用到 unity 是个好主意吗,知道怎么做吗(我找到了一些关于它的文章,但我不太清楚)?
目前我正在场景中添加 UI 个元素。一个名为 UIManager 的空游戏对象保存着与 UI 有关的脚本。这些脚本包含对 UI 元素的引用,向它们添加侦听器并包含事件调用的方法。
我的做法正确吗?如何改进?
我的 UI 管理器包含这样的脚本:
public class someMenuGUI : MonoBehaviour {
public Button enable;
public void Start()
{
enable.onClick.AddListener(Enable);
}
public voidEnable()
{
GameObject[] Objs = Object.FindObjectsOfType (typeof(GameObject)) as GameObject[];
// then do something on them
};
这是一个非常好的问题,没有可以认为是普遍正确的答案。不过,我想分享一下我的做法。
当我编写 Unity 代码时,我会考虑两类用户:玩家和设计师。从本质上讲,由于几乎所有 Unity 代码都包含在 MonoBehaviours 中,而 MonoBehaviours 在编辑器中使用,因此您一直在为设计师编写一个他们用来实际创建游戏的工具。
即使您没有设计师并且独自工作,以这种方式思考代码也会很有用。这样,代码 space 和编辑器 space 之间就有了明确的区分:代码不必对编辑器中发生的事情做出任何假设;相反,设计师必须能够使用您的组件来构建他们想要的东西。
那么,你的底线在哪里?我认为如果你打算使用 MVC 模式,分离是非常清楚的:控制器逻辑应该包含在代码中,但是实际 UI 元素的连接应该掌握在设计者手中.最后,这让我们看到了代码。
实现 MVC 模式的一个好方法是使用事件而不是实体引用:这样控制器和视图就不必知道彼此的类型,它们只需要知道模型。但是由于您希望设计器在编辑器中连接事件,因此您不能使用 C# 委托事件。值得庆幸的是,Unity 的 UI 系统有一个新功能专门用于此:UnityEvent。
因此,假设您的脚本扮演控制器的角色,必须与视图进行双向通信:从控制器到视图更新信息,从视图到控制器再到运行 用户的操作。事实证明,它的设置非常简单。 Create a public UnityEvent
(with a correct generic argument) for update of the data、public 用户操作方法,代码就完成了!设计师所要做的就是在脚本上设置 Unity 事件以更新 UI,并设置 UI 元素的 Unity 事件以调用控制器的方法。