【问题标题】:How do I get a game object's rotation values that is displayed in the editor in Unity?如何获取 Unity 编辑器中显示的游戏对象的旋转值?
【发布时间】:2022-10-18 23:11:53
【问题描述】:

我目前对 Unity 中的旋转(和 eulerAngles)如何工作感到非常困惑,我觉得我缺少一些基本的东西。

我有一个游戏对象Emma,它有一个不断打印出旋转的脚本(mainObject 指向Emma 对象):

"emma1 x=" + this.transform.eulerAngles.x + " y=" + this.transform.eulerAngles.y + " z=" + this.transform.eulerAngles.z);
"emma2 x=" + mainObject.transform.rotation.eulerAngles.x + " y=" + mainObject.transform.rotation.eulerAngles.y + " z=" + mainObject.transform.rotation.eulerAngles.z);
"emma3 x=" + mainObject.transform.rotation.x + " y=" + mainObject.transform.rotation.y + " z=" + mainObject.transform.rotation.z);
"emma4 x=" + mainObject.transform.localEulerAngles.x + " y=" + mainObject.transform.localEulerAngles.y + " z=" + mainObject.transform.localEulerAngles.z);

在编辑器中,我将Emma 旋转为x=235 y=20 z=70

但是,输出变为x=305 y=200 z=250

不管我如何旋转Emma,编辑器值对我来说都是有意义的,但打印输出对我来说是可以理解的。

另一个示例是编辑器x=250 y=180 z=100,但输出变为x=290 y=5 z=280

即使我在编辑器中旋转一个轴,例如脚本中的 x,所有 3 个轴都可以更改 (x, z, y),这对我来说毫无意义。

我的根本问题是;我希望通过脚本能够将 Emma 旋转到特定方向(比如朝向公寓的门)。我可以通过在编辑器中旋转 Emma 来计算出这些值,但如果我不能通过脚本应用这些值,那么还有什么方法可以做到这一点。

所以我的问题是:

  1. 为什么它们不同?我在某处读到编辑器显示localEulerAngles,但显然这不是真的。
  2. 如何在脚本中打印编辑器中显示的值?我没有使用正确的功能吗?
  3. 如果我想在编辑器中显示特定方向,我应该使用哪些函数来设置该旋转?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    问题是您试图找到 EulerAngler 和四元数之间的直接相关性,这是行不通的。澄清一下,您在编辑器中看到的是您的 localEulerAngle,也许您会问,“如果 localEulerAngles 是编辑器中显示的值,为什么它们在我的代码中有所不同”,这是因为 eulerAngles 不存储 X、Y , Z 信息,您通过代码访问的属性是将您的四元数表示为角度,但编辑器存储您在其中插入的值,并在内部将这些值转换为四元数,您可以在文档中阅读更多信息@ 987654321@

    希望这有帮助

    【讨论】:

    • 嘿,我确实读过那篇文章,但是(AFAIK)它没有回答我的问题,即:1)是否可以在脚本中获取编辑器值? 2)如果我有一个编辑器值,我如何修改游戏对象以使用这些值
    • 1) AFAIK 您没有内置方法来获取编辑器中显示的确切数字,因为它们只存在于 c# 中以及用于用户与实际数据之间通信的层中,即四元数。
    • 2) IDK 如果我做对了,您将能够将它用于大多数计算(如文档中所示),只是不要过分依赖您在编辑器中看到的值
    • 我有一个简单的脚本,可以旋转对象的 X(0-360,然后又是 0,等等)。并使用“transform.eulerAngles = new Vector3(x, this.transform.eulerAngles.y, this.transform.eulerAngles.z)”)。我看到“this.transform.eulerAngles.y”和 z 发生了变化。如果我只围绕 X 旋转,为什么对象 Y 和 Z 会改变。我不明白:|它们应该是恒定的
    • 有时不可能如此简单,正如我所说,您看到并用作 Vector3 的角度只是四元数的表示,四元数有 4 个值,并且第四维的丢失已经从我们身上移除了一些自由,所以对于一些旋转当您移动一个轴时,系统将移动其他轴以代表您的新旋转
    【解决方案2】:

    在试图理解这一点之后,我个人得出了这个结论:

    编辑器的X/Y/Z 旋转值和.transform.rotation.eulerAngles.x/y/z 值之间没有直接的映射关系。

    例如,.transform.rotation.eulerAngles.y 不断变化,尽管我可能没有修改它,因为 Unity 内部处理旋转,这意味着它不是回答问题“这个对象有什么 Y 旋转?”的好方法。

    我的解决方案

    为了抽象出 Unit 自己的(神奇的)逻辑,我创建了自己的单一真理来源通过在移动对象上创建我自己的变量。

    简化实现:

    public class Emma : MonoBehaviour
    {
        private float currentRotX = 0;
        private float currentRotY = 0;
        private float currentRotZ = 0;
    
        void Update() {
            transform.eulerAngles = new Vector3(currentRotX , currentRotY, currentRotZ);
            // or
           transform.rotation = Quaternion.Euler(new Vector3(currentRotX , currentRotY, currentRotZ));
        }
    
    
    }
    

    这意味着,如果我希望我的对象具有特定的旋转,我会分配我自己的变量:

    void lookAtDoor(){
        this.currentRotX = 123;
    }
    

    如果我想知道我的对象当前有什么旋转,那就是:

    boolean isLookingAtTV(){
        return this.currentRotX == 123;
    }
    

    意思是,我已经在 Unity 想要做的基础上创建了自己的 Single Source of Truth 抽象层。

    这让我省了很多麻烦,我希望这种模式能帮助下一个阅读本文的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多