Menu
CoddyTech

Vector3 是一种结构体

本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 29 课,共 85 课。

Vector3 是一种struct,属于你还没接触过的类型。struct 是一种值,和 int 一样:赋值时会复制整个值。执行 Vector3 b = a; b.x = 9; 后,a.x 不会改变,因为 b 是一个单独的副本。(类的行为正好相反:两个变量可以指向同一个共享对象。)

transform.position 是一个属性,读取它会得到位置的副本。因此,transform.position.x = 0; 会修改一个随即被丢弃的副本,C# 会拒绝编译这段代码:error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable。解决方法是先复制位置,修改副本,再把它赋值回去。按下 Space 时,这段代码会让这个 runner 回到中间车道:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // 复制一份
    p.x = 0;                          // 修改副本
    transform.position = p;           // 赋值回去
}

如果省略最后一行,代码可以编译,但不会发生任何移动:改变的只是副本。transform.localScale 和其他 Vector3 属性的行为也一样。

challenge icon

挑战

简单

修改雪橇的脚本,使其能够编译,并让雪橇保持在地面上且不会穿过墙壁。

  1. 将设置 transform.position.y 和 .x 的两行替换为以下副本:Vector3 p = transform.position;。
  2. 设置 p.y = Mathf.Max(p.y, 0.5f); 和 p.x = Mathf.Clamp(p.x, -4f, 4f);,然后设置 transform.position = p;。

按下“开始”:雪橇会落到地面上,并被墙壁挡住。然后点击“检查”。

亲手试试

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float speed = 4f;
    public float fall = 3f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;

        // 让雪橇始终贴着地面,并保持在两侧墙壁之间。
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}

Unity 脚本基础中的所有课

自己练习: Unity 在线编辑器