之前一提起角色的跳跃,想当然的想法就是:给角色一个向上的初速,然后由Unity的物理系统接管就好了嘛,这样忽略空气摩擦的影响,根据重力加速度,角色向上跳到最高点的时间和由最高点落下的时间相等,不是很合理嘛。最近看了几篇文章才发现,这样的想法是错误的。
仔细观察马里奥这类经典平台跳跃游戏其实可以发现,角色向上运动的过程占的帧数达到跳跃全过程总帧数的约2/3,就是说其实马里奥下落的更快。这样设计的原因就是如果角色上下的时间相等,会在下落时给玩家带来一种漂浮感,这是我之前没有仔细考虑的。
那么如何优化呢?加入几行代码即可:
public float fallmultiplier = 2.5f; public float lowmultiplier = 2f; Rigidbody2D rb; private void Awake() { rb = GetComponent<Rigidbody2D>(); } private void Update() { if (rb.velocity.y < 0) { rb.velocity += Vector2.up * Physics2D.gravity.y * (fallmultiplier - 1) * Time.deltaTime; } else if (rb.velocity.y > 0 && !Input.GetButton("jump")) { rb.velocity += Vector2.up * Physics2D.gravity.y * (lowmultiplier - 1) * Time.deltaTime; } }
当物体向下运动时添加系数fallmultiplier 使下落时加速度更大。
上面第二段条件语句里面还实现了玩家轻按跳跃键时跳不高,只有长按才跳得高的设定。