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);
}
}
评论区