Unity3D塔防開發流程

Unity3D塔防開發流程

配置環境及場景搭建

編程語言:C#,略懂些許設計模式,如果不了解設計模式,BUG More

開發工具:Unity3D編輯器、Visual Studio編譯器

開發建議:

了解Unity3D燈光,音頻,物理,粒子特效,動畫,NGUI,UGUI模塊參數

了解Unity3D Network網絡模塊參數

了解Unity3D原生GUI

地形創建

鼠標左鍵單機Hierarchy面板中的Create

鼠標移動觸摸3D Object

鼠標左鍵單機Cube

瀏覽Scene視圖中的Cube對象

鼠標左鍵單機Cube對象

鼠標左鍵單機Cube對象的一條數軸并移動

鼠標左鍵單機Inspector中的Transform組件右側的設置圖標

鼠標移動觸摸Resert

鼠標左鍵單機Resert進行重置Cube對象的位置,旋轉角度,大小縮放

鼠標左鍵單機 Hierarchy面板中的Cube對象

觸發鍵盤Ctrl同時觸發D鍵進行自動復制Cube對象

鼠標左鍵單機Scene視圖中的Cube對象中的一條數軸并移動

繼續移動并瀏覽Inspector視圖中Transform組件中的x,y,z

繼續移動并設置Inspector視圖中Transform組件中的軸x,y,z一個值

停歇移動

鼠標左鍵單機Cube對象

觸發鍵盤Ctrl同時觸發D鍵進行自動復制對象

鼠標左鍵單機Scene視圖中的Cube對象中的一條數軸并移動

繼續移動并瀏覽Inspector視圖中Transform組件中的x,y,z

繼續移動并設置Inspector視圖中Transform組件中的x,y,z

繼續移動并保持x,y,z的值為n(推薦1.5開始,依次乘2)

停歇移動并重復復制Cube直到Cube數量達到所需要塔防網格一列個數(推薦10個)

鼠標左鍵單機Scene視圖或Hierarchy視圖中Cube對象同時觸發鍵盤中的Ctrl鍵

持續觸發Ctrl鍵,松下鼠標左鍵

持續觸發Ctrl鍵,鼠標左鍵依次單機其它的Cube對象

松下Ctrl鍵

觸發Ctrl鍵同時觸發D鍵復制Cube對象

松下鍵盤與鼠標

鼠標左鍵單機Scene視圖中Cube對象中的一條數軸同時進行移動一條數軸

松下鼠標左鍵,瀏覽Inspector視圖中的x,y,z

調節Inspector視圖中的x,y,z的值,(推薦1.5開始,依次乘2)

鼠標左鍵單機Cube對象

持續單機并觸發鍵盤Ctrl鍵與

松下鼠標左鍵,鼠標左鍵依次單機目前一列Cube

松下鼠標左鍵,觸發鍵盤Ctrl鍵與D鍵進行復制Cube對象

復制Cube n列(推薦10列)

檢測每列/每行Cube在Inspector視圖中Transform組件中的x,y,z的值

檢測每一軸是否成某倍數依次相增

第1步地形構建完成,喝杯水休息1分鐘

地形設計

鼠標左鍵單機Scene視圖中的Cube

持續單機鼠標,并觸發鍵盤Ctrl鍵

松下鼠標,持續觸發Ctrl鍵進行選擇Scene視圖中的Cube對象

鼠標右鍵單機Cube對象

松下鼠標

鼠標移動觸摸Delete

鼠標左鍵單機Delete刪除當前選擇的Cube對象

松下鼠標左鍵

鼠標左鍵單機Hierarchy視圖中的一個Cube對象

持續單機,并觸發鍵盤Ctrl鍵與D鍵進行復制2次

松下鼠標,鼠標左鍵單機新復制的2個對象

松下鼠標,觸發鍵盤F2鍵

鍵盤輸入字符為新復制2個對象的名稱,不能為中文(推薦StartPoint,EndPoint)

松下鼠標與鍵盤

單機project視圖中的Create

鼠標移動觸摸Material并單機創建Material

將創建的Material材質拖拽到Cube

觸發鍵盤Ctrl鍵與鍵盤D鍵復制Material材質

分別給材質重命名(重命名鼠標單機Hierarchy中的對象按下F2鍵)

并設置Inspector面板中的材質顏色

地形統一

創建1個空物體選中所有的Cube拖拽到空物體

收拉空物體

道路創建

創建兩個Cube并重置Transform組件

一個作為Start開始位置,用于存放妖怪生成的Cube

一個作為End終點位置,用于銷毀妖怪與判斷游戲失敗的Cube

創建兩個材質賦值給這兩個對象

計算之前被刪除Cube的個數及行數,通過計算在被刪除Cube的位置重新創建新的Cube并不留空格,只留與非道路的Cube處留0.5~1的空格

道路設計

道路設計部分需要使用一些數學運算,雖然都是些簡單的運算,但是在設計過程中確實不能出一點差錯,這一步一定要認真計算,認真留意.

鼠標左鍵單機新創建的Cube,并將Cube向道路內側稍微移動使其剛好與它在同一行的代碼平齊

道路統一

(1)創建一個空物體,將所有的道路物體拖拽到空物體中并收拉

核查地形

重復檢驗上述建造地形是否足夠精致,或是否滿足自己需求,

調整地形與道路

妖怪生成移動管理

妖怪創建

鼠標左鍵單機Hierarchy面板中的Create

鼠標移動觸摸3DObject

鼠標左鍵單機3DObject中的Sphere創建一個球體

鼠標左鍵單機Hierarchy面板中的Sphere觸發鍵盤F2鍵并重命名為Enemy(自由命名)

在project面板中創建一個存放預設體的文件夾,將這個球體拖入預設體

在project面板中創建一個存放材質的文件夾,并創建一個材質拖拽到球體上

鼠標左鍵單機Hierarchy面板中的球體

鼠標左鍵單機球體的Inspector面板中的完成Apply表示更新完成

妖怪設計

將妖怪的對象從project面板拖拽到Hierarchy面板中

創建新的材質,并復制妖怪,將材質拖拽到妖怪上

自定義修改調整妖怪的參數,設置成自己的需求

妖怪路徑點設置

計算道路上的轉彎處

道路上每一道轉換處等于一個轉彎點,這個點即是路徑點

在每個路徑點的中央創建一個空對象(建議使用Cube對象)之后完成后刪除Mesh組件即可

路徑點完成后再建立一個空物體,將所有的路徑點拖拽到空物體中并收拉

創建一個腳本控制路徑點

腳本中創建一個路徑點的數組,其中數組的長度為子對象的數量,通常用transform.GetChildCount()獲取子對象的數量長度

腳本綁定到路徑點的管理對象上(路徑點的父對象)

在Awake方法中獲取路徑點父對象的子物體也就是獲取路徑點,但是因為腳本綁定在父對象上,所以要獲取子對象.

獲取到子對象以后使用一個for循環遍歷這個數組,遍歷條件一般是i不大于數組的長度,也就是不大于子對象的數量,遍歷一般是獲取到數組的下標,使數組的下標等于子對象的的排序數量,例如positions[i]=transform.GetChild(i);

路徑點管理完成

4.妖怪路徑點腳本控制與妖怪移動原理

(1)創建一個腳本用于管理妖怪所有功能及信息

(2)獲取路徑點的數組,并給它賦一個值

(3)創建一個新的方法,用于使妖怪移動到路徑點,并在Update方法中調用

(4)定義一個index,表示數組的下標,用于判斷屬于數組的哪一個下標

(5)首先進行一個判斷,如果index超出數組的長度,則返回.如果index沒有超出,將會繼續執行移動方法中的程序,妖怪移動到下一路徑點一般==下一個路徑點的位置減去當前所在位置的方向乘以一個速度變量和時間變量,例如(position[index].position-tranform.position).normalized*speed*Time.deltatime

(6)上述路徑點表示從開始位置移動到第一個下標路徑點的位置,移動結束就會卡在第一個路徑點的位置,但是后面還有路徑點,所以不能讓妖怪卡在一個方向,要轉換方向,轉換方向使用Distance,例如判斷移動路徑點的方向為Vector3.Distance(positions[index].position,tranform.position)<0.2f,當條件成立即index++

5.核查妖怪參數與路徑腳本

開發塔防“四沖程”

“進氣沖程”:導入炮塔

在計算機系統中查詢到Unity塔防素材

鼠標左鍵雙擊Unity塔防素材

素材成功導入到Unity

在Unity Project面板中創建一個文件夾

將素材拖拽到文件夾中

“壓縮沖程”:重整炮塔

查看存儲炮塔的文件夾,查詢炮塔及其它素材的參數

拖拽一個炮塔到Scene視圖上進行修改

將炮塔放置在Cube上的適當位置

鼠標左鍵單機炮塔

調整炮塔的Inspector面板中的參數

給炮塔添加材質

給炮塔的子對象添加材質

在Project面板中的Prefab預設體文件夾創建一個同炮塔名的文件夾

將完成的炮塔移動到文件夾中

另外創建其它的炮塔

“作工沖程”:設計炮塔

界面視覺設計:

1)鼠標左鍵單機Hierarchy面板中的Create

2)鼠標移動觸摸UI一欄

3)鼠標左鍵單機RawImage創建一個RawImage對象

4)鼠標左鍵單機RawImage對象在Inspector面板中的Textrue旁邊的圓圈圖標更替一個材質

5)鼠標左鍵單機Hierarchy面板中的Create

6)鼠標移動觸摸到UI一欄

7)鼠標左鍵單機Text創建一個Text對象

8)并設置Text對象在Inspector面板中的text屬性

9)創建一個空物體封裝Text對象和RawImage對象并收拉

10)復制三個,并賦給新復制的兩個新的材質[其它的炮塔]

界面選擇設計:

為復制的三個游戲對象添加一個Toggle組件

并為它們添加一個image對象,并將image在inspector面板的材質替換成一個圓形材質

每個對象的圓形材質分別拖入他們自己的toggle組件中的Graphic屬性中

界面單選設計:

1)三個游戲對象的空的父物體拖拽到它們的Group屬性中

“排氣沖程”:開發炮塔

數據存儲:

創建一個腳本,用于存儲炮塔的數據,表示炮塔數據存儲類

因為是存儲炮塔的數據,僅需要有一個類即可,不需要繼承于monobehavior接口,

也不要使用unity自帶的函數,所以接口繼承和Start和Update兩個函數可以刪除

創建一個GameObject類型的游戲對象表示炮塔實例化后的對象

創建一個int類型的變量作為炮塔實例化所需要的價格

創建一個GameObject類型的游戲對象表示炮塔升級后的對象

創建一個int類型的變量作為炮塔升級所需要的價格

此腳本由于是用于存儲數據的類,所以不需要綁定給任何游戲對象,僅需存儲在工程資源文件夾中即可

監聽炮塔:

創建一個腳本,用于監聽炮塔選擇界面的點擊選擇事件

引用UGUI的命名空間(using UnityEngzine.UI)

創建三個公有化炮塔數據類的游戲對象表示三種炮塔

創建三個方法,每一個方法表示選擇一個炮塔

創建一個私有化炮塔數據類的游戲對象表示選中的炮塔

在每個方法中都加上一個bool類型的參數表示是否選擇此炮塔

在每個方法中都進行一個if語句判斷,判斷是否選擇炮塔,判斷選擇為true

在每個方法的每個條件中,給私有化用來選中炮塔的游戲對象賦一個值,該值為該炮塔所對應的游戲對象,完成后保存記錄

創建一個空物體并清除還原Transform組件

將腳本綁定給這個空物體

將這個空物體拖拽到Hierarchy面板中炮塔選擇界面的Inspector面板中的toggle響應,并調用炮塔對應的方法

點火校正:

1)在每個方法中的每個條件中加入一個Debug.Log輸出一下炮塔的游戲對象,確定是否相符,如不是,檢查并修改

六、塔防“發動機”

1.檢測鼠標觸發地面網格

(1)打開炮塔選擇事件的腳本(監聽炮塔的腳本)

(2)在Start方法中判斷一次鼠標左鍵點擊事件if(Input.GetMouseButtonDown(0)){}

(3)在這個條件中創建一條射線并賦值,這個值為主攝像機發射到屏幕的鼠標位置

Ray ray = Camera.main.IsScreenPointToRay(Input.MousePosition);

在這個條件中創建一個射線碰撞對象

Raycasthit hit;

在這個條件中創建一個bool類型的變量表示是否碰撞到某某對象,意思就是檢測碰撞到了什么對象層,在Unity中每個游戲對象的Inspector面板上都有一個Layer,這個表示層,點擊即可選擇層,也可以創建一個層,之后選擇這個層

bool iscollider = Physics.Raycast(射線,這個一般是out hit,最大區域,一般是1000,LayerMask.GetMask(“獲取層級的名稱”));

因為Unity自帶一個檢測UI的事件類EventSystem,所以需要在射線檢測前加上一個條件,條件判斷未檢測到UI事件類,并且調用EventSystem的命名空間using UnityEngzine.EventSystem;

If(EventSystem.current.IsPointerToRay()==false){將上列的射線檢測剪切粘貼到此處}

實例化創建炮塔

創建一個腳本,用于放置炮塔到Cube上也就是Cube上的一個空物體

在這個腳本中聲明一個GameObject類的游戲對象

在這個腳本中,創建一個實例化炮塔的方法,并帶上一個GameObject類的對象參數

實例化炮塔

GameObject.Instaniate(炮塔的對象不是這個方法的參數,transform.position,transform.rotation) as GameObject;并將這條語句作為一個值給聲明的游戲賦值

返回選擇炮塔和射線檢測的腳本,在射線檢測后聲明一個炮塔類的對象,并獲取到射線碰撞對象的實例化炮塔的組件也就是獲取到實例化炮塔的類

例如:MapCube mapcube=collider.gameObject.GetComponent();

用一個if語句判斷mapcube中的那個游戲對象,也就是實例化炮塔類中的那個游戲對象不等于空的情況,如果等于空,實例化創建炮塔,如果不等于空,打開升級出售UI界面

例如If(TurretGo!=null){創建炮塔} ? else{升級出售}

創建炮塔只需要調用實例化炮塔類中的實例化炮塔的方法,并給方法傳入參數,傳如參數是之前聲明的炮塔數據類的當前選擇的炮塔

例如:mapcube.Create(TurretToggle);

但是創建炮塔后,炮塔的價格和炮塔的金幣并未起到作用,因此下面便是炮塔的金幣控制方法

金幣管理

創建金幣: 在Hierarchy面板中創建一個text對象,表示金幣的對象,用于顯示當前金幣,繼續在這個腳本中引用using UnityEngzine.UI這個命名空間,聲明一個Text類型的金幣對象,并在Start方法中獲取到這個對象的Text組件

例如:public Text gold; void Start(){ gold=gold.GetComponent(); }

創建金幣管理方法:在這個腳本中創建一個方法,用于存儲與控制金幣,等同于金幣的入口生產點,創建一個變量,表示金幣的初始值,可以設置一個初始值,在金幣管理方法中添加一個int類型的參數表示更新金幣的變量,不需要賦初始值,方法中表示金幣的對象+“.text”等于”¥”+初始金幣,初始金幣+=更新金幣

例如:public int money;void Money(int changeMoney){gold.text=”¥”+money; money+=changeMoney;}

設置炮塔金幣購買條件:在射線檢測后創建炮塔處為創建炮塔的執行語句添加一個if條件判斷,判斷如果金幣大于或等于當前選擇炮塔中的炮塔數據類中購買價格,才會創建炮塔,否則播放一個金幣不足動畫的提示

例如:if(money>=selectedTurretObject.price){mapcube.Create(selectedTurretObject);}

炮塔初始建造特效實例與銷毀

在實例化炮塔的那個類中,聲明一個游戲對象,并在Unity3DInspector面板中給游戲對象賦值,該值為炮塔的建造的特效

例如:public GameObject bulitTurretEffect;

在實例化炮塔的那個類里實例化炮塔的方法中實例化炮塔的執行語句下一行執行生成建造特效,并在一定時間內銷毀

例如:bulitTurretEffect = GameObject.Instaniate(聲明的炮塔建造特效,transform.position,transform.rotation)as GameObject;Destroy(bulitTurretEffect,多久銷毀時間);

建造特效:鼠標左鍵單機Hierarchy面板中的Create,創建一個Particle System對象,這個對象指的是Unity3D的粒子對象,Unity3D的特效一般從此處調節這個對象的Inspector面板的Particle System組件的參數,創建好特效,將特效拖拽到Project面板中的Prefab文件夾下

炮塔射擊觸發檢測空間設計

將炮塔拖拽到Hierarchy面板進行設置

開啟炮塔的觸發檢測,鼠標左鍵單機勾選炮塔的Inspector面板中的Is Trigger

調節觸發區域大小,判斷妖怪是否進入觸發區域,如果進入執行一些事件

創建一個腳本,在OnTriggerEnter方法中,添加一個Collider類型的參數

將這個腳本綁定炮塔

設置妖怪,炮塔等場景各個游戲對象的tag,不能相同

在OnTriggerEnter方法中用一個if語句進行判斷,如果tag為妖怪的tag,則表示妖怪進入了觸發區域,作出一些響應.

聲明一個List集合,用于存儲進入觸發區域的妖怪,如果妖怪進入,則這個集合調用它的add方法,將碰撞的妖怪添加到集合中

在OnTriggerExit方法中用一個if語句進行判斷,如果tag為妖怪的tag,則表示妖怪離開了觸發區域,如果妖怪離開了觸發區域,則這個集合將會調用removeat方法將其移除該集合

Debug.Log調試觸發方法及內部的條件語句,確保無BUG

5.炮塔射擊對象與炮彈的實例化及相關處理

將炮塔拖拽到Hierarchy面板中進行設置

創建一個空物體并重置Transform組件

調整空物體的位置正好處于炮塔炮口的位置

將這個空物體拖拽到炮塔對象內,作為炮塔的子對象,并取名為炮塔炮口位置相關名稱

創建一個球體對象,重置Transform組件并添加剛體組件且剛體取消重力,碰撞體開啟觸發檢測

設置球體的大小,符合自己的規范即可,另外創建或導入另外兩個炮塔的炮彈對象

打開炮塔觸發檢測的腳本

聲明炮塔的炮彈對象并賦值

例如:public GameObject bulletObject;

實例化射擊對象,創建一個方法,在這個方法中實例化炮彈對象

例如:bulletObject = GameObject.Instaniate(炮彈對象,tranform.position,transform.rotation) as GameObject;

炮彈目標點:

在炮塔觸發腳本中,創建一個Transform類型的變量作為目標點

創建一個設置目標點的方法SetTarget

在這個方法中添加一個Transform類型的參數變量

例如:public Transform target; public void SetTarget(Transform target){ this.target=target; }

炮彈碰撞處理腳本

1)為炮彈添加Collider組件

2)啟用觸發器勾選isTrigger

3)創建一個炮彈觸發處理的腳本并賦值給炮彈

4)在炮彈觸發處理腳本中的OnTriggerEnter方法中添加一個Collider類型的參數

5)用一個if語句進行判斷碰撞器Collider參數對象的碰撞對象的tag屬性為妖怪的tag

6)如果tag為妖怪標簽,調用炮彈銷毀的方法及其它妖怪處理以及炮彈銷毀特效等處理

七、塔防“底盤”

1.妖怪血量管理

(1)妖怪血量:

1)創建一個UGUI Slider對象

2)設置對象在妖怪正上方

(2)妖怪血量處理:

1)在妖怪數據腳本中添加一個血量屬性

2)并在腳本中添加一個Slider類型的對象并獲取Slider組件和場景中的對象

3)創建一個Slider血條跟隨妖怪的方法

4)在設置位置同步妖怪位置正上方一段距離

5)創建一個Slider血量減少與增加管理的方法

6)在這個方法參數列表中添加一個血量消耗值的參數

并在方法中賦值給妖怪的血量屬性

7)在炮塔碰撞處理腳本中的觸發檢測后調用血量控制的方法

2.炮塔升級處理

/*炮塔升級:射線檢測碰撞,如果鼠標左鍵碰撞到炮塔對象彈出炮塔升級面板*/

/*鼠標左鍵點擊炮塔升級面板中的炮塔升級按鈕銷毀當前炮塔,生成升級的炮塔并增加血量控制的參數減少值*/

炮塔出售處理

/炮塔出售:射線檢測碰撞,如果鼠標左鍵碰撞到炮塔對象彈出炮塔升級面板,點擊炮塔升級面板中的炮塔出售按鈕進行銷毀當前選擇的炮塔/

/**/

拓展功能

局域網:詳情Unity Component 中 Network主要組件

Network Manger:網絡通信核心組件,必備,可設置網絡服務端IP地址與端口號等

Network HUD:網絡通信測試組件,通常用于測試運行游戲階段

Network Identity:同步對象到局域網,其它客戶端連接到服務端后同步生成的對象

Network Transform:同步對象位置到局域網

Network Animation:同步對象動畫狀態到局域網

AI:詳情Unity Windows中導航烘焙窗口,用于實現使某對象進行自動尋路等操作

Light:詳情 Unity Windows中燈光烘焙窗口,用于烘培燈光及場景為材質

Json 與 Xml:詳情 一個數據存儲的文本標記語言,用于存儲數據

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容