单机游戏 界面不多
不要引入UI框架 约束太多 使用起来麻烦 有一定的学习成本
不要给当前的项目引入过多无谓的复杂的东西
单机游戏 界面不多
不要引入UI框架 约束太多 使用起来麻烦 有一定的学习成本
不要给当前的项目引入过多无谓的复杂的东西
创建一个RequestScoreCommand类,用于使view层和service层进行数据交互
public class RequestScoreCommand:Command{
[Inject]
public IScoreService scoreService{get;set;}
public override void Execute(){//数据传输逻辑方法
}
}
使用inject注入时,这个接口是与哪个实现类绑定的,则会注入相应的实现类
我们需要在mediator里触发这个command,所以mediator需要引用,这里依旧使用inject自动注入减少层之间的耦合性
在Context中做的绑定都是全局的,是通过event去调用方法,方法需要是全局的,所以我们这里要用到全局派发器
[Inject(ContextKeys.CONTEXT_DISPATCHER)]//全局的dispatch
public IEventDispatcher dispatcher{get;set;}// IEventDispatcher是接口类型
同样需要设置get、set方法系统内置的command都有绑定event,而我们自己定制command则需要手动写event并绑定
dispatcher.Dispatch(CommandEvent.RequestScore);
Dispatch()可以发起一个event,与之绑定的command会被调用
在command文件夹中创建CommandEvent类,用来保存所有命令的事件,这个event是枚举类型,不需要继承自任何类
public enum CommandEvent{
RequestScoreCommand();//返回数据命令
}
需要在Context中绑定
commandBinder.Bind(CommandEvent.RequestScore).To<RequestScoreCommand>();
service接口与其实现类也需要绑定
injectionBinder.Bind<IScoreService>().To<ScoreService>().ToSingleton();//表示这个对象只会在工程中生成一次
由于是属于inject注入,所以需要使用injectionbinder,并且service和model在工程中只有一个,所以我们需要用ToSingleton将其作为单例
添加
public class RequestScoreCommand:Command{
[Inject]
public IScoreService scoreService{get;set;}
public override void Execute(){
scoreService.RequestScore("xxxx.xxx.xxx");//调用响应方法
}
}
特性绑定
特性标记
挂载的脚本的名称必须和预制体的名称相同。
挂脚本的方式:
1、手动挂到预制体上
2、动态挂脚本
保存预制体和脚本的对应关系
Config配置
3、通过预制体的名字反射出脚本的Type对象
4、自己写特性
主界面 bg+button
确定分辨率 为了以后做适配
800*1280
canvas
screen space overlay
Scale with Screen size
游戏大厂能把小团队给抄死
换皮
一个游戏换十几套UI
UI是最常变幻的东西
这个世界上最不缺的就是NB的想法
cubeview需要与model层交互还需要通过一个脚本控制
创建一个cubemediator
在mediator里对view初始化
mediator里需要对OnRegister与OnRemove重写
在context中对mediator进行绑定
mediationBinder.Bind<CubeView>().To<CubeMediator>();
<>内的是类,()中的是枚举
绑定之后当游戏开始框架会自动将mediator挂载到view所在的游戏物体上
mediator中需要获取到cubeView
[Inject]
public CubeView cubeView{get;set}
[Inject]可以自动帮助开发者注入,减少组件之间的交互
当绑定完成的时候,就会调用mediator里的onregister,当游戏物体被移除时调用onremove,前提是mediator的view是在运行的
把cubeView的初始化放在onregister里
public override void OnRegister(){
cubeView.Init();
}
view只与mediator交互,与之绑定的mediator负责与外界交互
一般情况下,游戏逻辑都是在view层完成,只有当需要储存或读取数据时,才会通过controller层与service和model层交互
是什么层的就以什么层作为文件名结尾
例如:CubeView
视图层需要继承自view类
不要直接覆盖view类的start和awake方法
我们可以创建一个init()方法来跨过start方法初始化物体
始终记住数据应该存放在model层
在To<StartCommand>()后追加.Once()表示这个绑定只使用一次,使用之后就解绑
按照MVCS的模式我们还需要创建model、这里创建一个ScoreModel用于存储数据,不需要继承自任何类,并且给数据设置get set方法
跟外界交互需要用到service,创建service需要两步,一步创建接口,第二步是创建实现接口的类,这样以后如果有新的交互需要添加只需要更改接口即可
创建一个service的接口IScoreService,不需要继承自任何类
接口里有接收分数的方法 void RequestScore();//用于向地址请求分数
int OnReceiveScore();//用于储存返回的分数
void UpdateScore();//用于更新分数,更新到服务器端
创建一个实现接口方法的类ScoreService,由于需要实现接口,则需要继承自IScoreService
目前为止,对此框架完全糊涂,希望后面能听得懂。
Unity 4 到 5 发生的重大改变
Rigidbody组件的获取
GetComponent<Rigidbody>() 要在Start里获取
API 弃用
Application.LoadlLevel("name")
改成:
SceneManager.loadScene("name")
黑暗之光 UICamera.hoverObject==null UIRoot NGUI UGUI
创建一个StartCommand类继承自Command
在Demo1Context中的mapB方法里对StartCommand方法进行绑定
CommandBinder.Bind(ContextEvent.START).To<StartCommand>();
这个方法需要写在model、serivce、command、mediator绑定之后,因为需要先绑定后才能启动
在startcommand中需要重写Execute()方法
public override void Execute(){}
在starcommand被调用的时候会默认调用这个重写方法
讲的真他妈乱。
1.基础知识
2.UI类的实现和关系
3.UI部分渲染规则
4.重建的原理
5.批处理的方式
6.射线的实现
7.填充率
8.UI组件优化点
9.设置上的优化点
10.优化方案实战
Resources.UnloadAsset(item.m_obj); 应该在这样
if (item.m_obj != null)
{
#if UNITY_EDITOR
Resources.UnloadAsset(item.m_obj);
#endif
item.m_obj = null;
}
如果放在下面, 就找不到它的引用了
1 纹理类型设置成normal map unity会自动转换像素 0-1 到 -1到1
2 UnpackNoraml 解压 法线贴图 直接使用
020-AB包
存在三个问题:
(1)数据处理和数据接收放在一起,数据处理完才去接收数据,会造成数据丢失;
(2)数据处理里面有大量拷贝操作,会严重影响性能,应该把数组看成循环队列(处理复杂一些),或者在剩余空间小于某个数值时,startIndex归零,数据处理每次从缓冲区开头开始循环处理;
(3)数据帧没有固定开头和结尾,仅通过长度判断数据是否接收完整,如果数据长度错位了,所有缓冲区中的数据解析就全错了。