unity wasd控制人物移动,不需要转身
在Unity开发中,实现使用WASD键控制人物移动且不转身是一个常见需求。本文将详细介绍实现这一功能的具体过程,核心思路是通过WASD键获取行走方向,进而控制角色的位移。
1. 定义角色状态枚举变量
首先,我们需要定义一个枚举变量来表示角色可能的状态。以下是具体代码:
public enum ActionState
{
Attack_1,
Attack_2,
Attack_3_1,
Attack_3_2,
Attack_3_3,
Attack_4,
Fire,
Jump,
Run,
Idle
}
private ActionState actionState = ActionState.Idle;
在这段代码中,我们定义了一个名为ActionState的枚举类型,包含了角色可能处于的各种状态,如攻击、开火、跳跃、奔跑和闲置等。同时,我们初始化了一个actionState变量,默认状态为Idle(闲置)。
2. 实现动画播放函数
接下来,我们需要实现一个Animate函数,该函数的作用是根据角色的当前状态播放对应的动画。代码如下:
void Animate()
{
float delayTime = -0.1f;
switch (actionState)
{
case ActionState.Attack_3_1:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-1", 0.15f);
currentAnimationClip = playerAnimation["Attack3-1"].clip;
break;
case ActionState.Attack_3_2:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-2", 0.15f);
currentAnimationClip = playerAnimation["Attack3-2"].clip;
break;
case ActionState.Attack_3_3:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-3", 0.15f);
currentAnimationClip = playerAnimation["Attack3-3"].clip;
break;
case ActionState.Attack_4:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack4", 0.15f);
currentAnimationClip = playerAnimation["Attack4"].clip;
break;
case ActionState.Idle:
playerAnimation.CrossFade("Idle", 0.35f);
currentAnimationClip = playerAnimation["Idle"].clip;
break;
case ActionState.Jump:
playerAnimation.CrossFade("Jump", 0.15f);
currentAnimationClip = playerAnimation["Jump"].clip;
break;
case ActionState.Run:
playerAnimation.CrossFade("Run", 0.15f);
currentAnimationClip = playerAnimation["Run"].clip;
break;
case ActionState.Fire:
playerAnimation.CrossFade("Fire", 0.15f);
currentAnimationClip = playerAnimation["Fire"].clip;
break;
default:
break;
}
// 若动画即将结束,切换到默认状态
if (playerAnimation[currentAnimationClip.name].time > (playerAnimation[currentAnimationClip.name].length + delayTime))
{
actionState = ActionState.Idle;
currentAnimationClip = playerAnimation["Idle"].clip;
}
}
在这个函数中,我们使用switch语句根据actionState的值来选择播放相应的动画。同时,我们还添加了一个判断条件,当动画即将结束时,将角色状态切换为Idle(闲置)。
3. 在Update函数中添加逻辑
在Unity中,Update函数会在每一帧被调用。我们需要在这个函数中添加对应的逻辑,以实现角色的移动和动画播放。代码如下:
// Update is called once per frame
void Update ()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
MovementManagement (h, v);
Animate ();
}
在Update函数中,我们通过Input.GetAxis方法获取水平和垂直方向的输入值,然后调用MovementManagement函数处理角色的移动,最后调用Animate函数播放相应的动画。
4. 实现移动管理函数
MovementManagement函数的作用是根据用户的输入处理角色的行走。代码如下:
void MovementManagement(float horizontal, float vertical)
{
if(horizontal != 0f || vertical != 0f)
{
Rotating(horizontal, vertical);
actionState = ActionState.Run;
moveDirection = new Vector3(horizontal, 0.0f, vertical);
rigidbody.MovePosition(rigidbody.position + speed * moveDirection * Time.deltaTime);
}
}
在这个函数中,我们首先判断用户是否有水平或垂直方向的输入。如果有输入,我们调用Rotating函数(此处代码未给出,但可根据需求实现),将角色状态设置为Run(奔跑),并计算移动方向。最后,使用rigidbody.MovePosition方法更新角色的位置,实现角色的移动。
通过以上步骤,我们就可以在Unity中实现使用WASD键控制人物移动且不转身的功能。