using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BITKit.Entities.Physics; using UnityEngine; namespace BITKit.Entities { [CustomType(typeof(IEntityPhysics))] public class EntityPhysics : EntityBehavior,IEntityPhysics { [SerializeField] private Animator animator; [SerializeField] private Rigidbody[] rigidbodies; [SerializeField] private Collider[] ragdollColliders; [SerializeField] private Joint[] joints; [SerializeField] private new Rigidbody rigidbody; [Inject] private IHealth _health; private readonly Dictionary _jointXMotions=new(); private readonly Dictionary _jointYMotions=new(); private readonly Dictionary _jointZMotions=new(); private readonly Dictionary _jointAngularXMotions=new(); private readonly Dictionary _jointAngularYMotions=new(); private readonly Dictionary _jointAngularZMotions=new(); public override void OnAwake() { _health.OnSetAlive += OnSetAlive; _health.OnSetHealthPoint += OnSetHP; foreach (var x in joints) { switch (x) { case ConfigurableJoint configurableJoint: _jointXMotions.Add(configurableJoint,configurableJoint.xMotion); _jointYMotions.Add(configurableJoint,configurableJoint.yMotion); _jointZMotions.Add(configurableJoint,configurableJoint.zMotion); _jointAngularXMotions.Add(configurableJoint,configurableJoint.angularXMotion); _jointAngularYMotions.Add(configurableJoint,configurableJoint.angularYMotion); _jointAngularZMotions.Add(configurableJoint,configurableJoint.angularZMotion); break; } } } private async void OnSetAlive(bool alive) { IsPhysics = !alive; if (animator) animator.enabled = alive; try { await Task.Delay(10, destroyCancellationToken); rigidbodies.ForEach(x => { x.isKinematic = alive; }); ragdollColliders.ForEach(x => { x.enabled = !alive; }); OnSetPhysics?.Invoke(!alive); } catch (OperationCanceledException) { } foreach (var joint in joints) { switch (joint) { case ConfigurableJoint configurableJoint: configurableJoint.xMotion = alive ? _jointXMotions[joint] : ConfigurableJointMotion.Free; configurableJoint.yMotion = alive ? _jointYMotions[joint] : ConfigurableJointMotion.Free; configurableJoint.zMotion = alive ? _jointZMotions[joint] : ConfigurableJointMotion.Free; configurableJoint.angularXMotion = alive ? _jointAngularXMotions[joint] : ConfigurableJointMotion.Free; configurableJoint.angularYMotion = alive ? _jointAngularYMotions[joint] : ConfigurableJointMotion.Free; configurableJoint.angularZMotion = alive ? _jointAngularZMotions[joint] : ConfigurableJointMotion.Free; break; } } } public void OnSetHP(int hp) { } public Vector3 Center => rigidbody.worldCenterOfMass; public bool IsPhysics { get; private set; } public Vector3 Velocity { get=>rigidbody.velocity; set { foreach (var x in rigidbodies) { x.velocity = value; } } } public Action OnSetPhysics { get; set; } public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force) { foreach (var x in rigidbodies) { x.AddForce(force, mode); } } public void AddTorque(Vector3 torque, ForceMode mode = ForceMode.Force) { foreach (var x in rigidbodies) { x.AddTorque(torque, mode); } } } }