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 : EntityComponent,IEntityPhysics, IHealthCallback { [SerializeField] private Animator animator; [SerializeField] private Rigidbody[] rigidbodies; [SerializeField] private Collider[] ragdollColliders; [SerializeField] private new Rigidbody rigidbody; private CancellationToken _cancellationToken; public override void OnAwake() { entity.RegisterCallback(this); _cancellationToken = entity.Get(); } async void IHealthCallback.OnSetAlive(bool alive) { IsPhysics = !alive; if (animator) animator.enabled = alive; try { await Task.Delay(10, _cancellationToken); rigidbodies.ForEach(x => { x.isKinematic = alive; }); ragdollColliders.ForEach(x => { x.enabled = !alive; }); OnSetPhysics?.Invoke(!alive); } catch (OperationCanceledException) { } } 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); } } } }