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

时间:2017-05-17 19:25:45

标签: c# unity3d gameobject

我有一个浮动游戏对象(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视为放在桌子上的盘子,当你旋转盘子时,你可以改变桌子的y位置(如果这个类比使它更容易混淆)。我使用光线投影的原因是因为有多个"表"砖可以找到,它需要区分它们。如果有人知道如何使这更容易,我会永远感激!

2 个答案:

答案 0 :(得分:1)

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

我建议不要深入了解四元数。但相反,想想你还能做到的其他方法。

对于合适的指标,添加一个儿童游戏对象,在x或y或z中旋转90(检查这一点,这取决于你如何定位你的父母)和一些距离父对象的游戏对象。现在,当您旋转砖块时,子项将在父项周围循环移动后自动移动到y。您可以使用孩子的Y作为更新floorY的指标。

答案 1 :(得分:0)

使用" eulerAngles"相反,它会将四元数转换为vector3 那么你使用vector3的角度函数得到一些浮点数,如果你需要更大/更小的比例,你可以将浮点数与另一个值相乘

brickRot = angle = Vector3.Angle(transform.rotation.eulerAngles, transform.forward);