From 31c2d141a7e71ff1966a266cc963c57a52e7b9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Fri, 6 Oct 2023 07:52:13 +0200 Subject: [PATCH] character controller fixes to handle missing expressions, root bone and mixamo model setup --- .../character_controller.lua | 65 ++++++++++--------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/Content/scripts/character_controller/character_controller.lua b/Content/scripts/character_controller/character_controller.lua index b464db482..2f0584cc7 100644 --- a/Content/scripts/character_controller/character_controller.lua +++ b/Content/scripts/character_controller/character_controller.lua @@ -374,24 +374,6 @@ local function Character(model_name, start_position, face, controllable, anim_sc self.right_foot = humanoid.GetBoneEntity(HumanoidBone.RightFoot) self.left_toes = humanoid.GetBoneEntity(HumanoidBone.LeftToes) self.right_toes = humanoid.GetBoneEntity(HumanoidBone.RightToes) - - -- Create a base capsule collider if it's not yet configured for character: - -- It will be used for movement logic and GPU collision effects - if scene.Component_GetCollider(entity) == nil then - local collider = scene.Component_CreateCollider(entity) - collider.SetCPUEnabled(false) - collider.SetGPUEnabled(true) - collider.Shape = ColliderShape.Capsule - collider.Radius = 0.3 - collider.Offset = Vector(0, collider.Radius, 0) - collider.Tail = Vector(0, 1.4, 0) - local head_transform = scene.Component_GetTransform(self.head) - if head_transform ~= nil then - collider.Tail = head_transform.GetPosition() - end - end - self.collider = entity - break end end @@ -407,6 +389,25 @@ local function Character(model_name, start_position, face, controllable, anim_sc end end + -- Create a base capsule collider if it's not yet configured for character: + -- It will be used for movement logic and GPU collision effects + if scene.Component_GetCollider(self.humanoid) == nil then + local collider = scene.Component_CreateCollider(self.model) + self.collider = self.model + collider.SetCPUEnabled(false) + collider.SetGPUEnabled(true) + collider.Shape = ColliderShape.Capsule + collider.Radius = 0.3 + collider.Offset = Vector(0, collider.Radius, 0) + collider.Tail = Vector(0, 1.4, 0) + local head_transform = scene.Component_GetTransform(self.head) + if head_transform ~= nil then + collider.Tail = head_transform.GetPosition() + end + else + self.collider = self.humanoid + end + self.root = scene.Entity_FindByName("Root", self.model) self.anims[States.IDLE] = scene.RetargetAnimation(self.humanoid, animations.IDLE, false, anim_scene) @@ -500,14 +501,16 @@ local function Character(model_name, start_position, face, controllable, anim_sc -- Blend to current mood, blend out other moods: local expression = scene.Component_GetExpression(self.expression) - for i,preset in pairs(Mood) do - local weight = expression.GetPresetWeight(preset) - if preset == self.mood then - weight = math.lerp(weight, self.mood_amount, 0.1) - else - weight = math.lerp(weight, 0, 0.1) + if expression ~= nil then + for i,preset in pairs(Mood) do + local weight = expression.GetPresetWeight(preset) + if preset == self.mood then + weight = math.lerp(weight, self.mood_amount, 0.1) + else + weight = math.lerp(weight, 0, 0.1) + end + expression.SetPresetWeight(preset, weight) end - expression.SetPresetWeight(preset, weight) end -- state and animation update @@ -867,11 +870,13 @@ local function Character(model_name, start_position, face, controllable, anim_sc -- Offset root transform to lower foot pos: local root_bone_transform = scene.Component_GetTransform(self.root) - root_bone_transform.ClearTransform() - local root_pos = root_bone_transform.GetPosition() - root_bone_transform.Translate(Vector(0, self.root_bone_offset)) - --DrawDebugText(self.root_bone_offset, self.position, Vector(1,1,1,1), 0.1, DEBUG_TEXT_CAMERA_FACING) - --DrawPoint(vector.Add(root_pos, Vector(0, self.root_bone_offset)), 0.1, Vector(1,0,0,1)) + if root_bone_transform ~= nil then + root_bone_transform.ClearTransform() + local root_pos = root_bone_transform.GetPosition() + root_bone_transform.Translate(Vector(0, self.root_bone_offset)) + --DrawDebugText(self.root_bone_offset, self.position, Vector(1,1,1,1), 0.1, DEBUG_TEXT_CAMERA_FACING) + --DrawPoint(vector.Add(root_pos, Vector(0, self.root_bone_offset)), 0.1, Vector(1,0,0,1)) + end -- Remove IK effectors by default: if scene.Component_GetInverseKinematics(self.left_foot) ~= nil then