Unity實戰 RTS3D即時戰略遊戲開發(三)
大家好,我是Zander,我們接著來開發Rts3D即時戰略遊戲開發。上一章我們為場景添加了Manager,以及玩家初始化資訊。
下面我們來完成以下功能:導航網格的設定、攝像機的操控、以及製作單位預設。
在 遊戲中,我們需要限制玩家的可到達區域,不能到山上或水裡移動,這個功能我們可以採用導航就可以完成。在Unity中,導航網格在地形上比較明顯,它能辨識哪些路面可走,哪些不可走,AI可以利用導航進行尋路,從一個點到另外一個點,並避開障礙。下面我們在Unity中設定一下,Window-》Navigation,在Hierarchy 中選中Terrain,然後再Navigation中選中Bake選項,下面有個BakedAgentSize選項,(其實Agent就是在一個地形上行動的單位,例如玩家或者NPC,我們需要為它指定一些資訊,例如寬高、爬坡的坡度
設定完後,點選右下角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 或者關注我的公眾號