欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity | Dash 制作人物的三维冲刺效果

程序员文章站 2022-07-02 09:58:37
...

在学习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 中添加两个冲刺键,Dash1Dash2
Unity | Dash 制作人物的三维冲刺效果

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

Unity | Dash 制作人物的三维冲刺效果


游戏效果

Unity | Dash 制作人物的三维冲刺效果


思路

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.SpaceKeyCode.Escape
方向键
KeyCode.UpArrow
KeyCode.DownArrow
KeyCode.LeftArrow
KeyCode.RightArrow

PS:
Input.GetKeyDown()
Input.GetKey()
Input.GetKeyUp)

区别在于 DownUp 一般只做一次判定,已知按着的话,会一直触发 GetKey

*注意事项

isDash 需要在 Start() 中初始化为 false
rigidbody = GetComponent<Rigidbody>(); 需要加在 Start() 函数中
dashSpeeddashDuration 需要设置


Q&A

1 按键没有响应

按键设置是否正确

原因可能为按键映射错误,可以在脚本中按键后的代码块加上 Debug.Log("Pressed"),来测试按键是否正确

是否设置了 dashDuration 和 dashSpeed

如果没有设置,相当于0,那么也不存在冲刺这个过程

另外,dashSpeed 设置过小会导致冲刺效果不明显。可以先设置较大值(因为跟物体的重量大小有关),例如500,之后再慢慢减小。

2 出现冲刺方向不正确的情况

transform.forward 获取的是物体当前的前方,所以如果使用的物体是球体的话,那么可能会存在方向不正确的情况(亲测),大概是因为球体的前方随着转动而发生了偏转。

最好使用 Capsule 或者自制的模型来测试。

提升

增加冲刺间隔提示

可以增加一个 dashInterval 冲刺间隔,来限制冲刺的间隔(即赋予冷却时间)

设置冷却条显示冷却

可以设置一个 Slider 来同步冷却效果

冲刺伤害

在冲刺期间,如果碰到物体,可以判定给予物体的伤害,做到交互效果


文章中的游戏示例来自于Unity官方的游戏教程(可能需要*)
TANKS! Unity Tutorial