器材框架介绍

这次主要来介绍器材开发中的重中之重—-器材代码的编写。这里不会进行太过详细的讲解,只是带领大家了解以下整个lua代码的框架,以及各个部分的作用和一些关键的接口,具体的代码实现细节,还是需要各位自行阅读源码进行了解。

1.器材结构图

2.lua-C#通信框架—AgentSystem(NLua)

  • AgentSystem做了什么
    1. 为lua提供了一个新的关键字agent其语法为:agent JiQiPingAgent = {}
      这是一种类似lua中的local关键字用于标记本地变量一样的功能。或者说agent类似C#中的类,代码agent JiQiPingAgent = {}是声明了一个继承了agent类的类。agent类中定义了一个构造方法 New(),通过JiQiPing:New()来实例化一个agent。
    2. 将C#组件(AgentComponent)加载到agent中
      在lua中声明的每一个agent,都需要在对应的AgentClassConfig.xml文件中配置对应组件能力。一般该文件都与lua文件在相同的目录下面。具体的配置方式请参考器材组件能力配置文件
    3. 为agent新增OnUpdate()方法
      AgentSystem会在unity在Update()中每帧调用agent:OnUpdata(deltaTime)
      在器材中重新定义该方法,即可以使用unity中的update。
      需要注意的是,如果无需使用update,请删除该方法,避免性能的浪费。
    4. 在全局变量中添加对应unity中的类和接口。
      在lua中只要通过luanet将对应的类导入,即可使用。

      目前虚拟实验室中只使用到了以上几个类。

3.器材核心代码库—VLabCommonLua

  • 用途
    该代码库用于存放器材基础通用逻辑代码,基本包括了整个器材的框架代码,器材的通用逻辑和接口大部分都在该代码库中实现,接下来分文件夹进行讲解
  • Agent文件夹
    用于存放通用agent脚本,目前使用到的文件只有ChemistryStepAgent.lua,其他的文件是历史遗留下来的,可以不用关注
    ChemistryStepAgent文件是虚拟实验室中的步骤判定功能控制脚本。
  • Base文件夹
    用于存放器材的基类逻辑脚本和一个工具类,下面将分类对其中的文件进行介绍
核心类

该类脚本对于整个框架来说是比不可少的,可以说没有它们,器材就没法使用

文件名 功能说明
LabControlAgent.lua 场景,器材控制脚本,在场景运行时首先加载。会首先对整个lua环境进行初始化。并且负责器材的创建。
LabElemenetManager.lua 器材管理脚本,其中保存着场景中已经创建的所有器材,负责维护器材序列化,反序列化的逻辑。
BaseAgent.lua 所有器材的通用逻辑脚本文件,包括器材的初始化,提供了器材整个生命周期的所以事件,以及跟器材UI相关的代码
学科通用逻辑类

该类脚本主要是各个学科的器材通用逻辑,一般一个器材在继承了BaseAgent之后,会根据所属器材的学科不同再继承1个到多个的学科通用逻辑类

文件名 功能说明
MagneticElementBaseLogic.lua 磁学基类
MechanicsElementBaseLogic.lua 旧版力学基类
CircuitElementBaseLogic.lua 电学基类
ForceElementBaseLogic.lua 新版力学基类
StaticElectricityElementBaseLogic.lua 静电基类
器材交互相关

器材与器材,器材本身都存在着很多种不同的交互,这些交互大多由C#层提供对应的组件,而以下的脚本会将这些组件进行再一次的封装。

文件名 功能说明
UnionInteractBaseLogic.lua 器材联合交互基类框架,该基类是对C#层联合交互框架的再一次封装,其中包含了非常多的交互事件。
ClampMgr.lua 舀取交互管理类
JointMgr.lua 拼接交互管理类
DropperMgr.lua 滴取交互管理类
化学相关

不同于其他学科的基类只是提供了对应的功能接口。化学的基类框架还承包了多种交互的初始化,化学容器的初始化,以及数据处理等功能,因此代码较多。

文件名 功能说明
ChemistryContainerBaseLogic.lua 化学容器基类
ChemistryFiredBaseLogic.lua 化学火焰基类
ChemistryContainerManager.lua 化学容器管理类
ChemistryInteractBaseLogic.lua 化学交互基类,继承了该基类,就会默认绑上对应的交互
工具类—ToolClass

ToolClass.lua文件中预先准备好了一系列函数接口,在阅读其他脚本前推荐先阅读该文件,会对之后的了解有帮助

  • Common文件夹
    该文件夹中的脚本,定义和实现了一系列全局函数。其中包括实现了一套消息订阅-接受机制,一个json数据解析工具,一套位运算函数,以及一系列功能函数
    在阅读其他文件之前,推荐先了解该文件夹中的方法的使用

  • Components文件夹
    该文件夹中存放的是使用lua组件框架编写的组件。对于组件的使用和编写可以查阅一种lua中组件框架的实现

4.器材通用逻辑代码库—VLabElementBase

该代码库中主要存放某类元器件的基类,比如多种规格的烧杯为了代码简洁因此编写了一个通用逻辑基类。
还有就是一些lua枚举定义文件会放在该库中

5.新手推荐,框架代码阅读顺序

初步了解器材框架代码,可以按照以下顺序阅读代码,有助于理解。

  1. VLabCommonLua-Logic-Game.lua
    作为lua代码的入口,从这里开始阅读会比较轻松

  2. VLabCommonLua-Common文件夹
    Game.lua文件会首先加载Common文件夹中的脚本,阅读该部分,能首先对整个lua框架有一个初步的认识

  3. VLabCommonLua-Base-LabControlAgent.lua & LabElementManager.lua

  4. VLabCommonLua-Base-BaseAgent.lua

5.器材加载时序图