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);
 | |
|         }
 | |
|     }
 | |
| } |