我正在观看这个(游戏开发、空间育儿和轮换) Sebastian Lague 视频,发现实际上有三个空间(不是两个),分别是世界空间、局部空间和对象空间。
令我惊讶的是,我在官方统一形式上没有找到这两个空间(局部空间和物体空间)之间的区别,但实际上它是存在的。我的问题是为什么没有 Space.Local?我发现有空间。自我与空间世界。 Space.Self 是指对象空间。我可以使用这个将我的对象移动到对象空间
void Update () {
transform.Translate(new Vector3(0,0,1) * Time.deltaTime * 2,Space.Self);
}
我可以使用这个将我的对象移动到世界空间
void Update () {
transform.Translate(new Vector3(0,0,1) * Time.deltaTime * 2,Space.World);
}
但是不支持本地空间,我可以将对象移动到本地空间(意味着移动与其父对象相关的对象)。本地空间和对象空间之间存在明显的区别,但我猜统一没有考虑它,或者我错了。
在 Unity 的检查器中,Transform 组件的位置和旋转相对于父组件(在本地空间中定义)
小控件手柄代表的轴要么是全局轴(世界空间),要么是 对象轴,如 S. Lague 在视频中指出的那样。
当您选择游戏对象时,不会显示局部轴(父变换的轴),这与其他 3D 软件(我认为是 Maya)相反,并且没有可以在局部空间中进行平移的 C# 函数,但您可以创建一个:
Vector3 right = transform.parent.right;
Vector3 up = transform.parent.up ;
Vector3 forward = transform.parent.forward;
Vector3 direction = X * right + Y * up + Z * forward ;
transform.Translate(direction * Time.deltaTime, Space.World);
但是,请记住,在对象空间中,对象
A
将始终具有 (0, 0, 0) 的位置和旋转,因为后者是由对象本身定义的。对象 A
无法从本身移动/旋转。
Transform.TransformDirection()
方法,像这样:
public class WhatIsTheLocalSpace : MonoBehaviour
{
public Transform obt;
public bool selfSpace = false;
public bool worldSpace = false;
public bool parentSpace = false;
void Update() {
if (Input.GetKey(KeyCode.D))
{
// move along self space
if (selfSpace && !worldSpace && !parentSpace)
{
obt.Translate(Vector3.right*Time.deltaTime,Space.Self);
}
// move along world space
if (!selfSpace && worldSpace && !parentSpace)
{
obt.Translate(Vector3.right*Time.deltaTime,Space.World);
}
// move along parent space
if (!selfSpace && !worldSpace && parentSpace)
{
obt.Translate(obt.parent.TransformDirection(Vector3.right)*Time.deltaTime,Space.World);
}
}
}
}