天天看點

關于Unity3d 使用rigidbody.velocity代替Transform.Translate()來使物體向前移動

個人接觸Unity3d已經一年多的時間了,這是第一次有勇氣在網上發表自己的心得,如有不敬或不合理的地方多多包含。

以下是自己的一個發現,如有不合理的地方請·大家多多指出:

在Unity裡物體的移動有Transform.Translate()和rigidbody.velocity這兩個方法(當然可能還有其他),Transform.Translate()是坐标的改變,rigidbody.velocity是在一定的方向(這裡的方向是指世界坐标的方向)上以一定速度移動,對于方向的變化相對于rigidbody.velocity來說比較靈活,但因為是坐标的變化,有時候會是物體自身的實體效果不起作用,而rigidbody.velocity移動的方向真是針對世界坐标的方向而言,那麼如何用rigidbody.velocity代替Transform.Translate()來使物體向前移動呢?

我是怎麼想的,坐标也可以用向量來表示,rigidbody.velocity的方向也可以用向量表示,那麼首先必須要能夠擷取物體自身指向前方的向量。

假設有三個點,分别為原點,物體自身坐标點LocalPos,始終在物體前方一定距離的點LocalForward。那麼物體向前移動的方向就可以用LocalForward - LocalPos來表示。

廢話不多說,代碼如下:

using UnityEngine;

using System.Collections;

public class RigidSpeedVec : MonoBehaviour {

public float speed = 2;

// Use this for initialization

void Start () {

this.gameObject.AddComponent<Rigidbody>();

rigidbody.useGravity = false;

}

// Update is called once per frame

void Update () {

}

void FixedUpdate() {

Vector3 LocalPos = transform.position;

Vector3 LocalForward = transform.TransformPoint(Vector3.forward * speed);

Vector3 VecSpeed = LocalForward - LocalPos;

rigidbody.velocity = new Vector3 (VecSpeed.x,VecSpeed.y,VecSpeed.z);

}

}

繼續閱讀