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 属性的行为也一样。
挑战
简单修改雪橇的脚本,使其能够编译,并让雪橇保持在地面上且不会穿过墙壁。
- 将设置
transform.position.y和.x的两行替换为以下副本:Vector3 p = transform.position;。 - 设置
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 在线编辑器