讨论游戏逻辑与Unity scipting的分离

时间:2018-02-20 01:50:47

标签: unity3d

如果这是这个问题的错误论坛,请指导我找到正确的论坛。

我正在学习Unity,我一直在努力遵循整体分离关注架构模式,比如MVC,并让我的游戏单元可测试。我一直在尝试遵循MVC-ish模式,我的Unity对象是我的视图,我的游戏逻辑在我的模型类中。

例如,对于我的玩家角色,我认为Unity对象是我的“视图”,并且我附加了PlayerCharacterScriptPlayerMovementScript。它们都是Mono-Behaviour派生类,它们实现特定于Unity的行为,例如确定用户点击移动的位置以及在用户受到损害时播放动画。

然后我有一个Player类(我的“模型”),它具有游戏逻辑,例如当玩家低于0生命值时导致玩家死亡。当需要视觉回复的播放器发生某些事情时,Player类会调用Action OnDeathPlayerCharacterScript正在侦听。然后PlayerCharacterScript播放死亡动画作为回应。

理论上这很好用,模型类很容易进行单元测试。我的问题是,在实践中,同步模型和视图(MonoBehaviour s)被添加到场景并来回发送消息变得非常烦人。例如,如果我在Unity编辑器中将Goblin预制件拖入我的场景中,那么当游戏开始时,该妖精的MonoBehaviour需要创建其对应的Goblin模型,将该模型添加到“场景管理器”类,并将Goblin对象设置为MonoBehaviour的模型。

然而,在“场景管理器”类的游戏逻辑中,我想在场景中创建一个小妖精以响应某些动作。由于这是游戏逻辑,它将成为模型类的一部分(而不是MonoBehaviour)。在那种情况下,我首先创建模型,然后我必须使用其关联的MonoBehaviour创建预制件,将其添加到场景中,并使用MonoBehaviour注册该模型。

现在我遇到了有时MonoBehaviour创建模型的情况,有时模型会创建预制/ MonoBehavior。我还必须记住,每次我创建任何类型的新游戏对象预制件时,我都必须在其中放置一些样板代码,以便Unity对象创建其模型。另一个问题是,如果需要调用MonoBehaviourAwake方法,我的模型无法创建派生自Start的新对象,因为这在单位期间不起作用测试

追求这种模型/视图架构似乎变得比它的价值更麻烦,并且将所有内容(包括游戏逻辑)放在MonoBehaviour中会更容易。

我已经四处寻找有关此主题的建议,我发现的所有内容都是关于如何使游戏逻辑单元可测试的一些帖子,但它们都没有解决代码变得多乱的问题如果平台的设计不考虑显示逻辑和游戏逻辑的分离,那么Unity就不会出现。

我很想听听任何有经验的Unity开发人员是否应该继续将这种游戏逻辑从Unity逻辑中分离出来,或者它是否最终不值得。

1 个答案:

答案 0 :(得分:1)

第一个MonoBehaviour是您的逻辑而不是您的结构的地方

对于结构使用ScriptableObject,可编写脚本的对象非常方便,可以将其视为游戏对象(单声道行为),无需转换,无需启动,更新,唤醒等等,只需数据模型和......就像您可以添加的任何类一样功能,但Unity自动调用的任何功能。

例如

[CreateAssetMenu(menuName = "Custom Objects/SimpleObject")]
public class SimpleObject : ScriptableObject
{
    public float myData;
    public GameObject someReference;
    public Vector3 someMoreData;
}

现在,您可以从游戏逻辑的“控制器”中单独定义游戏“模型”吗? ......一款游戏不能完全融入MVC或MVVC范例,但并不意味着你不能通过它来改进你的游戏结构。

关于使用像这样的ScriptableObjects有一个很好的讨论,它确实突出了它在促进可测试的模块化游戏结构中的用途。 https://www.youtube.com/watch?v=raQ3iHhE_Kk

我们(异教工程)也开发了一个基于这些概念的框架......但我不会在这里自我宣传,如果你想了解更多信息,请给我留言。