ZECS Unity脚本框架简介(3)——API说明与使用

先上类图



主要接口类说明:

ZEntity:实体类,它不支持继承,类似于Unity的GameObject,它需要通过EntityPool进行创建以及实例化。

ZComponent:组件类,用于封装实体的行为以及对外提供的功能等,它实现了IZComponent接口,用户定义新的组件只需要从其进行继承就可以。

ZSystem:系统类,用于封装业务或者游戏的控制逻辑,它实现了IZSystem,可以理解为功能抽象类,它负责对系统的各个实体进行调度来完成一项系统功能,同时它也负责处理用户交互信息,比如建立Unity中的UGUI系统与底层实体类的通信桥梁。这里一般使用事件触发机制/反射处理等机制。

EntityPool:对象池类,它用于创建实体,在Editor中可以定义好实体的模板(这里模板的定义类型Unity的Prefab),以ID为做为实体的唯一标识,在Runtime阶段,开发通过EntityPool的CreateEntity方法根据ID找到相应的实体模板,以其为参考进行实体对象的实例化操作。同时System在框架内部就是一个实体,只不过它是一单体,并在系统初始化阶段就自动创建出来。

每个类的详细接口、属性说明还是参考Github上的代码说明

https://github.com/bennychao/ZECS

例子说明

一个例子帮助大家理解类之间如何进行运用,比如一个FPS游戏中一个敌人Tank被攻击的场景,会有Unity的场景中定义一个Tank的GameObject或者Prefab做为展示,会绑定上Unity提供的一些内置组件(这里不是指ZECS的组件),比如BoxCollider负责检测子弹被击中,这些定义好的也就是我们前两节所说的View层。然后再定义一个名为ZTank实体,并定义一个Blood的组件,绑定到ZTank上,它负责血量的计算。最后定义一个控制类TankController,它从Zsystem继承。

当Tank被攻击时,其BoxCollider中的OnCollisionEnter中调用TankController,由它再进行处理,根据子弹类型等(这里的子弹也是一个实体),Tank的装甲,计算血量值,然后调用Tank的Blood组件,完成掉血的操作,最终会把伤害值反馈给View层,展示最终的掉血或者死亡效果。

这里View层与System层进行交互可以使用其它更加高效的方式,比如Bolt,这里可以把对Bolt进行扩展定义一些给View使用的System结点。Bolt负责View层的简单展示逻辑,比如掉血效果的展示等,另外就是通过Bolt支持的事件/触发器关联相应的System结点。有关Bolt的使用请参考Unity 可视化脚本 Bolt插件 使用评测

再比如就是使用UniRX,你能想到所有Unity里的事件,它也都定义好了,可以直接在System层中进行使用。这里为了保持框架的一致性,UniRX的使用应该只限于System层中。

ZECS自带功能说明

为了方便开发使用,ZECS除了基本的框架结构,也提供好了一些现成的组件。

自带Component组件:

AutoCreateSupport:添加其之后,会在系统初始化阶段进行自动实例化。

ReusableSupport:添加其之后,即支持内存再利用,以优化GC。对于系统中有同类型的大量的需要动态创建的实体对象,可以使用它。

SingletonEntity<T>:单体定义,使用它对组件的访问,只会唯一实例化一个对象,保证系统内这有一个绑定了T组件的实体对象。后的Sample代码就有说明。

ZTransformComponent:用于支持带有坐标的实体类,封装了一些有关Transform相关的操作。

自带System组件:

StartEventSystem/StopEventSystem:OnExecute会在整个ZECS框架初始化之后进行调用,即已经实例化了自启动对象以它调用了其对应的OnStart初始化函数。相应的结束事件也是类型的。


ZECS扩展编辑支持

为了方便开发时ZECS框架的使用,自然扩展编辑器功能是少不了的。还是先看下扩展界面。可以给一个GameObject对象添加EntityPoolConfig脚本。点击右侧属性页中的EditButton,就会显示出实体池编辑界面。


这里实体池的操作界面,用于定义实体模板,以及实体类间的层次关系,实体是支持无限层次的子实体的,实体在创建时,其子实体会被自动创建。相应的功能可以查看功能栏上各个Button。其中实体项上还会显示当前实体Component的个数。

选择一个实体项之后,右边属性页用于显示当前实体的信息,包括:实体名、组件个数、以及组件的信息。这里可以添加/删除组件操作,并对组件的属性进行修改。实体模板的属性会在Runtime阶段,实例化该实体时,自动序列化到新的实体中。

Demo代码:

 
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ZECS;

public class TestUser : MonoBehaviour {

	private EntityPool pool;
	// Use this for initialization
	void Start () {
		pool = EntityPoolBuilder.FindByName ("TestPool");

		ZEntity en = pool.CreateEntity (1);

		Debug.Log (" en data is " + en.GetComponent<TestComponent4> ().data4.ToString ());

		//test singleton
		TestSingleton test = SingletonEntity<TestSingleton>.Instance;

		if (test != null)
			Debug.Log (" SingletonEntity data is " + test.data2.ToString ());
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

根据实体池的名称获取实体池对象,再调用它根据实体池编辑器定义的模板,找到你想创建的实体,根据ID或者实体名创建对应的实体。Demo链接:https://github.com/bennychao/ZECS

上一篇 《ZECS Unity脚本框架简介(1)——什么是ECS》


猜你喜欢

转载自blog.csdn.net/feibin2013/article/details/80115655