AgentSystem的使用

AgentSystem功能概述

AgentSystem是3D能力平台基于NLua开发出来的一个组件化Lua-C#交互框架,在这个框架中一个最小的交互单元称为Agent。一个Agent可以同时拥有多种C#组件能力。在Lua层可以通过配置对Agent所拥有的C#组件进行修改和添加。C#组件派生AgentComponentBase,组件因此被称为AC。

编写组件类

一个AgentComponent类要能在Lua层被Agent所使用,必须满足以下几点要求:

  1. 类的定义在AgentSystemExtension命名空间下。
  2. 必须派生自AgentComponentBase
  3. 类的命名需要以AgentComponent_开始
  4. 拥有一个无参构造函数(基类中已经定义,无特殊情况无需复写)
  5. 类的可见性需要是public

例子:

using AgentSystem;

namespace AgentSystemExtension
{
    public class AgentComponent_VLabTest:AgentComponentBase
    {
        //AgentComponentBase提供的生命周期回调

        public override void Awake()
        {
            UnityEngine.Debug.Log("组件生命周期:Awake");
        }

        public override void OnStart()
        {
            UnityEngine.Debug.Log("组件生命周期:Start");
        }

        public override void OnDestroy()
        {
            UnityEngine.Debug.Log("组件生命周期:OnDestroy");
        }

        //提供给lua层的AC接口
        public void Test(string id,string path)
        {

        }
    }
}

Agent配置说明

  1. 配置AgentClassConfig.xml
    每个Agent都需要配置在AgentClassConfig.xml文件里面,对于器材来说,该文件就放在器材的目录下面。

配置模板

<AgentCofig>
    <Agent agentClassname="ElementAgent" >
        <AgentComponent name="AgentSystemExtension.AgentComponent_Creator"/>
        <AgentComponent name="AgentSystemExtension.AgentComponent_Transform"/>
        <AgentComponent name="AgentSystemExtension.AgentComponent_VLabChangeModel"/>
    </Agent>
</AgentCofig>

上面配置为名称为ElementAgent的Agent添加了Creator、Transform、VLabChangeModel 三个AC组件。

  1. 在lua脚本中编写、创建Agent
--在脚本中创建与Agent同名的表
ElementAgent = inheritsFrom(LabBaseAgent:New())

--创建
function ElementAgent:Create(guid,paramsTable)
    --通过New方法实例化一个Agent
    local obj = ElementAgent:New()
    obj:Init(paramsTable)
    return obj
end

function ElementAgent:Init()
    --使用之前配置好的AC中的接口
    local vec3 = obj.Transform:GetPosition()
end

在AgentComponent中访问Agent

AgentComponentBase中的Owner就是Lua的Agent在C#层的实例,通过Agent类就可以获取LuaAgent中的一些数据,下面是Agent中常用字段的说明:

字段 说明
id 器材id
agentObj 器材所对应的物体GameObject
insXTable Agent的lua表在C#层的映射,保存在XLua.LuaTable中
insTable Agent的lua表在C#层的映射,保存在NLua.LuaTable中,NLua已经过时,请使用insXTable代替。

通过AgentSystem查找Agent

有些时候我们想从组件类的外部获取器材Agent,这时候可以使用AgentManager类中的成员接口获取,AgentManager的实例缓存在AgentSystem中,而AgentSystem实例缓存在AgentSystem.singleton这个静态变量中。通过下面的代码获取AgentManager实例:
AgentManager agentMgr = AgentSystem.AgentSystem.singleton.manager;
得到AgentManager之后就可以获取Agent了,以下列出AgentManager中用来获取Agent的不同接口,可以根据自己当前上下文选择合适的接口。

接口 说明
GetAgentById 通过Agent的实体Id(与Agent.id获取到的一致)获取Agent对象
GetAgentByObj 通过Agent所控制的GameObject获取Agent对象
GetAgentByObjByTag 通过器材的guid获取Agent
GetAgentByObjName 通过器材名称获取Agent,需要注意的是当场景中存在多个同名器材时,获取到的Agent将不是准确的。

Lua层的Agent

AgentSystem为Lua层的Agent也提供一系列接口和字段,用于访问C#。

接口 说明
New() 实例化该Agent并返回对象
AddComponent(cmpName) 为Agent动态添加组件,参数传入完整组件名称
Destroy() 销毁一个Agent,
字段 说明
AGENT_CSHARP C#层Agent在lua层的映射,可以借此访问Agent中的字段方法,实现在Lua层操作器材GameObject
AGENT_NAME Agent的名称
AGENT_NETID 器材entityId