【问题标题】:Rolling rigidbody cube in Unity3DUnity3D中的滚动刚体立方体
【发布时间】:2016-08-17 23:01:52
【问题描述】:

所以在 Unity3D 中,我有一个由玩家控制的立方体(使用箭头)。玩家可以带着立方体去任何他想去的地方。问题是当我将刚体添加到立方体时,它就不再那么顺利了,不知何故,最后它只是出现了故障。尝试与torque 玩了一下,但这没有帮助,或者我还不清楚如何正确实现它。这是我用于多维数据集的代码(它是用 JavaScript 编写的)。任何帮助将不胜感激,即使您不知道 javascript,想法仍然很重要。谢谢你。代码:

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 () {

}  

【问题讨论】:

  • 代码中有太多错误。 1. 使用 Javascript 而不是 C#。 2.不缓存变换(每次都使用.Find)。 3.不缓存刚体。请学习 C#。这并不难。
  • AndroidFreak,Unityscript 不再可用。您必须更改为 c#。

标签: javascript unity3d


【解决方案1】:

它可能移动不顺畅,因为您正在使用它的 transform 而不是 Rigidbody 函数来修改它的位置和旋转directly。

一旦将Rigidbody附加到它上面,不要使用transform.position = pos;或transform.eulerAngles = vec;

Rigidbody.MovePosition、Rigidbody.MoveRotation、Rigidbody.AddForce 和 Rigidbody.AddTorque 是您应该使用的函数。

在您的 DoRoll 函数中替换这些

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

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

【讨论】:

  • 感谢您的回答,但是当我这样做时,它会返回此错误:'UnityEngine.Rigidbody.MoveRotation(UnityEngine.Quaternion) 方法的最佳重载与参数列表不兼容' (UnityEngine.Vector3)'.'
  • 我还有一个问题,我真的可以使用 Rigidbody.MoveRotation,因为在文档中它说它只读取一个绝对值,但我必须将立方体旋转 90 度,我认为是 Transform。旋转就可以了。我错了吗?
  • 对不起,我只是一个初学者,正在努力学习。谢谢你:)
  • 一旦 Rigidbody 附加到它上面,不要使用 transform.position = pos;或 transform.eulerAngles = vec;或 transform.SOMETHING...使用刚体.SOMETHING 移动对象。学习 C# 以获得更多帮助。修改答案编译。
  • @AndroidFreak 那么这个解决方案对你有用吗?
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2018-12-11
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多