竞技场
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 59 课,共 71 课。
这一章将制作《Arena Escape》。你要在有围墙的竞技场中躲避猎人,一波又一波的猎人会涌入,受到三次攻击后游戏结束,最后一波猎人离开后,出口就会打开。这个项目从一开始就包含五个脚本:Player、Hunter、Spawner、Health 和 Exit。目前后四个脚本都是空的,每节课会完成其中一个。
玩家通过力移动,而不是直接设置速度,因此猎人的击退力会叠加到玩家的移动上,不会被抵消。单靠推力会让它永远加速,因此 linearDamping 会在每一步中削减一部分速度:持续推力最终会使速度趋于稳定,最高速度约为加速度除以阻尼。按住 Space 时,这辆悬浮滑车会向前推进:
[SerializeField] private float accel = 12f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.linearDamping = 2f;
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce(transform.forward * accel, ForceMode.Acceleration);
}
}加速度为 12、阻尼为 2 时,滑车的最高速度约为每秒 6 个单位。松开 Space 后,阻尼会让滑车停下来,而不是让它永远滑行。ForceMode.Acceleration 不受质量影响,因此重滑车的加速效果和轻滑车完全相同。滑车的碰撞体使用了无摩擦的 PhysicsMaterial:如果再加上地面的摩擦力,最高速度就会更低。
挑战
中等开始体验 Arena Escape:玩家会在力的作用下滑动。
- 在
Start()中,紧接着GetComponent那一行,设置rb.linearDamping = accel / topSpeed;,这样速度会在接近topSpeed时趋于稳定。 - 在
FixedUpdate()中,构建new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"))。 - 将它的
normalized乘以accel,并通过rb.AddForce和ForceMode.Acceleration传入。
按下“开始”,在竞技场中滑动。然后点击“检查”。
亲手试试
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float accel = 18f;
[SerializeField] private float topSpeed = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 设置阻尼,然后用方向键推动玩家角色
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器