2017-05-17 102 views
0

我有一個浮動gameobject(brickRot),它通過raycast查看它下面的對象,然後根據brickRot的旋轉更改該對象的y位置(floorY)。不過,我無法將旋轉轉換爲用於更改Y位置的有用度量標準。我希望brickRot的當前旋轉等於floorY的y位置,然後只是相對於brickRot的旋轉(如果這是有道理的)。通過Unity中另一個對象的旋轉來影響對象的位置

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位置(如果這個比喻使得任何容易混淆)。我使用raycast的原因是因爲磚可以找到多個「表」,並且需要區分它們。如果任何人有一個想法如何使這更容易,我會永遠感謝!

+0

是否有理由使用物理(摩擦)不足以實現這一目標?或者甚至可能是固定聯合體?您的需求以什麼方式強制使用腳本而不是物理解決方案? – Serlite

+0

我的理解是,你想模擬「瓶蓋擰緊」類型的行爲。讓我知道,如果這是你想實現的東西? –

+0

@UirirM是的,這聽起來是正確的 - 旋轉也需要有一個最大和最大量它可以擴大floorY的位置,所以也許這種比喻會更有用 – Zelthon

回答

0

您獲得的旋轉值爲Quaternion角度,而不是常見的360度歐拉旋轉。 Unity或任何其他遊戲引擎,僅使用Euler代表我們,但它從不在內部用於任何類型的旋轉計算。

我打算建議不要深入瞭解四元數。相反,想想你還能做到什麼。

對於一個合適的指標,添加一個孩子的gameobject,在x或y或z中旋轉90°(這取決於你如何定位你的父代)以及距離父代一段距離的磚塊gameObject。現在,當您旋轉磚塊時,孩子會在父母周圍循環移動之後自動移動。您可以使用孩子的Y作爲更新floorY的度量。

+0

嗨,我真的很喜歡這個解決方案,但我認爲我的實現是向後的某處: if(hit.collider.tag ==「floor」){ floorY = newY = hit.collider.transform.position.y; – Zelthon

0

使用「爲:eulerAngles」值,而是會在四元數轉換成的Vector3 那麼你用的Vector3的角度函數來獲得一些浮動,您可以用另一個值乘以浮動,如果你需要更大的/低規模

brickRot = angle = Vector3.Angle(transform.rotation.eulerAngles, transform.forward); 
相關問題