【问题标题】:Affecting an object's position through another object's rotation in Unity在 Unity 中通过另一个对象的旋转来影响一个对象的位置
【发布时间】:2017-05-17 19:25:45
【问题描述】:

我有一个浮动的游戏对象 (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 位置(如果这个类比让它更容易混淆的话)。我使用光线投射的原因是因为积木可以找到多个“表”,并且需要区分它们。如果有人知道如何使这更容易,我将永远感激不尽!

【问题讨论】:

  • 是否有理由使用物理学(有摩擦)不足以实现这一目标?或者甚至是固定关节?您的要求以何种方式要求采用脚本解决方案而不是物理解决方案?
  • 我从中了解到的是,您想模拟“拧瓶盖”的行为。让我知道这是否是您想要实现的目标?
  • @UmairM 是的,这听起来很正确 - 旋转还需要有一个最小和最大量,它可以缩放 floorY 的位置,所以这个类比可能会更有用

标签: c# unity3d gameobject


【解决方案1】:

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

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

对于一个合适的度量,添加一个子游戏对象,在 x 或 y 或 z 旋转 90(检查这个,这取决于你如何定位你的父母)和远离父母的一段距离,到砖游戏对象。现在,当您旋转砖块时,孩子将自动沿 y 轴移动,跟随围绕父母的圆周运动。您可以使用孩子的 Y 作为更新 floorY 的指标。

【讨论】:

  • 嗨,我真的很喜欢这个解决方案,但我认为我的实现有点落后: if(hit.collider.tag == "floor") { floorY = newY = hit.collider.transform.position .y;
【解决方案2】:

改用“eulerAngles”值,它会将四元数转换为vector3 然后你使用vector3的角度函数来获得一些浮点数,如果你需要更大/更低的比例,你可以将浮点数乘以另一个值

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2018-03-12
    相关资源
    最近更新 更多