AC.ConstraintCtrl

约束组件(AgentComponent_VLabConstraintCtrl)

1、初始化

int Init(string path)

简要说明

约束组件初始化,path的路径为空时,表示根节点。传入的路径与检测的范围有关系,详见第2点的检测范围

参数

参数名 类型 说明
path string 路径

返回值

类型 说明
int id

2、检测跟随物

void ScanConstraintObject(int id, float length, float width, float height, string mode, bool isSpecifyTag = false, bool isCompatible = true)

注意

该方法不是实时检测的,只有调用该方法才会去检测

简要说明

扫描立方体范围内的物体,标记为跟随物。标记后,默认不启用跟随。若需要跟随,需调用SetActive函数,详见第3点

参数

参数名 类型 说明
id int 实例id
length float 长度
width float 宽度
height float 高度
mode string 跟随模式(parent、position、rotation)
isSpecifyTag bool 是否检测带有被约束物体Tag的对象(详见第5点)
isCompatible bool 两种检测模式是否兼容(详见第5点)
跟随模式
  • parent
    位移与旋转,类似父子节点
  • position
    位移跟随(仅位移)
  • rotation
    旋转跟随(仅旋转)
检测范围
  • 跟随物体的扫描范围与Init函数传入的路径有关,该路径指向的节点为扫描起点
  • 检测范围在扫描起点的正上方【length * width * height】范围内(ps:长宽高的是在扫描起点默认缩放为1的情况下的数值),对扫描起点的缩放、旋转,扫描范围也会产生对应的变化
  • 具体范围可以调用DebugMode函数查看,详见第四点
  • 如果无法跟随,请检查跟随物体的Collider,是否在扫描的范围内

void ScanConstraintObject(int id, float radius, float height, string mode, bool isSpecifyTag = false, bool isCompatible = true)

注意

该方法不是实时检测的,只有调用该方法才会去检测

版本

【2020/11/2】

简要说明

扫描圆柱范围内的物体,标记为跟随物。标记后,默认不启用跟随。若需要跟随,需调用SetActive函数,详见第3点【圆形的检测范围较矩形的检测范围更加消耗性能,建议尽量使用矩形的检测范围】

参数

参数名 类型 说明
id int 组件id
radius float 长度
height float 高度
mode string 跟随模式(parent、position、rotation)
isSpecifyTag bool 是否检测带有被约束物体Tag的对象(详见第5点)
isCompatible bool 两种检测模式是否兼容(详见第5点)
跟随模式
  • parent
    位移与旋转,类似父子节点
  • position
    位移跟随(仅位移)
  • rotation
    旋转跟随(仅旋转)
检测范围
  • 跟随物体的扫描范围与Init函数传入的路径有关,该路径指向的节点为扫描起点
  • 检测范围在扫描起点的正上方【半径为 radius, 高度为height的圆柱】范围内(ps:半径、高的是在扫描起点默认缩放为1的情况下的数值),对扫描起点的缩放、旋转,扫描范围也会产生对应的变化
  • 具体范围可以调用DebugMode函数查看,详见第四点
  • 如果无法跟随,请检查跟随物体的Collider,是否在扫描的范围内

int[] ScanObject(int id, float radius, float height, bool isSpecifyTag = false, bool isCompatible = true)

简要说明

检测圆柱形范围内的元器件(但不进行约束操作),返回entityID List。使用方法同上

int[] ScanObject(int id, float length, float width, float height, bool isSpecifyTag = false, bool isCompatible = true)

简要说明

检测长方形范围内的元器件(但不进行约束操作),返回entityID List。使用方法同上

3、组件启用与移除

void SetActive(int id, bool b)

简要说明

设置组件启用与禁用

参数

参数名 类型 说明
id int 组件id
b bool 是否启用

void RemoveConstraint(int id)

简要说明

移除组件

参数

参数名 类型 说明
id int 组件id

4、调试

void DebugMode(int id, float length, float width, float height)

简要说明

调试模式(立方体范围)。调用该函数,可以查看扫描的范围(非必须调用),传入的长、宽、高必须与扫描的长宽高一致。注意调试完成注意注释调试的代码

参数

参数名 类型 说明
id int 组件id
length float 长度
width float 宽度
height float 高度

void DebugMode(int id, float radius, float height)

版本

【2020/11/2】

简要说明

调试模式(圆柱范围)。调用该函数,可以查看扫描的范围(非必须调用),传入的半径、高必须与扫描的长宽高一致。注意调试完成注意注释调试的代码

参数

参数名 类型 说明
id int 组件id
radius float 半径
height float 高度

5、标记对象

void MarkConstrainedObject(int entityId, string path)

简要说明

标记被约束对象。

  • 当ScanConstraintObject函数中的isSpecifyTag为true,此时如果某个元器件被标记,则只会检测该元器件的某个特定Collider(通过path参数指定)
  • 当ScanConstraintObject函数中的isCompatible为false时,只会检测被标记为被约束对象的元器件
  • 调用该函数无需初始化

参数

参数名 类型 说明
entityId int 实例id
path string Collider路径(调用ScanConstraintObject函数时,检测的对象),一个元器件只能设置一个路径

void MarkJointParentObject(int entityId)

简要说明

标记被拼接对象,被标记的对象会在被约束物体移动时更新拼接状态。由于拼接关系会改变,该函数最好在开始约束或者拼接状态改变时调用。该函数会遍历约束物体下所有节点查找拼接父物体。对于节点较多的物体,开销会比较大。

参数

参数名 类型 说明
entityId int 实例id

void MarkJointParentObject(int entityId, string path, bool isClearCache = true)

简要说明

标记被拼接对象,被标记的对象会在被约束物体移动时更新拼接状态。由于拼接关系会改变,该函数最好在开始约束或者拼接状态改变时调用。该函数会在指定节点查找拼接父物体。

参数

参数名 类型 说明
entityId int 实例id
path string 路径
isClearCache bool 是否清空拼接物体缓存(默认true)

6、获取被约束对象

void int[] GetConstrainedObjectList(int id)

简要说明

获取当前被约束对象ID

参数

参数名 类型 说明
id int 组件id

返回值

类型 说明
int[] 元器件entityId数组

7、修改约束组件更新时机

约束组件默认在LateUpdate中更新,可通过下列函数修改更新时机

public enum UpdateMode
{
      Update = 0,
    FixedUpdate = 1,
    LateUpdate = 2
}

void AddConstrainedObjectUpdateTime(int entityId, string updateMode)

简要说明

添加一个更新时机

参数

参数名 类型 说明
entityId int 元器件ID
updateMode string 更新时机

void RemoveConstrainedObjectUpdateTime(int entityId, string updateMode)

简要说明

移除一个更新时机

参数

参数名 类型 说明
entityId int 元器件ID
updateMode string 更新时机

8、例子

--初始化
function XiaoMuBanAgent:Init(paramsTable)
    self.VLabConstraintCtrl:Bind(self.entityId)
    self.COnsId = self.VLabConstraintCtrl:Init(EmptyChildPath)        --初始化传入路径
    self.VLabConstraintCtrl:DebugMode(self.COnsId, 0.2, 0.2, 0.2)    --开启调试模式(可不调用)(仅需调用一次)
    self:InitActionValues()
end

-- 在移动物体时扫描该物体的正上方范围内的物体,并启用跟随
function XiaoMuBanAgent:OnBeginMove()
    self.VLabConstraintCtrl:ScanConstraintObject(self.COnsId, 0.2, 0.2, 0.2, "parent")    --检测跟随物体
    self.VLabConstraintCtrl:SetActive(self.COnsId,true)                -- 启用跟随
end

-- 标记被约束物
self.VLabConstraintCtrl:MarkConstrainedObject(entityId, "GameObjScale/MeshPoint/suliaobei1/suliaobei_lod0")

-- 标记被拼接物体
self.VLabConstraintCtrl:MarkJointParentObject(self.entityId)

-- 修改Transform更新时机
self.VLabConstraintCtrl:RemoveConstrainedObjectUpdateTime(self.entityId, "LateUpdate")
self.VLabConstraintCtrl:AddConstrainedObjectUpdateTime(self.entityId, "FixedUpdate")

-- 获取当前被约束对象
local list = self.VLabConstraintCtrl:GetConstrainedObjectList(self.COnsId)