[Unity3D]Unity3D遊戲開發之跑酷遊戲項目解說

       你們好,我是秦元培。我參加了CSDN2014博客之星的評選,歡迎你們爲我投票,同一時候但願在新的一年裏你們能繼續支持個人博客。 dom


       你們晚上好。我是秦元培,歡迎你們關注個人博客,個人博客地址是blog.csdn.net/qinyuanpei。終於到了更新博客的時間。從昨天下午開始,博主開始設計一個跑酷的遊戲,到晚上睡覺前這個遊戲已經基本完畢。ide

博主今天早上七點鐘就起來了,到早上十點鐘終於把整個遊戲寫完了。動畫

因此,今天的博客的主題就是《Unity3D遊戲開發之跑酷遊戲項目解說》。this

        從博主自身來考慮這件事情。當你選擇作本身熱愛的事情的時候。你的心裏必定是充滿激情和勇氣的。你願意看到本身的努力。你願意看到本身的付出,咱們成長是爲了促進自我對認知的不斷無缺,因此咱們應該以一種虔誠、謙恭的態度來對待咱們的生命。咱們也許沒法選擇出身,但咱們可以選擇向本身喜歡的生活去努力。spa

也許我和這些人真的不是一個世界的人吧。很是多事情在今天都給出告終局,對於這樣的人我已經沒有再嘗試與之交流的想法了,也許大學四年平平淡淡,留給個人僅僅有本身才幹體會的孤獨吧。.net

好了。不說個人事情了,咱們正式開始今天的內容吧!設計


       1、遊戲策劃code

     遊戲採用2D界面,角色從左到右奔跑。在路段中隨機生成障礙物和金幣,玩家需要使用跳躍功能躲開障礙物。在遊戲中玩家收集的金幣數目越多,奔跑的距離越長,玩家的得分就越高。orm

咱們終於實現的界面效果如圖所看到的,首先咱們來說一下游戲的原理,咱們這裏這裏採用的方法是路段固定,移動攝像機的方法。換句話說,當角色開始移動後,攝像機和場景尾隨角色緩緩向右移動。對象

當角色跑完每一個路段距離的2/3時。計算下一路段的位置,並在該位置生成一個新的路段,這樣在遊戲場景中可以產生無限遠的路段,當某一路段離開攝像機視野時,立刻將其銷燬。於此同一時候,咱們在每一個路段上隨機產生障礙物和金幣。而後對角色作碰撞檢測就能夠。



         2、角色控制

     角色控制這裏,咱們僅僅關注角色的狀態,即角色是處於奔跑狀態仍是死亡狀態。經過這一狀態,咱們針對角色採取不一樣的處理方式。假設角色處於奔跑狀態,則更新角色位置、攝像機位置、背景位置,不然角色將在被障礙物撞到之後倒地死亡。

咱們來一塊兒看如下的腳本:

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	//定義角色移動速度
	public float mMoveSpeed=2.5F;

	//攝像機
	private Transform mCamera;
	//背景圖片
	private Transform mBackground;

	//角色是否在奔跑
	private bool isRuning=true;
	//場景中路段總數目
	private int mCount=1;

	//路段預設
	public GameObject CubeWay;

	//死亡動畫播放次數
	private int DeathCount=0;

	//收集的金幣數目
	private int mCoinCount=0;
	public int CoinCount {
		get {
			return mCoinCount;
		}
	}

	//當前奔跑距離
	private int mLength=0;
	public int Length {
		get {
			return mLength;
		}
	}

	//當前得分
	private int mGrade=0;
	public int Grade {
		get {
			return mGrade;
		}
	}

	void Start () 
	{
	    //獲取相機
		mCamera=Camera.main.transform;
		//獲取背景
		mBackground=GameObject.Find("Background").transform;
	}

	void Update () 
	{
		//假設角色處於奔跑狀態則移動角色、相機和場景
		if(isRuning)
		{
			Move();
			CreateCubeWay();
			Jump();
			UpdateData();
		}else
		{
			Death();
		}
	}

	/// <summary>
	/// 更新玩家的遊戲數據
	/// </summary>
	private void UpdateData()
	{
		//計算奔跑距離
		mLength=(int)((transform.position.x+25)*25);
		//計算玩家得分
		mGrade=(int)(mLength*0.8+mCoinCount*0.2);
	}


	///角色死亡
	private void Death()
	{
		//爲避免死亡動畫在每一幀都更新,使用DeathCount限制其運行
		if(DeathCount<=1)
		{
		   //播放死亡動畫
		   transform.animation.Play("Lose");
		   //次數+1
		   DeathCount+=1;
		   //保存當前記錄
		   //PlayerPrefs.SetInt("這裏填入一個惟一的值",Grade);
		}
	}

	private void Jump()
	{
		//這裏不能使用剛體結構,因此使用手動方法實現跳躍
		if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButton(0))
		{
			while(transform.position.y<=1)
			{
				float y=transform.position.y+0.02F;
				transform.position=new Vector3(transform.position.x,y,transform.position.z);
				transform.animation.Play("Jump");
			}
			StartCoroutine("Wait");
		}
	}

	IEnumerator Wait()
	{
		yield return new WaitForSeconds(0.8F);
		//角色落地繼續奔跑
		while(transform.position.y>0.125F)
		{
			float y=transform.position.y-0.02F;
			transform.position=new Vector3(transform.position.x,y,transform.position.z);
			transform.animation.Play("Run");
		}
	}

	//移動角色、相機和場景
	private void Move()
	{
		//讓角色從左到右開始奔跑
		transform.Translate(Vector3.forward * mMoveSpeed * Time.deltaTime);
		//移動攝像機
		mCamera.Translate(Vector3.right * mMoveSpeed * Time.deltaTime);
		//移動背景
		mBackground.Translate(Vector3.left * mMoveSpeed * Time.deltaTime);
	}

	//建立新的路段
	private void CreateCubeWay()
	{
		//當角色跑完一個路段的的2/3時,建立新的路段
		//用角色跑過的總距離計算前面n-1個路段的距離即爲在第n個路段上跑過的距離
		if(transform.position.x+30-(mCount-1)*50 >=50*2/3)
		{
			//克隆路段
			//這裏從第一個路段的位置開始計算新路段的距離
			GameObject mObject=(GameObject)Instantiate(CubeWay,new Vector3(-5F+mCount * 50F,0F,-2F),Quaternion.identity);
			mObject.transform.localScale=new Vector3(50F,0.25F,1F);
			//路段數加1
			mCount+=1;
		}
	}

	void OnTriggerEnter(Collider mCollider)
	{
		//假設碰到的是金幣,則金幣消失,金幣數目加1;
		if(mCollider.gameObject.tag=="Coin")
		{
			Destroy(mCollider.gameObject);
			mCoinCount+=1;
		}
		//假設碰到的是障礙物,則遊戲結束
		else if(mCollider.gameObject.tag=="Rock")
		{
			isRuning=false;
		}
	}
}
      在這裏咱們需要關注如下的內容:

      一、Update()方法及Move()、Jump()、CreateCubeWay()、Death()方法,因爲這是角色在奔跑過程當中的核心控制方法。

      二、CreateCubeWay()方法的做用是在玩家跑完每一個路段的2/3時,在指定的位置生成新的路段。

假設當前場景中共同擁有n個路段,玩家在每一個路段上奔跑的距離=用玩家從起點到當前位置的長度-前面n-1個路段的距離。經過這樣的方法咱們可以推斷玩家在每一個路段上的相對位置。在肯定了這個位置後,咱們將其與路段長度的2/3比較,假設大於或者等於這個距離,則生成新的路段。且第n+1個路段的位置等於第一個路段的位置+n個路段的總長度。由此,咱們就實現了在指定的位置生成新的路段,使場景中源源不斷的生成新的路段。

     三、玩家收集金幣和障礙物的碰撞檢測都是在OnTrigger方法中實現的,咱們使用了一個bool類型的標識變量isRuning來表示角色的狀態,此狀態直接影響Update()方法的運行,你們可以從代碼中本身去尋找。

     四、這裏角色的跳躍是經過腳本模擬出來的,因爲這裏使用剛體彷佛不能實現博主想實現的那種效果,你們可以參考Jump()方法。


   
 3、場景佈設

    這裏咱們2D平面做爲遊戲的背景。使用NGUI來顯示界面文字內容。

在Unity3D場景中使用NGUI需要相機和Anchor設置爲同一層級,並設置相機的景深,這樣兩個相機系統都能工做了。路段CubeWay是一個預設體Cube,負責在CubeWay上生成金幣和障礙物。該對象關聯在Player腳本上。

玩家角色是一個3D的人物模型。終於場景佈設效果如圖所看到的:



    4、預設定義

   在這個遊戲中需要重用的對象有路段CubeWay、金幣Coin、障礙物Rock,咱們分別來看他們的腳本:

using UnityEngine;
using System.Collections;

public class CubeWay : MonoBehaviour {

	//在道路上顯示的金幣、障礙物
	public GameObject[] mObjects;


	void Start () 
	{

	   //在每段路段上隨機產生20到50個物品
	   int mCount=Random.Range(20,50);
	   for(int i=0;i<mCount;i++)
	   {
		  Instantiate(mObjects[0],new Vector3(Random.Range(this.transform.position.x-25,this.transform.position.x+25),1F,-2F),
			            Quaternion.Euler(new Vector3(90F,180F,0F)));
	   }
	   //在每段路段上隨機產生5到10個障礙物
	   mCount=Random.Range(5,10);
	   for(int i=0;i<mCount;i++)
	   {
		  Instantiate(mObjects[1],new Vector3(Random.Range(this.transform.position.x-25,this.transform.position.x+25),0.5F,-2F),
				        Quaternion.Euler(new Vector3(90F,180F,0F)));
	   }
	}

	//當離開攝像機視野時立刻銷燬
	void OnBecameInvisible()
	{
		Destroy(this.gameObject);
	}

}

using UnityEngine;
using System.Collections;

public class Coin : MonoBehaviour {

	//這裏是一個控制金幣旋轉的腳本

	void Update () 
	{
		transform.Rotate(Vector3.forward * 50F * Time.deltaTime);
	}

	//當離開攝像機視野時立刻銷燬
	void OnBecameInvisible()
	{
		Destroy(this.gameObject);
	}
}

using UnityEngine;
using System.Collections;

public class Rock : MonoBehaviour {

	//當離開攝像機視野時立刻銷燬
	void OnBecameInvisible()
	{
		Destroy(this.gameObject);
	}
}

     當中CubeWay就是一個Cube、Coin是一個圓柱體,爲了讓金幣看起來好看點,咱們讓金幣在空中旋轉起來、Rock就是一個平面貼圖。

這裏Rock、Coin將綁定到CubeWay的mObjects。

    

    五、遊戲管理

   最後是界面的數據更新啦,腳本定義例如如下:

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

	//遊戲界面根節點
	private Transform GameUI;
	//玩家
	private Transform mPlayer;
	//界面金幣數及距離
	private Transform mCoins;
	private Transform mLength;

	void Start () 
	{
		GameUI=GameObject.Find("2DUI").transform;
		mPlayer=GameObject.Find("People").transform;
		mCoins=GameUI.FindChild("Anchor/Panel/Coins").transform;
		mLength=GameUI.FindChild("Anchor/Panel/Length").transform;
	}

	void Update () 
	{
		mCoins.GetComponent<UILabel>().text="金幣:" + mPlayer.GetComponent<Player>().CoinCount;
		mLength.GetComponent<UILabel>().text="距離:" + mPlayer.GetComponent<Player>().Length;
	}
}

     好了,到現在整個遊戲已經解說完了,相信你們已經火燒眉毛地想看看終於的效果了。好。咱們一塊兒來看看吧:




         但願今天的內容你們可以喜歡,但願你們繼續支持和關注個人博客,假設咱們對今天的樣例稍做改動,就可以實現3D版的跑酷,經典的《神廟逃亡》遊戲就是基於Unity3D遊戲引擎開發的。



         每日箴言:要有美好的但願,並盡心盡力去追求;要有遠大的夢想,並盡心盡力去實現。




   喜歡個人博客請記住個人名字:秦元培,個人博客地址是blog.csdn.net/qinyuanpei
   轉載請註明出處,本文做者:秦元培,本文出處:http://blog.csdn.net/qinyuanpei/article/details/25510579

  源代碼下載

   

  



相關文章
相關標籤/搜索