You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.4 KiB
C#
205 lines
6.4 KiB
C#
using Entitas;
|
|
using UnityEngine;
|
|
using Game;
|
|
|
|
public class MoveSystemFixed : IExecuteSystem, IInitializeSystem
|
|
{
|
|
private IGroup<GameEntity> _entities;
|
|
|
|
public void Initialize()
|
|
{
|
|
_entities = Util.GetGroup(GameMatcher.Move);
|
|
}
|
|
|
|
public void Execute()
|
|
{
|
|
foreach (var entity in _entities)
|
|
{
|
|
if (Util.IsPause(entity))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var move = entity.move;
|
|
|
|
GravityUpdate(entity.move);
|
|
|
|
if (!Util.EntityIsStagger(entity)) //硬直状态无法主动移动和跳跃
|
|
{
|
|
if (move.StepType == EMovestepType.None)
|
|
{
|
|
JumpUpdate(move); //更新跳跃
|
|
}
|
|
|
|
var timelineRunning = entity.hasTimeline && entity.timeline.IsRunning;
|
|
if (!timelineRunning || move.IsSlide)
|
|
MoveUpdate(move); //更新移动
|
|
}
|
|
|
|
if (move.StepType != EMovestepType.None && entity.hasSkill)
|
|
{
|
|
SkillMoveUpdate(entity); //更新技能位移
|
|
}
|
|
|
|
if (!(move.StepType == EMovestepType.SetSpeed || move.MoveDir.magnitude == 0))
|
|
SpeedLimit(move); //速度限制
|
|
|
|
FallUpdate(move); //下落
|
|
}
|
|
}
|
|
|
|
private void MoveUpdate(MoveComponent move)
|
|
{
|
|
if (move.IsWalk && !move.IsAgainstWall)
|
|
{
|
|
move.Rigidbody.AddForce(move.MoveDir * move.MoveParam.MoveForce);
|
|
}
|
|
}
|
|
|
|
private void SkillMoveUpdate(GameEntity entity)
|
|
{
|
|
var move = entity.move;
|
|
|
|
var skillCastDir = entity.skill.CastDir;
|
|
|
|
var adjustAngel = move.IsRight ? 0f : 180f;
|
|
if (skillCastDir.x != 0 || skillCastDir.z != 0)
|
|
{
|
|
adjustAngel = Vector3.Angle(Vector3.right, new Vector3(skillCastDir.x, 0, skillCastDir.z));
|
|
adjustAngel *= skillCastDir.z > 0 ? -1 : 1;
|
|
}
|
|
|
|
var moveValue = Quaternion.AngleAxis(adjustAngel, Vector3.up) * move.StepValue;
|
|
switch ((int)move.StepType)
|
|
{
|
|
case (int)EMovestepType.AddForce:
|
|
move.Rigidbody.AddForce(moveValue * (1 + move.TempMoveForceScale));
|
|
break;
|
|
case (int)EMovestepType.SetSpeed:
|
|
move.Rigidbody.velocity = moveValue;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void SpeedLimit(MoveComponent move)
|
|
{
|
|
var speedXZ = new Vector3(move.Velocity.x, 0, move.Velocity.z);
|
|
var speedXMax = move.MoveParam.MoveSpeedMax * (1 + move.MoveSpeedScale);
|
|
if (!move.IsGround)
|
|
{
|
|
speedXMax *= move.MoveParam.AirSpeedMaxRate;
|
|
}
|
|
|
|
if (speedXZ.magnitude > speedXMax)
|
|
{
|
|
var speedXMaxVec = speedXZ.normalized * speedXMax;
|
|
move.Velocity = new Vector3(speedXMaxVec.x, move.Velocity.y, speedXMaxVec.z);
|
|
}
|
|
}
|
|
|
|
private void GravityUpdate(MoveComponent move)
|
|
{
|
|
var mass = move.Rigidbody.mass;
|
|
var force = Vector3.down * move.MoveParam.Gravity * 10f * mass;
|
|
move.Rigidbody.AddForce(force);
|
|
}
|
|
|
|
private void FallUpdate(MoveComponent move)
|
|
{
|
|
if (!move.IsGround && move.Velocity.y < 0)
|
|
{
|
|
var mass = move.Rigidbody.mass;
|
|
var force = Vector3.down * move.MoveParam.FallForce * mass;
|
|
move.Rigidbody.AddForce(force);
|
|
}
|
|
|
|
if (move.Position.y < 0)
|
|
{
|
|
move.Position = new Vector3(move.Position.x, 0, move.Position.z);
|
|
}
|
|
}
|
|
|
|
private void JumpUpdate(MoveComponent move)
|
|
{
|
|
var addForce = false;
|
|
var dt = Time.fixedDeltaTime;
|
|
var forceScale = 1f;
|
|
|
|
move.IsSkillAble = true;
|
|
switch ((int)move.JumpState)
|
|
{
|
|
case (int)EJumpState.OnGround:
|
|
move.Rigidbody.drag = move.MoveParam.GroundDrag;
|
|
if (move.IsJumpCommand)
|
|
{
|
|
move.JumpTimeNow += dt;
|
|
addForce = true;
|
|
move.JumpState = EJumpState.LeavingGround;
|
|
}
|
|
|
|
if (!move.IsGround)
|
|
{
|
|
move.JumpState = EJumpState.InAir;
|
|
}
|
|
|
|
break;
|
|
case (int)EJumpState.LeavingGround:
|
|
addForce = true;
|
|
move.Rigidbody.drag = move.MoveParam.AirDrag;
|
|
move.IsSkillAble = false;
|
|
if (!move.IsGround)
|
|
{
|
|
move.JumpState = EJumpState.InAir;
|
|
}
|
|
|
|
break;
|
|
case (int)EJumpState.InAir:
|
|
move.Rigidbody.drag = move.MoveParam.AirDrag;
|
|
if (!move.IsJumpPressed)
|
|
{
|
|
move.IsJumpCommand = false;
|
|
}
|
|
|
|
if (move.IsJumpCommand)
|
|
{
|
|
var jumpTimeNow = move.JumpTimeNow + dt;
|
|
var isMinJump = jumpTimeNow <= move.MoveParam.JumpTimeMin;
|
|
var isMaxJump = jumpTimeNow >= move.MoveParam.JumpTimeMax && move.IsJumpPressed;
|
|
if (isMinJump)
|
|
{
|
|
move.IsSkillAble = false;
|
|
}
|
|
|
|
if (isMinJump || isMaxJump)
|
|
{
|
|
move.JumpTimeNow = jumpTimeNow;
|
|
addForce = true;
|
|
}
|
|
|
|
if (isMaxJump)
|
|
{
|
|
var addForceTimeLeft = move.MoveParam.JumpTimeMax - jumpTimeNow;
|
|
forceScale = addForceTimeLeft / dt;
|
|
forceScale = Mathf.Min(forceScale, 1);
|
|
}
|
|
}
|
|
|
|
if (move.IsGround)
|
|
{
|
|
move.JumpTimeNow = 0;
|
|
move.IsJumpCommand = false;
|
|
move.Velocity = new Vector2(move.Velocity.x, 0);
|
|
move.Position = move.GroundPosition;
|
|
move.JumpState = EJumpState.OnGround;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
var velocity = move.Velocity;
|
|
if (addForce)
|
|
{
|
|
move.Velocity = new Vector3(velocity.x, move.MoveParam.JumpForce * forceScale, velocity.z);
|
|
}
|
|
}
|
|
} |