using System; using DG.Tweening; using UnityEngine; using UnityEngine.AI; namespace Cielonos.MainGame.Characters { public partial class LandMovementSubcontroller : MovementSubcontrollerBase { protected AnimationSubcontrollerBase animationSc => owner.animationSc; protected Animator animator => animationSc.animator; public virtual void OnAnimatorMove() { if (owner.animationSc.isDuringRootMotion) { UpdateRootMotionMovement(); } else { UpdateRegularMovement(); } ApplyGravity(); UpdateFinalMovement(); } protected virtual void Update() { isOnGround = groundDetector.DetectGround(); } } public partial class LandMovementSubcontroller { } public partial class LandMovementSubcontroller { void UpdateRootMotionMovement() { Quaternion originalDeltaRotation = animator.deltaRotation; characterTransform.rotation *= originalDeltaRotation; Vector3 originalDeltaPosition = animator.deltaPosition; Vector3 localDeltaPosition = characterTransform.InverseTransformDirection(originalDeltaPosition); Vector3 adjustedLocalDeltaPosition = new Vector3(localDeltaPosition.x * rootMotionMoveXMultiplier, localDeltaPosition.y, localDeltaPosition.z * rootMotionMoveZMultiplier); Vector3 adjustedDeltaPosition = characterTransform.TransformDirection(adjustedLocalDeltaPosition); if (isDashing || isDodging) { Vector3 deltaPosition = adjustedLocalDeltaPosition; deltaPosition.z *= isDashing ? dashMoveMultiplier : dodgeMoveMultiplier; horizontalMovement = characterTransform.TransformDirection(deltaPosition); } else { horizontalMovement = adjustedDeltaPosition; } verticalMovement = animator.deltaPosition.y * rootMotionMoveYMultiplier; if ( /*!player.statusModule.CanMove ||*/ animationSc.isDisablingMoveXZ) { horizontalMovement = Vector3.zero; } if (animationSc.isDisablingMoveY) { verticalMovement = 0; } } private void UpdateRegularMovement() { horizontalMovement = targetDirection.normalized * (moveSpeed * DeltaTime); } protected void ApplyGravity() { if (!isApplyingGravity || isJumping || groundDetector.isOnGround) { gravitationalMovement = Vector3.zero; return; } gravitationalMovement += (40f * Vector3.down * DeltaTime) * DeltaTime; } protected virtual void UpdateFinalMovement() { horizontalMovement.y = 0; initiativeMovementVelocity = horizontalMovement + new Vector3(0, verticalMovement, 0); Vector3 jumpMove = new Vector3(0, jumpVelocity * DeltaTime, 0); owner.additionalForceSm.Update(owner.attributeSm["ImpactResistance"]); Vector3 forceMove = owner.additionalForceSm.additionalForceXZ.currentValue * DeltaTime; finalMovementVelocity = initiativeMovementVelocity + forceMove + jumpMove + gravitationalMovement; } protected virtual void InitiativeMove() { if (owner.collisionSc.useCharacterController) { owner.collisionSc.characterController.Move(finalMovementVelocity + movementModifier); } else { Vector3 startPosition = owner.collisionSc.mainRigidbody.position; owner.collisionSc.mainRigidbody.MovePosition(startPosition + finalMovementVelocity + movementModifier); } } } public partial class LandMovementSubcontroller { private void OnDrawGizmos() { float groundedOffset = groundDetector?.groundedOffset ?? 0.05f; float groundedRadius = groundDetector?.groundedLength ?? 0.1f; Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position - new Vector3(0, groundedOffset, 0), groundedRadius); } } }