Unity | Dash 制作人物的三维冲刺效果
在学习Unity的人物控制中,想到前两年玩的 空洞骑士 中的冲刺效果,想自己实现一遍
参考了以下视频中的2D冲刺的制作方式,做了3D的冲刺效果
HOW TO MAKE A DASH MOVE IN UNITY - EASY TUTORIAL
步骤
1 必要的变量设置
(m_DashButtonName
用于本地多玩家情况下的按键设置,如果只需要一个按键不用区分,可以不用设置)
public float dashDuration;// 控制冲刺时间
public float dashSpeed;// 冲刺速度
private bool isDash;// 是否在冲刺
private float dashTime;// 剩余冲刺时间
private Vector3 directionXOZ;// 获取 xOz 平面的坦克方向
private string dashButtonName;// 存储属于每个玩家的冲击键名称
在 Start()
函数中加入以下代码,获取冲刺键的名称,用于之后的判定键是否被按下dashAxisName = "Dash" + playerNumber;
2 Input Manager 添加冲刺键
在 Input Manager
中添加两个冲刺键,Dash1
和 Dash2
3 Dash()
函数的具体设置
private void Dash()
{
if (!isDash)
{
if (Input.GetButtonDown(dashButtonName))
{
isDash = true;
directionXOZ = transform.forward;// forward 指向物体当前的前方
directionXOZ.y = 0f;// 只做平面的上下移动和水平移动,不做高度上的上下移动
}
}
else
{
if (dashTime <= 0)// reset
{
isDash = false;
dashTime = dashDuration;
}
else
{
dashTime -= Time.deltaTime;
rigidbody.velocity = directionXOZ * dashTime * dashSpeed;// rigidbody = GetComponent<Rigidbody>(); 加在 Start() 函数中
}
}
}
4 设置 dashSpeed 和 dashDuration
游戏效果
思路
isDash
控制判断物体的冲刺状态,不允许多次冲刺dashTime
控制整个滑行的时间,每次减小 Time.deltaTime
的时间
(由于本例不希望控制的游戏对象有高度上的冲刺,所以设置方向的 y
变量为0f
)
速度则设置为 rigidbody.velocity = directionXOZ * dashTime * dashSpeed
相当于匀减速直线运动,单位时间移动的距离呈抛物线,一开始移动的多,之后移动的少,符合预期。
小结
关于按键的设置
Input.GetButtonDown(dashButtonName)
用来判断虚拟按键(即在Input Manager
中设置的按键名称)对应的实体按键,会做一个映射转换
而Input.GetKeyDown()
直接判定实体按键是否按下,如果只有一个按键的话,可以将那一行代码修改为Input.GetKeyDown(KeyCode.LeftShift)
(按下左边的 Shift
键开火)
按键已经被封装好在 KeyCode
类中
具体参考Unity官方文档
KeyCode
英文字母键为本名(大写), eg. KeyCode.J
控制键一般为大驼峰写法,eg. KeyCode.RightCtrl
特殊键写法需要查询,常用的有 KeyCode.Space
、KeyCode.Escape
方向键KeyCode.UpArrow
KeyCode.DownArrow
KeyCode.LeftArrow
KeyCode.RightArrow
PS:Input.GetKeyDown()
Input.GetKey()
Input.GetKeyUp)
区别在于 Down
和 Up
一般只做一次判定,已知按着的话,会一直触发 GetKey
*注意事项
isDash
需要在 Start()
中初始化为 false
rigidbody = GetComponent<Rigidbody>();
需要加在 Start() 函数中dashSpeed
和 dashDuration
需要设置
Q&A
1 按键没有响应
按键设置是否正确
原因可能为按键映射错误,可以在脚本中按键后的代码块加上 Debug.Log("Pressed")
,来测试按键是否正确
是否设置了 dashDuration 和 dashSpeed
如果没有设置,相当于0,那么也不存在冲刺这个过程
另外,dashSpeed
设置过小会导致冲刺效果不明显。可以先设置较大值(因为跟物体的重量大小有关),例如500
,之后再慢慢减小。
2 出现冲刺方向不正确的情况
transform.forward
获取的是物体当前的前方,所以如果使用的物体是球体的话,那么可能会存在方向不正确的情况(亲测),大概是因为球体的前方随着转动而发生了偏转。
最好使用 Capsule
或者自制的模型来测试。
提升
增加冲刺间隔提示
可以增加一个 dashInterval
冲刺间隔,来限制冲刺的间隔(即赋予冷却时间)
设置冷却条显示冷却
可以设置一个 Slider
来同步冷却效果
冲刺伤害
在冲刺期间,如果碰到物体,可以判定给予物体的伤害,做到交互效果
文章中的游戏示例来自于Unity官方的游戏教程(可能需要*)
TANKS! Unity Tutorial