2016-04-24 2 views
-1

Donc, dans Unity3D, j'ai un cube qui est contrôlé par un joueur (en utilisant des flèches). Le joueur peut aller où il veut avec le cube. Le problème est quand j'ajoute un corps rigide au cube alors ça ne va plus vraiment aussi bien, à la fin ça pète. J'ai essayé de jouer un peu avec torque, mais cela n'a pas aidé ou je ne comprends pas encore clairement comment l'implémenter correctement. C'est le code que j'utilise pour le cube (il est écrit en JavaScript). Toute aide sera appréciée, même si vous ne connaissez pas le javascript, une idée compte encore. Je vous remercie. Code:Rouler un cube rigide dans 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

Trop de mauvaises choses dans votre code. 1. Utiliser Javascript au lieu de C#. 2. Pas de mise en cache transformer (à l'aide de .Find à chaque fois). 3. Ne pas mettre en cache Rigibody. S'il vous plaît apprendre C#. C'est pas difficile. – Programmer

+1

AndroidFreak, Unityscript n'est plus disponible. Vous devez changer pour C#. – Fattie

Répondre

4

Il est sans doute pas en douceur parce que vous déplacer modifiez sa position et la rotation directly avec son transformer au lieu d'utiliser Rigidbody fonctions.

Une fois Rigidbody est attaché, ne le font pas usagetransform.position = pos; ou transform.eulerAngles = vec;

Rigidbody.MovePosition, Rigidbody.MoveRotation, Rigidbody.AddForce et Rigidbody.AddTorque sont les fonctions que vous devriez utiliser.

Remplacer ces derniers dans votre fonction DoRoll

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

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

Merci pour votre réponse mais quand je le fais cela retourne cette erreur: 'La meilleure surcharge pour la méthode' UnityEngine.Rigidbody.MoveRotation (UnityEngine.Quaternion) 'n'est pas compatible avec la liste d'arguments' (UnityEngine.Vector3) '. ' – AndroidFreak

+0

J'ai aussi une question, puis-je vraiment utiliser Rigidbody.MoveRotation, car dans la documentation, il dit qu'il ne lit qu'une valeur absolue, mais je dois faire pivoter le cube de 90 degrés et je pense que Transform.Rotate fait l'affaire. Ai-je tort? – AndroidFreak

+0

Je suis désolé si je suis, je suis juste un débutant, en essayant d'apprendre. Merci :) – AndroidFreak