器材联合交互基类框架

  • 基类文件名: UnionInteractBaseLogic.lua

  • 该基类包含了通用交互能力的几乎所有新交互,即所有交互都是基于交互能力基础之上。



1. 交互能力json文件配置 ———— InteractAbilityConfig.json

  self.interactFilePath = self.luaFilePath .. “/InteractAbilityConfig.json”
  self.VLabInterenceAbility:SetInteractAttrbute(“INTERACT_CONFIG_PATH”, self.interactFilePath)

该字段路径配置在元器件脚本中,放在LabCreate()之前

2. 交互能力脚本初始化

  • self.VLabInterenceAbility:AddInteractAbility(“UnionInteract”)
  • self.VLabInterenceAbility:SetStateCallBack(xxxAgent.OnAddState,xxxAgent.OnRemoveState)
    注意: 注册状态回调只能在基类注册,否则会影响基类回调事件。因为改接口重复注册会覆盖前面注册事件
  • self.VLabInterenceAbility:SetInteractAttrbute(“LUA_OBJECT_UUID”,tostring(self.realAgent:GetEntityId()))—传入GUID

    使用说明:该方法需要在移动交互初始化之后,化学交互基本由基类初始化,物理或者化学特殊元器件需要自己初始化交互能力需要调用方法: self:NewInteractAbitilyInit()

3. 拼接组件

  该组件不需要初始化只需要在InteractAbilityConfig.json 文件中配置交互点以及对应规则.
具体的配置字段请参考组件WiKi:
http://wiki.doc.101.com/index.php?title=%E8%99%9A%E6%8B%9F%E5%AE%9E%E9%AA%8C%E5%AE%A4-%E5%85%AC%E5%85%B1%E7%BB%84%E4%BB%B6%E5%92%8C%E5%BC%95%E6%93%8E%E6%B1%87%E6%80%BB

对应回调:

只拼不接对应回调:

对应相关接口(该接口也可以处理该基类其他涉及到的组件)

  • 后续补充对应接口以及基类回调处理的逻辑

4. 倾倒组件

  倾倒组件需要配置并绑定 self:BindPourComponnent()—该接口不需要自己配置,在化学交互基类会根据配置进行初始化
    对应配置表:
注意:容器自动倾倒能力以及倾倒交互都该配置在UnionInteractAbility.json
对应配置例子:
对应回调以及相关接口

5.夹取组件

  夹取类似拼接需要在交互文件中配置规则,几乎所有交互都需要在交互的json文件中配置,后续不再说明,夹取组件分为三种:

  • 夹取元器件
  • 夹取容器
  • 释放容器(一平二放三竖直)

    对应回调以及相关接口定义:

6. 舀取组件

舀取组件跟夹取结构类似但是他需要初始化组件(这里只介绍容器方,舀取方请参考药匙)
self:BindScoopedComponnent()
对应配置

舀取也有对应的一平二放三竖直动画,对应定义:

  1. self.SetScoopAni = true
  2. self.clamp_CONTAINERHEIGHT = containerHeight

7. 冲洗组件

 对应回调
  AddSlicedFunction
  AddWashedFunction
  RemoveWashFunction
  RemoveWashedFunction

8. 切割组件

9. 摩擦组件

10.漏液组件

--漏液组件
function UnionInteractBaseLogic:BindDirpComponent()
    self.VLabInterenceAbility:AddInteractAbility("Dirp")
      self.VLabInterenceAbility:SetInteractAttrbute("DIRP_MIN_ANGLE",self.realAgent.ChemistyInteract["Dirp"]["MinAngle"])
    self.VLabInterenceAbility:SetInteractAttrbute("DIRP_SWITCH",true)
    self.VLabInterenceAbility:SetInteractAttrbute("DIRP_WATER_PATH",self.realAgent.ChemistyInteract["Dirp"]["DirpPath"])
    --self.VLabInterenceAbility:RegisterEvent("DIRP_COLLIDER_JJD",self.realAgent.Collider)
    self.VLabInterenceAbility:RegisterEvent("DIRP_HUO_POSITION",self.realAgent.DirpHuoPosition)
end

--修改是否为点燃状态
function UnionInteractBaseLogic:DirpHuoBurn(isBurn)
    isBurn = isBurn == true and true or false
    self.realAgent.VLabInterenceAbility:SetInteractAttrbute("DIRP_HUO_BURN",isBurn)
end

  对应回调:self:DirpHuoPosition()

11.搅拌组件

--搅拌组件
function UnionInteractBaseLogic:InitStirComponnent()
    self.VLabInterenceAbility:Bind(self.entityId)
    self.VLabInterenceAbility:AddInteractAbility("Stir",nil)
    self.VLabInterenceAbility:SetInteractAttrbute("STIR_SPEED", self.realAgent.ChemistyInteract["Stir"]["stirSpeed"])
    self.VLabInterenceAbility:SetInteractAttrbute("STIR_TIME", self.realAgent.ChemistyInteract["Stir"]["stirTime"])
    self.VLabInterenceAbility:RegisterEvent("STIR_SUCCESS_EVENT", self.realAgent.OnStirSuccess)
    self.VLabInterenceAbility:RegisterEvent("STIR_BEGIN_EVENT", self.realAgent.OnStirBegin)
    self.VLabInterenceAbility:RegisterEvent("STIR_END_EVENT", self.realAgent.OnStirEnd)
end

  对应回调:
    self:OnStirSuccess()
    self:OnStirSuccess()
    self:OnStirSuccess()

12.引流组件

--引流组件
function UnionInteractBaseLogic:InitDrainageComponnent()
    self.VLabInterenceAbility:Bind(self.entityId)
    self.VLabInterenceAbility:AddInteractAbility("Drainage",nil)
    self.VLabInterenceAbility:SetInteractAttrbute("DRAINAGE_TRANSLATETYPE",self.realAgent.ChemistyInteract["Drainage"]["drainageType"])
    self.VLabInterenceAbility:RegisterEvent("DRAINAGE_BEGIN_EVENT", self.realAgent.OnDrainageBegin)
    self.VLabInterenceAbility:RegisterEvent("DRAINAGE_END_EVENT", self.realAgent.OnDrainageEnd)

    self.realAgent.ChemistyInteract["Drainage"]["Speed"] = tonumber(self.realAgent.ChemistyInteract["Drainage"]["Speed"]) or 1.0
    self.VLabInterenceAbility:EmitEvent("DRAINAGE_SPEED_EVENT", self.realAgent.ChemistyInteract["Drainage"]["Speed"])
end

--修改引流开关
function UnionInteractBaseLogic:SwitchDrainageOpen(isOpen)
    isOpen = isOpen == true and true or false
    self.VLabInterenceAbility:EmitEvent("DRAINAGE_ONOFF_EVENT", isOpen)
end

--修改引流速度
function UnionInteractBaseLogic:ChangeDrainageSpeed(speed)
    speed = tonumber(speed) or 0.3
    self.VLabInterenceAbility:EmitEvent("DRAINAGE_SPEED_EVENT", speed)
end

13.吸取组件

--被吸取
function UnionInteractBaseLogic:BindDropperedComponent()
    self.VLabInterenceAbility:RegisterEvent("DROP_ENTER_CONTAINERI_LEVEL", self.realAgent.OnDroppered)
end

function UnionInteractBaseLogic:OnDroppered()
    self.realAgent.isDroppered = true
    self:OnDropperedCallBack()
end

function UnionInteractBaseLogic:OnDropperedCallBack()
end

14.对齐组件

对应相关事件(对齐只需在json文件里配置)
———当前是否是在对齐范围内退出
function UnionInteractBaseLogic:RegisterAlignEvent()
self.VLabInterenceAbility:RegisterEvent(“LEAVE_IN_BOUNDS”,function(self,isAlignState)
self:ListenAlignState(isAlignState)
end)
end

---当前是否是在对齐范围内退出
---@param isAlignState boolean
function UnionInteractBaseLogic:ListenAlignState(isAlignState)
end

---对齐检测方式切换接口
---bCheckType   true:视觉检测  false:碰撞检测
function UnionInteractBaseLogic:ChangeAlginCheckType(bCheckType)
    self.VLabInterenceAbility:SetInteractAttrbute("VISION_CHECK", bCheckType)
end

15. 摇晃组件

--绑定摇晃
function UnionInteractBaseLogic:BindShakeComponnent()
    self.VLabInterenceAbility:AddInteractAbility("Shake")
    self.VLabInterenceAbility:RegisterEvent("SHAKE_SUCCESS_EVENT", self.realAgent.OnShakeSuccess)  --摇晃可复写
    if self.ChemistyInteract["ShakeSet"] then
        if self.ChemistyInteract["ShakeSet"]["Speed"] then
            self.VLabInterenceAbility:SetInteractAttrbute("SHAKE_SPEED", self.ChemistyInteract["ShakeSet"]["Speed"])
        end
        if self.ChemistyInteract["ShakeSet"]["Time"] then
            self.VLabInterenceAbility:SetInteractAttrbute("SHAKE_TIME", self.ChemistyInteract["ShakeSet"]["Time"])
        end
    end
end

力学交互的表现,统一处理逻辑


力学静态处理
  1. PHYSICSGRAVITY: 针对物理元器件是否需要使用基类统一处理力学问题
  2. 基类原理:通过配置各种类型的交互表,把各种交互状态填进表内,通过遍历表内状态来进行对力学静态的管理
  3. ReSetEulerAngleBaseFun():拼接交互,取消状态时,基类会重置元器件角度(针对pc)。若有特殊需求不重置角度可以设置字段self.NotUseBaseInteractReSetAngles = true
  4. OnBasePSVRConstraints()psvr 下夹持状态禁止旋转
  5. OnBaseEnableGravityMoveEnd()为了某些交互(舀取动画,夹取动画,倾倒等)不能立即开启重力