工作生活

Unity——#02 Run

2019-07-02  本文已影响0人  MisakiMel

  在实现了角色行走的基础上,再为其加上跑步的功能就易如反掌了。下面简述一下其实现方式以及其中遇到的问题。

1.设置按压型信号(Pressing Type Signal)

  按照我们对游戏的认知,一般的fps或rpg游戏都是按住left shift键去操控游戏角色进行奔跑,这就是用到了按压型信号,按压型信号的取信号时间段为当玩家按下按键直到松开。于此,我们应该使用bool作信号,用Input.GetKey()取信号。
   首先宣告一个string变量keyA,并且初始化为"left shift"(在unity里左shift键的KeyCode为left shift),然后再宣告一个bool变量记录玩家是否按了"left shift":

public string keyA = "left shift";
public bool run;

  然后使用Input.GetKey()判断玩家的输入:

run = Input.GetKey (keyA);

   为什么使用GetKey()而不是其他诸如GetKeyDown()呢?因为按照官网的描述:

public static bool GetKey(string name);
Description
Returns true while the user holds down the key identified by name.

public static bool GetKeyDown(string name);
Description
Returns true during the frame the user starts pressing down the key identified by name.

   GetKey()实现的是当玩家按住指定键时返回true,而GetKeyDown()实现的是当玩家键入指定键的那一帧(frame)返回true。显然GetKey()完胜。
   言归正传,我们可以先测试一下这几行代码能否实现我想要的:


按住left shift触发Run信号

   显然没什么问题,然后就可以Next了。

2.添加Run动画

   再往我们的ground的Blend Tree里添加Run的动画之后,可以看到参数forward的阈值范围变为0-2,新添加的Run动画的Threshold也自动变成1-2,可以通过拉动滑杆看看效果:


拖动forward

   然后需要在代码上跟进forward值的修改:

//修改前
anim.SetFloat("forward", pi.Dmag);.
//修改后,加一三元比较符让其与bool型变量run联系起来:
anim.SetFloat("forward", pi.Dmag * (pi.run ? 2.0f : 1.0f));

   除此以外,还需要修改原本保存角色移动信息的变量:

//修改前
movingVec = pi.Dmag * model.transform.forward;
//我们只需在这串代码后加一三元比较符让其与bool型变量run联系起来:
movingVec = pi.Dmag * model.transform.forward * (pi.run ? runSpeed : 1.0f);

   逻辑为当run的信号为true时,就在当前步行的速度值上乘上一个额外的值,让其在跑步时具有合适的速度;反之就维持角色步行。runSpeed是一个public float变量,写活使得能在运行时修改其值以得到符合动画播放速度的速度值,这就不会出现脚底抹油的情况。

public float runSpeed = 2.0f;
  虽然,我给了runSpeed一个初始值为2.0f,但我在Inspector里把它修改为了2.5:

  至此,应该就能实现角色的奔跑了,来看看实际的效果如何:


Run

  基本上ok,但依旧有点瑕疵,问题如下:
1.起跑很突兀,从步行到奔跑没有平滑处理,在forward值上也有体现,从1到2是瞬间完成,也就是说需要插值。
2.Dmag斜向1.414的问题,在奔跑的情况下,40%的移动速度加成比在步行状态下更明显。
  这将在后续解决。

上一篇下一篇

猜你喜欢

热点阅读