using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; namespace BITKit.Entities.Movement { [CustomType(typeof(IEntityMovement))] public class RigidbodyBasedMovement : StateBasedBehavior,IEntityMovement { [SerializeField] private new Rigidbody rigidbody; [SerializeField] private Animator animator; [SerializeField] private bool allowRootMotion; public Vector3 Position { get; set; } public Quaternion Rotation { get; set; } public Vector3 Forward { get; } public Vector3 ViewForward { get; } public Vector3 ViewCenter { get; } public Vector3 FocusPoint { get; } public Quaternion ViewRotation { get; } public Vector3 LocomotionBasedVelocity { get; } public Vector3 Velocity { get;private set; } public Vector3 GroundVelocity { get; } public Vector3 AngularVelocity { get; } public bool IsGrounded { get; } [Inject(true)] private IHealth health; public void SyncMovement(Vector3 velocity, Vector3 position, Quaternion rotation, bool isGrounded) { } public void Movement(Vector3 relativeVector) { } public void Movement(InputAction.CallbackContext context) { } public void ExecuteCommand(T command = default) { } public event Action OnCommand; public override void OnAwake() { base.OnAwake(); if (health is not null) { health.OnSetAlive += OnSetAlive; } } private void OnSetAlive(bool obj) { rigidbody.isKinematic = !obj; } public override void OnFixedUpdate(float deltaTime) { rigidbody.MovePosition(rigidbody.position + Velocity * deltaTime ); } private void OnAnimatorMove() { if (allowRootMotion) Velocity = animator.velocity; } } }