Unity3D-rigidBody.velocity,unity3drigidbody

來源:互聯網
上載者:User

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只有重力跟彈力為何會越跳越高

理想狀態肯定是不應該高的,但實際可能小球落點不同,是否真的沒有初速度,小球自身是否有彈力,彈力是否均勻等,這些可能都會有影響
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.