SetParent

改变游戏对象的父级变换的方法

有两个参数

  • 第一个参数:游戏的父对象

  • 第二个参数:如果为true,Unity 会确保物体在改变父级后仍然位于相同的世界位置,旋转和缩放。如果为false,物体的局部坐标将直接设置为相对于新父级的变换,而不考虑之前的变换

我做了一个例子,能够帮助理解

场景中有两个物体Parent,Son。物体Parent的世界坐标为(-1, 0, 0),物体Son的世界坐标为(5, 0, 0)

我们调用 Son.SetParent(Parent, true); 物体在改变父级后仍然位于相同的世界位置、旋转和缩放。所以Son相对于Parent为(6, 0, 0)。

我们调用 Son.SetParent(Parent, false);物体的局部坐标将直接设置为相对于新父级的变换,也就是让Son相对于Parent为(5, 0, 0),

总结:如果为true,子物体的局部坐标就是(父物体在世界坐标中与子物体在世界坐标的偏移量相同。如果设置为false,子物体的局部坐标就是世界坐标的值。

说人话:设置为True,不会改变两个物体的位置,设置为true,会改变子物体在世界坐标的位置

位移Translate

用于在本地或世界坐标系中移动游戏对象

理解本地和世界

在Unity中以(x,y,z)=(0,0,0)作为整个世界的中心。

物体相对于世界中心有一个位置、方向。物体本身也有一个位置和方向。

理解为什么要乘以Time.deltaTime

为了确保移动速度与帧率无关,通常会在 Translate 方法中乘以 Time.deltaTime。这可以保证物体每秒移动的速度是恒定的,而不是依赖于帧率。

本地坐标移动

using UnityEngine;

public class MoveObject : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        // 每帧沿 X 轴正方向移动 5 个单位(本地坐标系)
        transform.Translate(new Vector3(1, 0, 0) * speed * Time.deltaTime, Space.Self);
    }
}

世界坐标移动

using UnityEngine;

public class MoveObject : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        // 每帧沿世界坐标系的 X 轴正方向移动 5 个单位
        transform.Translate(new Vector3(1, 0, 0) * speed * Time.deltaTime, Space.World);
    }
}

通过float参数移动

using UnityEngine;

public class MoveObject : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        // 每帧沿 X 轴正方向和 Z 轴正方向各移动 5 个单位(本地坐标系)
        transform.Translate(speed * Time.deltaTime, 0, speed * Time.deltaTime, Space.Self);
    }
}

旋转Rotate

Rotate

Rotate 方法用于绕指定轴旋转物体,你可以选择是相对于本地坐标系还是世界坐标系进行旋转

using UnityEngine;

public class RotateExample : MonoBehaviour
{
    public float rotationSpeed = 100f;

    void Update()
    {
        // 每帧绕 Y 轴旋转 100 度(本地坐标系)
        transform.Rotate(0, rotationSpeed * Time.deltaTime, 0, Space.Self);

        // 或者使用 Vector3 参数
        transform.Rotate(new Vector3(0, rotationSpeed * Time.deltaTime, 0), Space.Self);
    }
}