Files
Cielonos/Assets/Scripts/MainGame/Characters/Base/Subcontrollers/LandMovementSubcontroller.cs
SoulliesOfficial d94241f36c 场景设计
2026-01-12 03:22:16 -05:00

137 lines
4.6 KiB
C#

using System;
using DG.Tweening;
using SLSFramework.General;
using UnityEngine;
using UnityEngine.AI;
namespace Cielonos.MainGame.Characters
{
public partial class LandMovementSubcontroller : MovementSubcontrollerBase
{
protected AnimationSubcontrollerBase animationSc => owner.animationSc;
protected Animator animator => animationSc.animator;
protected 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;
bool isHorizontalMoving = horizontalMovement.magnitude > 0.1f * DeltaTime;
animator.SetBool(Animator.StringToHash("IsHorizontalMoving"), isHorizontalMoving);
}
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);
}
}
}