为刚体分配速度并没有做任何事情

时间:2015-10-25 17:35:57

标签: unity3d

我有一个脚本附加到一个网格上,其中有一个运动学,刚体和一个凸形网格对撞机,我想要四处移动。这是我在更新功能中调用的内容:

if (Input.GetKey(forwards)) {

        Debug.Log("forwards!!");

        //get current velocity in local space
        Vector3 localVel = transform.InverseTransformDirection(body.velocity);

        //alter so that forward component = speed
        localVel = new Vector3(localVel.x, localVel.y, linearSpeed);

        //convert back into world space and set to body
        Vector3 worldVel = transform.TransformDirection(localVel);
        body.velocity = worldVel;
    }

其他信息:

  • body是我使用Rigidbody

  • Start()中分配的GetComponent<Rigidbody>();变量
  • linearSpeedfloat,其值为1

我得到Debug.Log输出,但我的网格没有移动。我有什么明显的遗失吗?这是我的第一个3D脚本,而不是2D游戏。

2 个答案:

答案 0 :(得分:1)

public float speed = 20; 
Rigidbody r;

void Start(){
    r = gameObject.GetComponent<Rigidbody> (); //Put's reference to local rigidbody into variable "r"
}

void FixedUpdate () {
    Vector3 direction = Vector3.zero; //set's current direction to none

    //Adds vectors in case that user is pressing the button
    if(Input.GetKey(KeyCode.W)) direction += Vector3.forward;
    if(Input.GetKey(KeyCode.S)) direction -= Vector3.forward;
    if(Input.GetKey(KeyCode.D)) direction += Vector3.right;
    if(Input.GetKey(KeyCode.A)) direction -= Vector3.right;

    //Normalizez direction (put's it's magnitude to 1) so object moves at same speeds in all directions
    r.AddForce (direction.normalized * speed); //Adds direction with magnitude of "speed" to rigidbody
}

Rigidbody 必须附加到与此脚本相同的GO。此脚本使用世界方向,因为使用本地方向更加困难(对象正在旋转并快速更改方向,如果您只想通过替换对Vector3的引用来进行转换,则可以使用它:

if(Input.GetKey(KeyCode.W)) direction += transform.forward;

当然是所有方向。

这是非常基本方式沿着它的本地轴移动对象,为了更好地做你需要为特定对象集编写特定脚本,这一切都取决于你是什么类型的对象移动以及如何移动它。 (它是球体,立方体......,它是否会飞起来,如果它旋转......)。

答案 1 :(得分:0)

如果RigidBody是Kinematic,则意味着通过物理系统以外的方式移动;动画,变换。位置等。使你的刚体非运动,当你设定速度时它应该移动。