2016-04-24 159 views
-1

所以在Unity3D中,我有一個由玩家控制的立方體(使用箭頭)。玩家可以隨意使用立方體去任何他想去的地方。問題是,當我將剛體加到立方體上時,它不再那麼光滑了,不知怎的,最後它只是小故障。試圖玩torque,但沒有幫助,或者我不明白如何正確實施它。這是我用於多維數據集的代碼(它是用JavaScript編寫的)。任何幫助將不勝感激,即使你不知道的JavaScript仍然重要的想法。謝謝。代碼:在Unity3D中滾動剛體立方體

private var ismoving : boolean = false; 
private var startY : float = 0; 
var cubeSpeed : float; 
var cubeSize : float; 
var jumpHeight = 3.0; 


function Update() 
{ 

    if (Input.GetKeyDown("up") && ismoving == false) 
    { 
     ismoving = true; 
     transform.Find("targetpoint").Translate(0, -cubeSize/2 , cubeSize/2); 
     StartCoroutine(DoRoll(transform.Find("targetpoint").position, Vector3.right, 90.0f,cubeSpeed)); 

    } 
    if (Input.GetKeyDown("down") && ismoving == false) 
    { 
     ismoving = true; 
     transform.Find("targetpoint").Translate(0, -cubeSize/2, -cubeSize/2); 
     StartCoroutine(DoRoll(transform.Find("targetpoint").position, -Vector3.right, 90.0f,cubeSpeed)); 
    } 
    if (Input.GetKeyDown("left") && ismoving == false) 
    { 
     ismoving = true; 
     transform.Find("targetpoint").Translate(-cubeSize/2, -cubeSize/2, 0); 
     StartCoroutine(DoRoll(transform.Find("targetpoint").position, Vector3.forward, 90.0,cubeSpeed)); 
    } 
    if (Input.GetKeyDown("right") && ismoving == false) 
    { 
     ismoving = true; 
     transform.Find("targetpoint").Translate(cubeSize/2, -cubeSize/2, 0); 
     StartCoroutine(DoRoll(transform.Find("targetpoint").position, -Vector3.forward, 90.0f,cubeSpeed));  
    } 
     if (Input.GetKeyDown("space") && ismoving == false) 
    { 

    GetComponent.<Rigidbody>().AddForce(new Vector3(0, jumpHeight, 0), ForceMode.Impulse); 
    } 



} 

function DoRoll (aPoint, aAxis, aAngle, aDuration) {  

var tSteps = Mathf.Ceil(aDuration * 30.0); 
var tAngle = aAngle/tSteps; 
var pos : Vector3; 

    for (var i = 1; i <= tSteps; i++) 
    { 
    transform.RotateAround (aPoint, aAxis, tAngle); 
    yield WaitForSeconds(0.0033333); 
    } 


    transform.Find("targetpoint").position = transform.position; 


    pos = transform.position; 
    pos.y = startY; 
    transform.position = pos; 


    var vec = transform.eulerAngles; 
    vec.x = Mathf.Round(vec.x/90) * 90; 
    vec.y = Mathf.Round(vec.y/90) * 90; 
    vec.z = Mathf.Round(vec.z/90) * 90; 
    transform.eulerAngles = vec; 


    ismoving = false;  
} 

function FixedUpdate() { 

} 
+0

太多的事情錯在你的代碼。 1.使用Javascript而不是C#。 2.不緩存轉換(每次使用.Find)。 3.不緩存Rigibody。請學習C#。這並不難。 – Programmer

+1

AndroidFreak,Unity腳本不再可用。你必須改用c#。 – Fattie

回答

4

很可能無法順利地移動,因爲你正在修改其其位置和旋轉變換directly而不是使用Rigidbody功能。

一旦連接了Rigidbody不要使用transform.position = pos;transform.eulerAngles = vec;

Rigidbody.MovePositionRigidbody.MoveRotationRigidbody.AddForceRigidbody.AddTorque是您應該使用的功能。

DoRoll函數替換這些

Rigidbody rb; 
rb = GetComponent<Rigidbody>(); 

rb.MovePosition(pos); 
rb.MoveRotation(Quaternion.Euler(vec)); 
+0

謝謝你的回答,但是當我這樣做時,它會返回這個錯誤:'方法'UnityEngine.Rigidbody.MoveRotation(UnityEngine.Quaternion)'的最佳重載與參數列表'(UnityEngine.Vector3)'不兼容。 「 – AndroidFreak

+0

另外我有一個問題,我真的可以使用Rigidbody.MoveRotation,因爲在文檔中它說只讀取一個絕對值,但我必須將該立方體旋轉90度,我認爲Transform.Rotate會執行此操作。我錯了嗎? – AndroidFreak

+0

我很抱歉,如果我是,我只是一個初學者,試圖學習。謝謝:) – AndroidFreak