1.数据,逻辑 一定要和 视图分离 2. 视图里面处理视图自己的逻辑,算视图部分 3.生命周期的东西不要用异步,尽量一条同步的生命周期。可以减少未知麻烦的bug。逻辑部分就可以直接设置数据,不用过多异常检测。 4.视图直接依赖数据,状态类的视图可以用在一个循环里检测数据状态是否发生变化,从而去改变视图。
5.数据、逻辑部分 生命周期一定不要有异步。因为视图和逻辑部分之间依赖数据,异步的话可能还得等待处理 太麻烦 还容易出错。一般生命周期不要过多。 Spawned (从对象池获取) Init (初始化) Despawn (放入对象池) Destroy (销毁)
一个单位分为两个部分。 第一部分:数据、逻辑。我们就叫它单位 第二部分:视图 视图一般只负责这个单位自身的状态,所以可以当做它和外界隔离,又因为他处理的东西比较销毁,所以他可以异步处理。 数据和逻辑组成的单位。在创建和销毁时,直接处理,不要有异步存在。也不要有批量异步处理。因为其他逻辑可能需要依赖它,他是对其他单位开放的。 简单创建一个单位, 这种方式数据、控制器、视图都在一个地方创建。没有异步处理,对于同时创建很多单位是不合适的 public Unit Create(UnitData unitData) { Unit unit = new Unit(); unit.unitData = unitData; unit.unitCtl = new UnitCtl(); unit.unitAgent = new UnitAgent(); unit.Init(); } 按照上面的方式,异步批量创建多个单位,虽然可以解决同时创建多个对象卡帧问题,但是浅藏着很大的风险。比如正常情况下其他逻辑需要调用这个单位,可是这个单位还在等待创建。 public List<UnitData> waitInstalList = new List<UnitData>(); public IEnumerator CreateUnitList(List<UnitData> datas) { int i = 0; while(datas.Count > 0) { Create(datas[0]); dates.RemoveAt(0); i ++; if(i >= 3) { yield return new WaitForEndOfFrame(); i = 0; } } } 比较好的方式是控制器和视图分别创建,控制器同步创建,视图异步创建。(这里简单写一下,创建对象没用工厂,对象池。这里没有处理单位已销毁视图不创建) public void CreateUnitList(List<UnitData> datas) { List<Unit> units = new List<Unit>(); for(int i = 0; i < datas.Count; i ++) { units.Add(CreateUnit(datas[i])); } } public IEnumerator CreateAgentList(List<Unit> units) { int num = 0; for(int i = 0; i < units.Count; i ++) { CreateAgent(units[i]); num ++; if(num >= 3) { yield return new WaitForEndOfFrame(); num = 0; } } } public Unit CreateUnit(UnitData unitData) { Unit unit = new Unit(); unit.unitData = unitData; unit.unitCtl = new UnitCtl; unit.Init(); AddUnit(unit); return unit; } public UnitAgent CreateAgent(unit) { unit.unitAgent = new UnitAgent(); AddAgent(unit.unitAgent ); return unit.unitAgent; }