课程链接:https://learn.u3d.cn/tutorial/framework_design_trail#611a4b9d7c7ccd001f70ab97
泛型事件
在昨天的笔记中,我们用两个事件来实现了事件的触发,我们可以看到这两个事件的方法都是一样的,只有名字不一样,就其结构来说是有冗余的,所以我们用泛型+继承来进行改善。
新建一个Event类型的脚本,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Event<T> where T : Event<T>//继承自己,这里涉及到泛型和泛型约束的知识点
{
private static Action mOnEventTrigger;
public static void Register(Action onEvent)
{
mOnEventTrigger += onEvent;
}
public static void UnRegister(Action onEvent)
{
mOnEventTrigger += onEvent;
}
public static void Trigger()
{
mOnEventTrigger?.Invoke();
}
}
写完之后我们需要到两个事件脚本中去继承,但是静态类是不能继承的,所以需要把static修饰符去掉,然后把里面包含的方法都去掉,具体改动点如下:
-删掉静态修饰符
-继承泛型
-删除里面包含的方法
用泛型Event代替两个Event之后的架构如下图所示:
数据和表现分离
常见的开发机构是MVC架构,我们先用Model进行改造,新建一个名为GameModel的脚本,然后我们将其简化以下称为以下的架构图:
这里还存在一个问题:游戏结束的条件不应该在enemy的脚本中去判断,我们希望game节点可以判断这个逻辑,这里需要由子节点enemy向Game父节点进行通信。
新建一个事件用来监听是否有敌人被消灭,在enemy中进行调用,在Game中进行监听。现在就做到了数据和表现分离、单一职责原则。
总结:通常来说,我们使用事件的时候需要涉及到三个部分,一个event脚本,一个发布脚本,一个订阅脚本。
MVC
交互逻辑 & 表现逻辑
以下伪代码展示了表现逻辑和交互逻辑的区别
交互:输入、操作
表现:展现数据
很多时候MVC架构不会被完整应用,一般只需要用表现(View)和数据(Model)分离即可。
一般view和modal难以区分或者单独再写一个脚本比较浪费的时候就用Controller。