1. 程式人生 > >Unity實戰 RTS3D即時戰略遊戲開發(三)

Unity實戰 RTS3D即時戰略遊戲開發(三)

     大家好,我是Zander,我們接著來開發Rts3D即時戰略遊戲開發。上一章我們為場景添加了Manager,以及玩家初始化資訊。

下面我們來完成以下功能:導航網格的設定、攝像機的操控、以及製作單位預設。

     在 遊戲中,我們需要限制玩家的可到達區域,不能到山上或水裡移動,這個功能我們可以採用導航就可以完成。在Unity中,導航網格在地形上比較明顯,它能辨識哪些路面可走,哪些不可走,AI可以利用導航進行尋路,從一個點到另外一個點,並避開障礙。下面我們在Unity中設定一下,Window-》Navigation,在Hierarchy 中選中Terrain,然後再Navigation中選中Bake選項,下面有個BakedAgentSize選項,(其實Agent就是在一個地形上行動的單位,例如玩家或者NPC,我們需要為它指定一些資訊,例如寬高、爬坡的坡度

),我們來設定一下BakedAgentSize的屬性


設定完後,點選右下角Bake進行烘培,圖中的藍色部分就是可行走區域。

      地圖導航設定好了,我們現在來設定新增一個控制攝像機移動的指令碼CameraCradle,並把指令碼新增到MainCamera物件上,

指令碼如下:

using UnityEngine;
using System.Collections;

public class CameraCradle : MonoBehaviour {

	public float Speed = 20;  //camera的移動速度

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		transform.Translate (
			Input.GetAxis ("Horizontal") * Speed * Time.deltaTime,
			Input.GetAxis ("Vertical") * Speed * Time.deltaTime,
			0);
	}
}


      現在我們來製作單位預設,在第一章上傳的資源中Resources -》  Content1中  找到Model 和Texture ,然後把他們匯入Uinty中,

把DroneUnit 託人到Hierarchy中 ,如果它的Rotation不是(0,0,0),那麼把它改成(0,0,0),並且把它自帶的Animator元件給刪除掉,然後把Textures下的Material0 拖拽到DroneUnit單位上,在Assets 下新建一個Prefabs的資料夾,並把DroneUnit 物件拖到Prefabs資料夾下,這樣DroneUnit的預設就做好了,最後在Hierarchy中把DroneUnit刪除掉

然後返回的Hierarchy中,找到Manager,在RTSManager元件上,把DroneUnit分別拖到Player1 和Player2 的StartingUnits的位置


然後我們開啟RTSManager指令碼編寫Player的初始化,為了獲取全部StartingUnits,我們先取得每一個Players,因此需要雙重的Foreach迴圈,在Start方法中:

	void Start () {
		Current = this;
		foreach (var p in Players) {
			foreach (var u in p.StartingUnits)
			{
				GameObject.Instantiate(u, p.Location.position, p.Location.rotation);
			}
		}
	}
怎麼表示選中一個單位呢,這裡我們用一個繞它旋轉的圖片表示,資源可以在下載的Resources中content2中找到,我們把資源拖到專案的Textures中命名Selected,然後在Materials中新建一個材質球,並命名為Selection,並選一個新的shader ,shader-》Unlit-》Transparent,然後把Selected圖片拖到新建的材質球上,這樣就做好了Selection材質球



然後重新把DroneUnit預設拖到場景中,在DroneUnit下新建一個子物體Quad,並把它的Scale設為10,Rotation 設定為(-90,0,0),把Selection材質球拖拽到Quad上,這樣就可以顯示出來了


我們再寫一個Rotate指令碼,使quad能旋轉起來,

using UnityEngine;
using System.Collections;

public class Rotate : MonoBehaviour {
	public Vector3 Rotation = Vector3.zero;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		transform.Rotate (Rotation * Time.deltaTime);
	}
}

最後把指令碼拖拽到Quad上,並在檢視面板上把Rotate中的Rotation值設定一下


好了,這一章的內容就到這裡了.專案原始碼:連結:http://pan.baidu.com/s/1kV4ot6Z 密碼:15ug

,歡迎大家加入QQ群:280993838  或者關注我的公眾號