这次的笔记是看了凉鞋的课程做的课堂笔记,课程链接如下:https://learn.u3d.cn/tutorial/framework_design_trail#611a49ebacab1e002045f5c4
基本的游戏流程
要实现的功能
开始主菜单点击开始游戏
点击中物体之后跳转到游戏通关页面
项目实现
游戏中的对象:
Panel:
GameStart
GamePass
Enemy
变量赋值:
给游戏开始的按钮添加两个事件:点击之后GameStart的panel的isActive为false,Enemy的isActive为true;
游戏脚本:
//点击之后物体销毁
public GameObject GamePassPanel;//在Inspector窗口中进行赋值即可
private static int enemyKilledCount;//这里的static不可以省略
private void OnMouseDown()
{
Destroy(gameObject);
enemyKilledCount++;
if(enemyKilledCount==10)
{
GamePassPanel.SetActive(true);
}
}
static的含义:Static variables are said to belong to the "class" and non-static (member variables) are said to be long to an "object" (an instance of a class type).
树结构
上述游戏项目的结构如图:
有三个缺点:
难以维护
团队协作差
不具有可扩展性
解决方式就是低耦合高内聚,低耦合就是要尽量少的出现对象和类的双向引用、循环引用,同时要做到模块化。
对象之间交互的方法:
方法调用
委托或者回调
消息或者事件
模块化也有三种:
单例
IOC:Extenject、uFrame的Container、StrangeIOC的绑定
分层:MVC、三层、领域驱动
还有Entity Component、门面模式
使用委托或回调
上述的项目的交互只用到了方法调用,没有使用任何模块化的方式。
方法调用中,类需要引用方法,所以会增加耦合程度。
如果子节点想调用父节点,那么可以使用委托或者回调。
我们可以在上述的文件中新增一个脚本挂载在panel上,脚本如下:
用这种方式,我们可以使用UI的父节点来完成互相的引用和调用,下图展示了我们改进前后的架构图对比。
使用事件
使用委托和事件之后的结构图:
总结一下三种交互方式的区别:
Tips:获取根节点:SceneManager.GetActiveScene().GetRootGameObject()