From 080c0a58760139ccc6d61cc2535149475ede41f9 Mon Sep 17 00:00:00 2001 From: SDraw Date: Sat, 31 May 2025 23:36:46 +0300 Subject: [PATCH] Avatar as parameter of any animator type --- ml_prm/AvatarBoolParameter.cs | 43 -------------- ml_prm/AvatarParameter.cs | 109 ++++++++++++++++++++++++++++++++++ ml_prm/RagdollController.cs | 7 ++- 3 files changed, 114 insertions(+), 45 deletions(-) delete mode 100644 ml_prm/AvatarBoolParameter.cs create mode 100644 ml_prm/AvatarParameter.cs diff --git a/ml_prm/AvatarBoolParameter.cs b/ml_prm/AvatarBoolParameter.cs deleted file mode 100644 index ee40a63..0000000 --- a/ml_prm/AvatarBoolParameter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using ABI_RC.Core.Util.AnimatorManager; -using System.Text.RegularExpressions; -using UnityEngine; - -namespace ml_prm -{ - class AvatarBoolParameter - { - public readonly string m_name; - public readonly int m_hash = 0; - public readonly bool m_sync; - readonly AvatarAnimatorManager m_manager = null; - - public AvatarBoolParameter(string p_name, AvatarAnimatorManager p_manager) - { - m_name = p_name; - m_manager = p_manager; - - Regex l_regex = new Regex("^#?" + p_name + '$'); - foreach(var l_param in m_manager.Animator.parameters) - { - if(l_regex.IsMatch(l_param.name) && (l_param.type == AnimatorControllerParameterType.Bool)) - { - m_name = l_param.name; - m_sync = !l_param.name.StartsWith('#'); - m_hash = l_param.nameHash; - break; - } - } - } - - public void SetValue(bool p_value) - { - if(m_hash != 0) - { - if(m_sync) - m_manager.SetParameter(m_name, p_value); - else - m_manager.Animator.SetBool(m_hash, p_value); - } - } - } -} diff --git a/ml_prm/AvatarParameter.cs b/ml_prm/AvatarParameter.cs new file mode 100644 index 0000000..1c736b2 --- /dev/null +++ b/ml_prm/AvatarParameter.cs @@ -0,0 +1,109 @@ +using ABI_RC.Core.Util.AnimatorManager; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace ml_prm +{ + class AvatarParameter + { + public readonly string m_name; + public readonly int m_hash = 0; + public readonly bool m_sync; + public readonly AnimatorControllerParameterType m_type; + readonly AvatarAnimatorManager m_manager = null; + + public AvatarParameter(string p_name, AvatarAnimatorManager p_manager) + { + m_name = p_name; + m_manager = p_manager; + + Regex l_regex = new Regex("^#?" + p_name + '$'); + foreach(var l_param in m_manager.Animator.parameters) + { + if(l_regex.IsMatch(l_param.name)) + { + m_name = l_param.name; + m_sync = !l_param.name.StartsWith('#'); + m_hash = l_param.nameHash; + m_type = l_param.type; + break; + } + } + } + + public void SetValue(bool p_value) + { + if(m_hash != 0) + { + if(m_sync) + m_manager.SetParameter(m_name, p_value); + else + { + switch(m_type) + { + case AnimatorControllerParameterType.Bool: + case AnimatorControllerParameterType.Trigger: + m_manager.Animator.SetBool(m_hash, p_value); + break; + case AnimatorControllerParameterType.Int: + m_manager.Animator.SetInteger(m_hash, p_value ? 1 : 0); + break; + case AnimatorControllerParameterType.Float: + m_manager.Animator.SetFloat(m_hash, p_value ? 1f : 0f); + break; + } + } + } + } + + public void SetValue(int p_value) + { + if(m_hash != 0) + { + if(m_sync) + m_manager.SetParameter(m_name, p_value); + else + { + switch(m_type) + { + case AnimatorControllerParameterType.Bool: + case AnimatorControllerParameterType.Trigger: + m_manager.Animator.SetBool(m_hash, p_value > 0); + break; + case AnimatorControllerParameterType.Int: + m_manager.Animator.SetInteger(m_hash, p_value); + break; + case AnimatorControllerParameterType.Float: + m_manager.Animator.SetFloat(m_hash, p_value); + break; + } + } + } + } + + public void SetValue(float p_value) + { + if(m_hash != 0) + { + if(m_sync) + m_manager.SetParameter(m_name, p_value); + else + { + switch(m_type) + { + case AnimatorControllerParameterType.Bool: + case AnimatorControllerParameterType.Trigger: + m_manager.Animator.SetBool(m_hash, p_value > 0f); + break; + case AnimatorControllerParameterType.Int: + m_manager.Animator.SetInteger(m_hash, (int)p_value); + break; + case AnimatorControllerParameterType.Float: + m_manager.Animator.SetFloat(m_hash, p_value); + break; + } + } + } + } + } +} diff --git a/ml_prm/RagdollController.cs b/ml_prm/RagdollController.cs index e9c1f0e..b0331c4 100644 --- a/ml_prm/RagdollController.cs +++ b/ml_prm/RagdollController.cs @@ -1,4 +1,5 @@ using ABI.CCK.Components; +using ABI_RC.Core; using ABI_RC.Core.InteractionSystem; using ABI_RC.Core.Player; using ABI_RC.Systems.IK; @@ -39,7 +40,7 @@ namespace ml_prm readonly List> m_jointAnchors = null; RagdollToggle m_avatarRagdollToggle = null; // Custom component available for editor - AvatarBoolParameter m_ragdolledParameter = null; + AvatarParameter m_ragdolledParameter = null; PhysicMaterial m_physicsMaterial = null; bool m_inAir = false; @@ -299,6 +300,7 @@ namespace ml_prm BipedRagdollReferences l_avatarReferences = BipedRagdollReferences.FromAvatar(PlayerSetup.Instance._animator); m_puppetRoot = new GameObject("Root").transform; + m_puppetRoot.gameObject.layer = CVRLayers.PlayerClone; m_puppetRoot.parent = m_puppet; m_puppetRoot.position = m_avatarTransform.position; m_puppetRoot.rotation = m_avatarTransform.rotation; @@ -370,7 +372,7 @@ namespace ml_prm m_vrIK.onPostSolverUpdate.AddListener(this.OnIKPostSolverUpdate); m_avatarRagdollToggle = PlayerSetup.Instance._avatar.GetComponentInChildren(true); - m_ragdolledParameter = new AvatarBoolParameter("Ragdolled", PlayerSetup.Instance.animatorManager); + m_ragdolledParameter = new AvatarParameter("Ragdolled", PlayerSetup.Instance.animatorManager); m_initTask = StartCoroutine(WaitForBodyHandlers()); } @@ -781,6 +783,7 @@ namespace ml_prm static Transform CloneTransform(Transform p_source, Transform p_parent, string p_name) { Transform l_target = new GameObject(p_name).transform; + l_target.gameObject.layer = CVRLayers.PlayerClone; l_target.parent = p_parent; p_source.CopyGlobal(l_target); return l_target;