Unity3D-rigidBody.velocity


還有半小時就下班了。寫一下今天遇到的問題、處理方法以及一些自己的理解。理解的不一定對,還希望大家指正。

今天我做的效果是,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 frame
	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);
		}
	}


這樣也能夠移動,可是移動較快,和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 initialization
	void Start ()
	{
	}
	
	// Update is called once per frame
	void 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);
			//改變移動State
			m_bMoving = true;
		}
	}
}


感覺自己學東西好慢啊~~加油!






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM