Unity3D-rigidBody.velocity,unity3drigidbody
還有半小時就下班了,寫一下今天遇到的問題、處理方法以及一些自己的理解。理解的不一定對,還希望大家指正。
今天我做的效果是,hero的移動。
以前做過用的是transform.Translate(Vector3.forward*Time.deltaTime*Speed);
但是這樣做有些bug就是移動不持續,當然你也可以加上時間延時函數,一點點的類比動畫效果,太麻煩了(我就想這樣幹)。
後來,老師指導我加力,rigidbody.AddForce(new Vector3(1,0,0));我這樣想太單純了,這樣做的效果就是,hero倒了。
沒辦法,後來拿到了一段代碼
rigidbody.velocity = transform.forward * heroXSpeed*1.1f;
walkDistance -= heroXSpeed * Time.fixedDeltaTime*1.1f;
核心是第一句rigidbody.velocity群中有說是計算剛體速度向量(好官方),有說給物體一個初速度。反正就是這個意思。
不過這段話放在Update()函數裡:
void Update (){animation.Play ("walk");rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;}hero移動也有動畫
但是如果我寫一個觸發
void Update (){animation.Play ("walk");//rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;if (Input.GetKey (KeyCode.D)) {rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;//rigidbody.velocity =new Vector3(1,0,0);}}這樣,當我按下D鍵,hero執行移動就沒有效果。
我又修改了一下代碼
void Update (){animation.Play ("walk");//rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;if (Input.GetKey (KeyCode.D)) {rigidbody.velocity += transform.forward * heroXSpeed * 1.1f;//rigidbody.velocity =new Vector3(1,0,0);}}
加了一個+號,它就可以了。這樣,我就推論出來,Update()是一幀一幀的渲染,可以即時顯示效果,但是加入判斷之後就需要等待響應,無法做到即時的效果。
還有一種寫法是
// Update is called once per framevoid Update (){animation.Play ("walk");//rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;if (Input.GetKey (KeyCode.D)) {//rigidbody.velocity += transform.forward * heroXSpeed * 1.1f;rigidbody.velocity =new Vector3(1,0,0);}}
這樣也可以移動,但是移動較快,和transform.Translate()效果差不多了。
註:heroXSpeed我取的是0.1f大家可以隨意
收拾收拾要下班了,啦啦啦。希望大家多多指教,畢竟我是新手,哈哈。
補充:
第二天我補全了代碼,調整了思路,就是走一段路之後,hero會停下
using UnityEngine;using System.Collections;public class Hero_Script : MonoBehaviour{//herox軸移動速度public float heroXSpeed=0.1f;//hero是否在移動private bool m_bMoving=false;//hero移動的目的地點private Vector3 m_targetPos;// Use this for initializationvoid Start (){}// Update is called once per framevoid Update (){Move ();if (m_bMoving) {animation.Play ("walk");rigidbody.velocity = transform.forward * heroXSpeed*1.1f;//Debug.Log(transform.position+" "+m_targetPos);if (Vector3.Distance (transform.position, m_targetPos) < 0.1f) {//hero的位置與目的地點距離只有0.1時 停止動畫 停止移動 進入等待rigidbody.velocity = Vector3.zero;m_bMoving = false;animation.Play ("wait");}}}void Move(){if (Input.GetKey (KeyCode.D)) {//記錄下目標點m_targetPos =new Vector3(transform.localPosition.x+1,transform.localPosition.y,transform.localPosition.z);transform.LookAt (m_targetPos);//改變移動Statem_bMoving = true;}}}
感覺自己學東西好慢啊~~加油!
Unity3D中我給骨骼模型設定了rigidbody可以落到地面但是卻互相穿過
加個collider,mesh collider活著box collider
unity3d只有重力跟彈力為何會越跳越高
理想狀態肯定是不應該高的,但實際可能小球落點不同,是否真的沒有初速度,小球自身是否有彈力,彈力是否均勻等,這些可能都會有影響