using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Gallop { public class CySpringDataContainer : MonoBehaviour { public List collisionParam; public List springParam; public List ConnectedBoneList; public bool enableVerticalWind; public bool enableHorizontalWind; public float centerWindAngleSlow; public float centerWindAngleFast; public float verticalCycleSlow; public float horizontalCycleSlow; public float verticalAngleWidthSlow; public float horizontalAngleWidthSlow; public float verticalCycleFast; public float horizontalCycleFast; public float verticalAngleWidthFast; public float horizontalAngleWidthFast; public bool IsEnableHipMoveParam; public float HipMoveInfluenceDistance; public float HipMoveInfluenceMaxDistance; public List DynamicBones = new List(); private void Awake() { //InitializePhysics(); } public void InitializePhysics() { DynamicBones.Clear(); List gameObjects = new List(); gameObjects.AddRange(transform.parent.transform.parent.GetComponentsInChildren()); foreach (CySpringCollisionData collider in collisionParam) { if (collider._isInner) continue; var bone = gameObjects.Find(a => { return a.name == collider._targetObjectName; }); if (bone) { var child = new GameObject(collider._collisionName); child.transform.SetParent(bone); child.transform.localPosition = Vector3.zero; child.transform.localRotation = Quaternion.identity; child.transform.localScale = Vector3.one; switch (collider._type) { case CySpringCollisionData.CollisionType.Capsule: var dynamic = child.AddComponent(); dynamic.ColliderName = collider._collisionName; child.transform.localPosition = (collider._offset + collider._offset2) / 2; child.transform.LookAt(child.transform.TransformPoint(collider._offset2)); dynamic.m_Direction = DynamicBoneColliderBase.Direction.Z; dynamic.m_Height = (collider._offset - collider._offset2).magnitude + collider._radius; dynamic.m_Radius = collider._radius; dynamic.m_Bound = collider._isInner ? DynamicBoneColliderBase.Bound.Inside : DynamicBoneColliderBase.Bound.Outside; break; case CySpringCollisionData.CollisionType.Sphere: var Spheredynamic = child.AddComponent(); Spheredynamic.ColliderName = collider._collisionName; child.transform.localPosition = collider._offset; Spheredynamic.m_Radius = collider._radius; Spheredynamic.m_Height = collider._distance; Spheredynamic.m_Bound = collider._isInner ? DynamicBoneColliderBase.Bound.Inside : DynamicBoneColliderBase.Bound.Outside; break; case CySpringCollisionData.CollisionType.Plane: var planedynamic = child.AddComponent(); planedynamic.ColliderName = collider._collisionName; child.transform.localPosition = collider._offset; planedynamic.m_Bound = collider._isInner ? DynamicBoneColliderBase.Bound.Inside : DynamicBoneColliderBase.Bound.Outside; break; case CySpringCollisionData.CollisionType.None: break; } } } gameObjects.Clear(); gameObjects.AddRange(transform.parent.transform.parent.GetComponentsInChildren()); foreach(CySpringParamDataElement spring in springParam) { var bone = gameObjects.Find(a => { return a.name == spring._boneName; }); if (bone) { bool isTail = gameObject.name.Contains("tail");//The tail needs less traction var dynamic = gameObject.AddComponent(); dynamic.m_Root = bone; dynamic.m_UpdateMode = DynamicBone.UpdateMode.Normal; dynamic.m_Gravity = new Vector3(0, Mathf.Clamp01(-30 / spring._gravity), 0); if (isTail) { dynamic.m_Damping = 0.1f; dynamic.m_Stiffness = Mathf.Clamp01(10 / spring._stiffnessForce); dynamic.m_Elasticity = Mathf.Clamp01(10 / spring._dragForce); } else { dynamic.m_Damping = 0.2f; dynamic.m_Stiffness = Mathf.Clamp01(40 / spring._stiffnessForce); dynamic.m_Elasticity = Mathf.Clamp01(40 / spring._dragForce); } dynamic.m_Radius = spring._collisionRadius; dynamic.SetupParticles(); DynamicBones.Add(dynamic); foreach (string collisionName in spring._collisionNameList) { var tmp = gameObjects.Find(a => { return a.name == collisionName; }); if (tmp) { dynamic.Particles[0].m_Colliders.Add(tmp.GetComponent()); } } foreach (CySpringParamDataChildElement Childcollision in spring._childElements) { var tempParticle = dynamic.Particles.Find(a => { return a.m_Transform.gameObject.name == Childcollision._boneName; }); if (tempParticle != null) { tempParticle.m_Damping = 0.2f; if (isTail) { tempParticle.m_Damping = 0.1f; tempParticle.m_Stiffness = Mathf.Clamp01(10 / spring._stiffnessForce); tempParticle.m_Elasticity = Mathf.Clamp01(10 / spring._dragForce); } else { tempParticle.m_Damping = 0.2f; tempParticle.m_Stiffness = Mathf.Clamp01(40 / spring._stiffnessForce); tempParticle.m_Elasticity = Mathf.Clamp01(40 / spring._dragForce); } tempParticle.m_Radius = Childcollision._collisionRadius; foreach (string collisionName in Childcollision._collisionNameList) { var tmp = gameObjects.Find(a => { return a.name == collisionName; }); if (tmp) { tempParticle.m_Colliders.Add(tmp.GetComponent()); } } } } } } } public void EnablePhysics(bool isOn) { foreach(DynamicBone dynamic in DynamicBones) { if (!dynamic.m_Root.name.Contains("Ear")) { dynamic.enabled = isOn; } } } public void EnableEarPhysics(bool isOn) { foreach (DynamicBone dynamic in DynamicBones) { if (dynamic.m_Root.name.Contains("Ear")) { dynamic.enabled = isOn; } } } } }