在 Unity 中通过另一个对象的旋转影响一个对象的位置

Affecting an object's position through another object's rotation in Unity

我有一个浮动游戏对象 (brickRot),它通过光线投射查看其下方的对象,然后根据 brickRot 的旋转更改该对象的 y 位置 (floorY)。但是,我无法将旋转转换为更改 Y 位置的有用指标。我希望 brickRot 的当前旋转等于 floorY 的 y 位置,然后仅相对于 brickRot 的旋转发生变化(如果这有意义的话)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FloorRotation : MonoBehaviour {

private float brickRot;
private float floorY;

void Update () {
    brickRot = transform.rotation.y;

    RaycastHit hit;
    Ray floorRay = new Ray(transform.position, Vector3.down);

    if(Physics.Raycast(floorRay, out hit)) {
        if(hit.collider.tag == "floor") {
            floorY = hit.transform.position.y;
            floorY = floorY + brickRot;
            Debug.Log(floorY);
        }
    }
  }
}

把 brickRot 想象成一个放在 table 上的盘子,当你旋转盘子时,你改变了 table 的 y 位置(如果这个类比可以减少令人困惑)。我之所以使用光线投射是因为砖块可以找到多个"tables",并且需要区分它们。如果有人知道如何使这更容易,我将永远感激不已!

您获得的旋转值是 Quaternion 角度,而不是常见的 360 度欧拉旋转。 Unity 或任何其他游戏引擎仅使用 Euler 为我们表示,但它从不在内部将其用于任何类型的旋转计算。

我建议不要深入了解四元数。但是,想想你还能如何实现它。

为了获得合适的指标,添加一个 child 游戏对象,在 x 或 y 或 z 方向旋转 90 度(检查这个,这取决于你如何定位你的 parent)和一些距离从 parent 到 brick gameObject。现在,当您旋转积木时,child 将自动沿 y 方向移动,并围绕 parent 进行圆周运动。您可以使用 child 的 Y 作为更新 floorY 的指标。

改用"eulerAngles"值,它会将四元数转换为向量3 然后你使用 vector3 的角度函数得到一些浮点数,如果你需要 bigger/lower scale

,你可以将浮点数乘以另一个值
brickRot = angle = Vector3.Angle(transform.rotation.eulerAngles, transform.forward);