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;
}