Menu
CoddyTech

竞技场

本课属于 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:如果再加上地面的摩擦力,最高速度就会更低。

challenge icon

挑战

中等

开始体验 Arena Escape:玩家会在力的作用下滑动。

  1. 在 Start() 中,紧接着 GetComponent 那一行,设置 rb.linearDamping = accel / topSpeed;,这样速度会在接近 topSpeed 时趋于稳定。
  2. 在 FixedUpdate() 中,构建 new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"))。
  3. 将它的 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 在线编辑器