【临时笔记】单位设计感悟

| 发布     | 分类 游戏感悟  | 标签 感悟 
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;
}

上一篇: 【临时笔记】属性设计感悟
下一篇: EdrawMax for mac亿图图示专家 V8.4最新免费版