在实现了角色行走的基础上,再为其加上跑步的功能就易如反掌了。下面简述一下其实现方式以及其中遇到的问题。
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%的移动速度加成比在步行状态下更明显。
这将在后续解决。
网友评论