在 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);
我有一个浮动游戏对象 (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);