1. 程式人生 > >[Unity3D]Unity3D遊戲開發之《憤怒的小鳥》彈弓實現

[Unity3D]Unity3D遊戲開發之《憤怒的小鳥》彈弓實現

        各位朋友,大家晚上好, 我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。今天我們來做一個高階大氣上檔次的東西。我相信大家都玩過一款叫做《憤怒的小鳥》的遊戲,這款遊戲之所以能夠受到玩家的喜愛,是因為這是一款物理遊戲,在遊戲中處處充滿了物理。我們熟悉的拋物線、引力等物理元素都在這款遊戲中得到了體現。那麼《憤怒的小鳥》這款遊戲使用的正是Unity引擎,所以我們在遊戲中看到了各種各種有趣的物理現象。那麼,我們今天呢,就以《憤怒的小鳥》遊戲中的小鳥發射器——彈弓為例,來講述在Unity中如何實現彈性效果。

        首先,我們來引入一個新的概念——LineRenderer。在Unity3D中LineRenderer被稱為線性渲染器。通過這個元件,我們可以做一些比較有創意的東西,比如在遊戲中繪製線段、製作鐳射特效、武器拖尾效果等。那麼今天呢,我們是用LineRenderer來構造彈弓兩邊的繩子,這個繩子是具有彈性的,在受力結束後可以恢復到原來的狀態。我們首先建立一個如下圖的簡單場景:


       在上面的場景中,兩邊的柱子作為固定繩子的物體,小球在兩根繩子中間。我們希望實現的是:

當用戶按下滑鼠左鍵並移動滑鼠的時候,小球和繩子都將跟著移動,當鬆開滑鼠左鍵的時候,小球以一定的角度和一定的力發射出去。我們今天著重來講繩子的實現。首先我們建立一個空的GameObject將座標值設為原點,命名為RopeL。接下來我們通過Component->Effects->Line Renderer為新增一個線性渲染器元件。如圖:


      我們設定好上述引數後,就可以開始編寫指令碼了,這裡兩根繩子是對稱的:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

	//滑鼠位置
	private Vector3 MousePos;

	//左側LineRenderer
	private LineRenderer LineL;
	//右側LineRenderer
	private LineRenderer LineR;
	
	void Start ()
	{
		//獲取LineRenderer
		LineL=GameObject.Find("Shootor").transform.FindChild("RopeL").
			transform.GetComponent<LineRenderer>();
		LineR=GameObject.Find("Shootor").transform.FindChild("RopeR").
			transform.GetComponent<LineRenderer>();
	}

	void Update () 
	{
		if(Input.GetMouseButton(0))
		{
		   //獲取滑鼠位置
			MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));
		   //設定小球的位置
		   transform.position=MousePos;
		   //重新設定LineRenderer的位置
		   LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
		   LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
	    }
		if(Input.GetMouseButtonUp(0))
		{
			//獲取滑鼠位置
			MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));
			//設定小球的位置
			transform.position=MousePos;
			//重新設定LineRenderer的位置
			LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));
			LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));

			//計算小球合力方向
			Vector3 Vec3L=new Vector3(-2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);
			Vector3 Vec3R=new Vector3(2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);
			Vector3 Dir=(Vec3L+Vec3R).normalized;
			//獲取剛體結構
			transform.GetComponent<Rigidbody>().useGravity=true;
			transform.GetComponent<Rigidbody>().AddForce(Dir*10F,ForceMode.Impulse);
			//恢復LineRenderer
			LineL.SetPosition(0,new Vector3(0F,1.8F,0F));
			LineR.SetPosition(0,new Vector3(0F,1.8F,0F));
		}
	} 
}
        我們給小球加上剛體後,繫結這段指令碼就可以了。我們需要注意的問題有:

        1、這裡的力是給定的大小,我們可以根據繩子被拉長的距離使用一個彈性係數來計算力的大小。

        2、計算合力的方向時,我們首先計算兩邊繩子的向量值,然後將這兩個向量想加即可得到我們的合力方向。

        好了,我們一起來看今天的效果演示吧!


        今天被宿舍裡玩遊戲的這些人搞得心情很不好,或許註定我們不是同一個世界的人吧,大學三年,漸漸地對專業、班級沒有了歸屬感,我寧願在我的小圈子裡努力做好自己的事情。二十幾歲的人,每天就指望著遊戲來滿足你的成就感,這樣的生活我實在不喜歡。人還是應該努力一點的,不為什麼,就為了我們父母、親人、愛人。大學裡知道自己喜歡什麼,可以做什麼比上課學到了什麼更重要。你不努力,永遠有別人比你更努力,生活總得有點嚮往吧。唉,算了,發什麼牢騷啊,做好自己就行了。該睡覺了,大家晚安吧!

   每日箴言:成長,便是接受一個不完美的自己和一個不理想的自己,也接受這個世界的不完美和不理想。——張小嫻


    喜歡我的部落格請記住我的名字:秦元培,我的部落格地址是blog.csdn.net/qinyuanpei。
    轉載請註明出處,本文作者:秦元培,本文出處:http://blog.csdn.net/qinyuanpei/article/details/24941939