unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)
目錄
unity2d游戲開發(fā)系列教程:一、環(huán)境安裝
unity2d游戲開發(fā)系列教程:二、新建工程并熟悉Unity編輯器常用功能
unity2d游戲開發(fā)系列教程:三、場景布置,增加怪物和機關
原文下載
https://download.csdn.net/download/g313105910/19148579
ReferenceGuide2DGamekit中文版
?
目錄
一、介紹
二、埃倫(主角)
三、敵人
四、健康管理
五、壓板
六、傷害系統(tǒng)
七、移動平臺
八、交互系統(tǒng)
九、存檔系統(tǒng)
十、收集器
十一、刷敵人
十二、游戲工具包高級主題
十三、隨機音頻播放器
十四、腳本
十五、音頻
十六、視效
十七、數(shù)據(jù)持久性
十八、對象池
十九、行為樹
一、介紹
2D Game Kit允許你在Unity中創(chuàng)建2D平臺游戲玩法和謎題,無需代碼。以下是你可以在工具包中用來創(chuàng)建游戲的每個組件的文檔。您將找到組件的功能定義以及這些組件中的設置。
如何使用這個文檔
使用該文檔的最好方法是像參考指南一樣,根據(jù)組件或設置進行搜索,以了解更多信息。要學習如何使用Game Kit的基礎知識,請查看入門指南,它將提供一個良好的使用工具包的基礎。 這個項目中包含的Explorer示例游戲使用了我們?yōu)橛螒蛲娣ㄌ峁┑乃薪M件。要想獲得使用組件的靈感或例子,請查看場景文件夾中的場景1到5。 重要的術語和概念用鏈接突出顯示,如果您想了解有關它們的更多信息
二、埃倫(主角)
標準的運動控制器
| 移動 | A向左移動D向右移動 |
| 跳 | Space空格 |
| 蹲伏 | S |
| 射擊 | O |
| 近戰(zhàn) | K |
| 激活 | E |
| 通過平臺 | S或Space空格 |
她使用Sprite Renderer, Animator, Capsule Collider 2D和Rigidbody 2D組件以及一些自定義腳本組合在一起。
角色控制器2D
角色控制器2D腳本用于在遵從物理原理的情況下移動Ellen。
Grounded Raycast Distance:
這些是角色可以站在上面的層。將其設置為平臺層允許Ellen在該層上的任何其他東西上行走,比如地面
Grounded Raycast Distance:
地面光線投射距離:默認設置:0.1這決定了Ellen是否站在地面上,從她的碰撞器底部使用光線投射。增加這個數(shù)字會讓艾倫認為地面更高,她的跳躍著陸會受到影響。降低這個數(shù)字會讓艾倫認為地面更低,她會看起來像在墜落。
玩家輸入
在這個項目中,你可以很容易地為一個玩家重新映射輸入,玩家輸入腳本告訴Unity的輸入管理器,你的游戲應該使用什么控制。無論是鍵盤、鼠標還是Xbox One控制器,你都可以在這個組件上更改游戲的按鍵或按鈕。請注意,這個組件的任何變化都是每個場景,因為你正在改變Ellen Prefab的副本(實例)。如果你的游戲中有多個關卡,并且你已經改變了Ellen的Player Input,你必須點擊Ellen實例頂部的Apply按鈕。這將改變設置上的原始預制和確保任何其他實例的Ellen在其他水平有相同的輸入。
我們已經提供了一個方便的提醒,讓你知道如果你正在看一個實例,如果你在播放器輸入組件上看到這個警告,單擊選擇預制,這將帶你編輯預制。?
玩家輸入的設置如下:
輸入類型:
默認設置:鼠標和鍵盤輸入類型的選項,選項是鼠標和鍵盤或控制器。這個套件的默認控制器類型是Xbox One。
● Pause(暫停):用于暫停游戲的按鍵。
〇鍵:按下鍵盤上的鍵進行動作。
〇控制器按鈕:按下控制器按鈕進行動作。
〇Enabled:動作是開還是關。勾選是開,未勾選是關。
● Interact(交互):用于與環(huán)境交互的按鍵或按鈕。
〇鍵:按下鍵盤上的鍵進行動作。
〇控制器按鈕:按下控制器按鈕進行動作。
〇Enabled:動作是開還是關。勾選是開,未勾選是關。
● Melee Attack(近戰(zhàn)攻擊):按鍵或按鈕用于艾倫擺動她的權杖。
〇鍵:按下鍵盤上的鍵進行動作。
〇控制器按鈕:按下控制器按鈕進行動作。
〇Enabled:動作是開還是關。勾選是開,未勾選是關。
●Ranged Attack(遠程攻擊):按鍵或按鈕用于艾倫射擊她的槍。
〇鍵:按下鍵盤上的鍵進行動作。
〇控制器按鈕:按下控制器按鈕進行動作。
〇Enabled:動作是開還是關。勾選是開,未勾選是關。
●Jump(跳躍):用于跳躍的按鍵或按鈕。
〇鍵:按下鍵盤上的鍵進行動作。
〇控制器按鈕:按下控制器按鈕進行動作。
〇Enabled:動作是開還是關。勾選是開,未勾選是關。
●Horizontal(水平移動):按下鍵盤或模擬桿向左或向右移動。
〇正:按下鍵盤上的鍵向右移動字符(X軸為正)。
〇負:按下鍵盤上的鍵向左移動字符(X軸為負)。
〇控制器軸:控制器模擬桿或按鈕左右移動。
●Vertical(垂直移動):按下鍵盤或模擬桿,使其蹲伏或向上看。
〇正:按下鍵盤上的鍵,使相機向上移動(Y軸為正)。
〇負值:按下鍵盤上的鍵使其蹲伏(Y軸為負值)。
〇控制器軸:控制器模擬搖桿或按鈕,可仰視和蹲伏。
●Persistence Type and Data Tag(持久性類型和數(shù)據(jù)標簽):有關數(shù)據(jù)持久性系統(tǒng)如何工作的信息,請參見數(shù)據(jù)持久性部分。是否啟用近戰(zhàn)攻擊和遠程攻擊是該類持久化的數(shù)據(jù)。
Player Character(玩家角色) 玩家角色腳本保存了Ellen在游戲中的所有行為信息,這里的設置會影響移動,音頻和攝像機。如果你改變任何設置,它將只適用于該場景的預制實例,如果你希望改變發(fā)生在你的游戲的所有級別,單擊應用在實例的頂部的改變,以應用到Ellen預制。?
參考:默認情況下你不需要調整這個。這些是所有的參考腳本需要功能,他們完全發(fā)現(xiàn)在艾倫預制件。
〇Sprite Renderer:用于確定角色面對的方向。
〇Damageable(可傷害性):用于確定角色受傷時的移動方向。
〇Melee Damager(近戰(zhàn)傷害):用于在適當?shù)膭赢嬛袉⒂?禁用傷害。
〇Facing Left/Right Bullet Spawn Point(面對左/右子彈刷出點):用于射擊時刷出子彈的位置。
〇Bullet Pool(子彈池):用于生成子彈。
〇Camera Follow Target(攝像機跟隨目標):用于控制攝像機相對于角色的位置,這允許行為,如在快速移動時從角色保持領先。
移動設置:這些設置用于控制Ellen在地面上移動的速度。
〇Max Speed(最大移動速度):默認設置:7 Ellen能跑多快。
〇Ground Acceleration(地面加速度):默認設置:100 Ellen在地面上達到最大速度的速度。
〇Ground Deceleration(地面減速):默認設置:100 Ellen在沒有輸入時減速到停止的速度。
〇Pushing Speed Proportion(推箱速度比例):默認設置:0.5 Ellen推箱子時的最大速度比例。
空中設置:這些設置是為了控制Ellen在不落地(在空中)時的移動速度。
〇Airborne Accel Proportion(機載加速比例):默認設置:1 Ellen不接地時使用的地面加速比例。
〇Airborne Decel Proportion(機載減速比例):默認設置:0.5 Ellen不接地時使用的地面減速比例。
〇Gravity(重力):默認設置:38 Ellen向地面加速的速度。這也會影響跳躍高度。
〇Jump Speed(跳躍速度):默認設置:16.5 Ellen起跳速度。這將影響跳躍高度。
〇Jump Abort Speed Reduction(跳躍中止減速):默認設置:100當跳躍按鈕被釋放時,跳躍值被降低的速度。這將影響跳躍高度。
受傷設置:這些設置決定了Ellen受傷時的動作和出現(xiàn)方式。有關Ellen如何對損害作出反應的其他設置,請參閱本文件關于損害系統(tǒng)的章節(jié)。
〇傷害跳躍角度:默認設置:45當Ellen受傷時,她會從傷害的來源跳向空中。這是她從水平方向跳起的角度。
〇傷害跳躍速度:默認設置:8埃倫在受到傷害時的起跳速度
〇閃爍持續(xù)時間:默認設置:0.05當Ellen受傷時,她的精靈快速打開和關閉產生閃爍的效果。這個持續(xù)時間設置了精靈在閃爍時停留的時間。
近戰(zhàn)設置:這些設置如何埃倫移動時,她擺動她的權杖。關于艾倫如何損害的其他設置,請看這篇文件中損害制度的章節(jié)。
〇近戰(zhàn)攻擊沖刺速度:默認設置:15 Ellen用權杖攻擊時水平沖刺的距離。
〇Dash While Airborne:默認設置:啟用一個可選的設置,在空中攻擊時啟用一個Dash。這將設置水平移動,而不是增加它,如果艾倫已經在空中水平移動,這個設置可能不會被注意到。
?
遠程設置:這些設置與Ellen開槍時產生的子彈有關。
〇射擊每秒:默認設置:2每秒可以產生的最大子彈數(shù)量。
〇子彈速度:默認設置:30子彈產生時的速度。
〇握槍超時時間:默認設置:1.5 Ellen停止射擊后,還能堅持多長時間。
〇右子彈刷出點動畫:默認設置:啟用子彈刷出點動畫跟隨槍的位置,默認情況下Ellen資產在右邊有一個子彈刷出位置。當她面對左邊時,我們將鏡像刷出點動畫。如果你想添加自己面向左側的動畫精靈,請取消選中該框。
音頻設置:我們隨機播放Ellen的各種動作的音頻,這樣聽起來就不會重復。這些是對RandomAudioPlayers的引用,它可以播放音頻。這些不應該被編輯。
〇腳步聲音頻播放器:當Ellen做一個步驟時使用的隨機音頻播放器。
〇Landing AudioPlayer:當Ellen在空中落地時使用的RandomAudioPlayer。
〇Hurt AudioPlayer:當Ellen損壞時使用的隨機音頻播放器。
〇混戰(zhàn)音頻播放器:當艾倫進行混戰(zhàn)攻擊時使用的隨機音頻播放器。
〇遠程攻擊音頻播放器:當Ellen做遠程攻擊時使用的隨機音頻播放器。
相機跟隨設置:不是直接以艾倫為相機中心位置,而是動態(tài)跟隨到艾倫的新位置。這些設置控制偏移量。
〇相機水平朝向偏移量:默認設置:2目標在Ellen前水平偏移量。
〇相機水平速度偏移量:默認設置:0.2根據(jù)Ellen的水平速度移動目標的數(shù)量。
〇相機垂直輸入偏移量:默認設置:2目標垂直偏移量是基于玩家的輸入。
〇最大水平阻尼時間:默認值:0.4目標從無偏移量到所需水平偏移量所需要的時間。
〇最大垂直增量阻尼時間:默認值:0.6目標從無偏移量到所需的垂直偏移量的垂直移動所需要的時間。
〇垂直相機偏移延遲:默認設置:1在目標開始垂直移動之前,需要按住向上或向下輸入鍵的時間,以便玩家可以“向上”或“向下”。
雜項設置:用于其他設置的文件夾。
精靈最初的面孔:默認設置:禁用這是指精靈資產本身沒有任何翻轉。它可以用來確定子彈應該從哪個點產生。
三、敵人
敵人的行為
敵人行為組件適用于游戲中的兩個敵人Chomper和Spitter。這兩個敵人都使用相同的組件,只是使用了不同的設置。
●Sprite Faces Left:如果Sprite Faces Left,則選中復選框
●運動
〇速度:敵人的速度。
〇重力:它下落的速度。
●參考
〇射彈預制:敵人的射彈預制可以發(fā)射(只針對射彈敵人)。
●掃描設置
〇視野方向:敵人可以探測到玩家的方向。這是用場景視圖中的綠色圓圈描繪的
〇View FOV:敵人的視野范圍。這是用場景視圖中的綠色圓圈描繪的
視野距離:敵人能看到玩家的距離。這是用場景視圖中的綠色圓圈描繪的
〇目標消失前的時間:當玩家超出射程后,敵人停止追逐或搜索玩家的時間。
近戰(zhàn)攻擊信息,僅適用于近戰(zhàn)敵人,如Chomper。
〇近戰(zhàn)距離:敵人能夠擊中玩家的距離。
〇近戰(zhàn)傷害:對敵人的傷害腳本。更多信息請參見損壞系統(tǒng)。
〇接觸傷害:對敵人的接觸傷害腳本,這個腳本通過接觸敵人造成傷害。
〇攻擊沖刺:當敵人攻擊時,啟動或禁用沖刺。
〇攻擊力:當玩家受到攻擊時所施加的力量,這是在玩家受到攻擊后將其擊退的原因。
遠程攻擊信息,僅適用于像Spitter這樣的遠程敵人。
〇射擊起點:射出物被發(fā)射的位置。
〇射擊角度:射出物從原點被射擊的角度。
〇Shoot Force:投射物所受的力。
〇射速:射彈的速度。
●音頻
〇射擊音頻:射擊時使用的隨機音頻播放器。
〇近戰(zhàn)攻擊音頻:當近戰(zhàn)攻擊發(fā)生時使用的隨機音頻播放器。
〇Die Audio:當敵人死亡時使用的隨機audioplayer。
〇Foot Step Audio: RandomAudioPlayer用于敵人的腳步。
●Misc
〇閃爍持續(xù)時間:如果敵人的生命值大于1,當它被擊中時,它將閃爍表示命中。該值表示閃爍持續(xù)的時間。
四、健康管理
?
健康
生命拾取是當玩家走過它時能夠提供生命值的預制件。它可以在Prefabs < Interactables中找到
●Health Amount(生命值):盒子所提供的生命值
●On Giving Health (關于提供生命值):當與盒子相撞時事件會觸發(fā),玩家將獲得生命值。
五、壓板
壓力板是自動設置的,可以檢測到走到它上面的玩家,它會亮起來并播放聲音。你可以連接壓力墊來觸發(fā)諸如開門之類的事件。
●Activation Type(激活類型):如何激活按鈕。下面的選項將根據(jù)此設置更改。
〇Item Count:激活壓力墊上的對象數(shù)量。
〇Mass(質量):激活墊子所需物體的重量。
●Required Count:在On Pressed & On Release中觸發(fā)事件所需的物品數(shù)量。如果激活類型更改,則此更改為Required Mass。
(可選)當平臺不被按下時,要改變的精靈。只有當Boxes選項擁有Sprite Renderer時才需要
●激活盒精靈:(可選)精靈切換,當平臺按下。只有當Boxes選項擁有Sprite Renderer時才需要
(可選)將被推到pressuread上的盒子列表,當它們被推下去時,精靈將改變?yōu)槟切┰贒eactivated Box Sprite和Activated Box Sprite中。
●On Pressed():當壓力墊被按下時發(fā)生的事件,這取決于正確的Required Count或Required Mass
●On Release():當壓力墊釋放時發(fā)生的事件,這取決于正確的Required Count或Required Mass
六、傷害系統(tǒng)
套件中的損害系統(tǒng)由兩個組件組成:損害器和可損害腳本。添加一個Damager腳本到一個對象,使它能夠對任何具有damable組件的對象造成損害,只要它們的設置匹配
傷害
“損壞組件”具有與“可損壞組件”和“不可損壞組件”發(fā)生碰撞的事件。生命值的計算是自動完成的,這些事件是用來觸發(fā)游戲玩法改變或視覺效果。Damager組件不需要碰撞器,它會在場景視圖中顯示一個盒子小裝置,你可以用它來調整它的大小和位置。
●傷害:它將對一個可傷害的(如Ellen或Chomper)造成的傷害。
●偏移量和大小:這是定義Damager碰撞框的兩個參數(shù)。這是在場景視圖的尖峰上顯示的外框,當它碰撞時會造成損壞。
●基于精靈朝向的偏移:這個設置允許損害器根據(jù)精靈朝向的方向改變位置。這是在Ellen上使用的,可以讓損害者根據(jù)她面對的方向向左或向右撇。
●Sprite Renderer:上述設置使用的Sprite Renderer。
●Can Hit Triggers:切換Damager是否會與被選中的觸發(fā)器發(fā)生沖突,或者完全忽略被選中的觸發(fā)器。
●Force Respawn:如果啟用,包含damage的物體將立即重生到最近的檢查點(Acid預制在玩家掉進水里時使用這個功能)。
忽略無敵:如果開啟,傷害者仍然會對傷害值進行“攻擊”,但不會移除生命值(Acid會使用這個屬性,這樣玩家就會一直重生,即使他們在之前的敵人攻擊中是無敵的)。
●可命中的層:傷害者會造成傷害的層。沒有被選中的圖層將不會受到傷害。
●On damage Hit:當物體被擊中并且有一個damage組件時,事件將在這里播放。
非傷害攻擊:當物體被擊中但沒有傷害組件時,事件將在這里播放。
可被損壞的
可損壞組件接收對象與附加在其上的Damager組件碰撞造成的損壞。當受到傷害、生命值恢復、生命值改變或生命值完全耗盡(死亡)時,會發(fā)生事件。與Damager相反,damable組件依賴于附加在同一個游戲對象上的碰撞器,所以除了向對象添加damable Script之外,不要忘記添加碰撞器來定義可命中區(qū)域。
●Starting Health:健康級別。傷害者將在每次攻擊時移除他們的生命值。當這個值達到0時,可傷害物品就會死亡。
●傷害后無懈可擊:這種傷害在沖擊后的一段時間內變得無懈可擊。
●刀傷持續(xù)時間:在受到傷害后認為刀傷不受傷害的時間(僅適用于之前設置)。
●Disable On Death:該設置將在死亡時禁用GameObject。
●中心偏移:用于定義可損壞物體的中心位置(偏移(0,0,0)表示它位于游戲對象的位置)。用于計算到Damager的距離。
●On Take Damage:當物體受到傷害時觸發(fā)事件。
●On Die:事件觸發(fā)時的對象
獲得生命值:當一個物體獲得新的生命值時觸發(fā)的事件。
●持久類型:參見持久數(shù)據(jù)
●數(shù)據(jù)標簽:參見持久數(shù)據(jù)
檢查點
檢查點在Prefabs < SceneControl文件夾中
每當玩家進入一個檢查點碰撞器時,這個檢查點就會被激活。當他們掉進水里(或被任何帶有原力重生設置的傷害者擊中),他們將在檢查點重新出現(xiàn)。注意:玩家會重新出現(xiàn)在游戲對象的位置上,所以要確保它在地面上?
七、移動平臺
要在場景中創(chuàng)建一個移動平臺,請將移動平臺預制件Prefabs < Interactables從項目視圖拖到場景視圖中。它包括一個移動平臺腳本,Box Collider 2D, Rigidbody 2D,平臺效應器2D和一個平臺捕獲腳本。
平臺捕手腳本允許平臺上的對象自由移動。而且不需要調整。在場景視圖中,你會看到紅色的虛線和變換工具在末端,這表示平臺將采取的路徑和它的目的地。在任意方向拖動變換工具來改變路徑和目標。
●平臺捕手:自動在平臺上找到平臺捕手腳本,無需更改。
●預覽位置:允許你瀏覽和預覽平臺將去的場景視圖。
●開始移動:當啟用時,平臺將在關卡加載時開始移動。如果未勾選,則需要由事件觸發(fā)。
〇When becoming visible:該選項僅在平臺設置為Start Moving時才會出現(xiàn)。如果這是啟用的,平臺將只在屏幕上可見時才開始移動,而不是在關卡加載時。
●循環(huán):定義平臺到達路徑終點時的反應。
〇BACK_FORTH:平臺在起點和終點之間來回移動。
〇LOOP:一旦平臺到達路徑的最后一個點,它將直線移動到起點,重新開始循環(huán),形成一個循環(huán)。
〇ONCE:到達終點時平臺停止。
●速度:默認設置:2平臺移動的速度(單位為每秒)。
?
●添加節(jié)點:此按鈕將添加另一個節(jié)點,或目標點到您的平臺的路徑。平臺從一個節(jié)點移動到另一個節(jié)點。
〇節(jié)點0:表示平臺位置。不能刪除。沒有什么立場是不能改變的。
■等待時間:平臺等待移動到下一個節(jié)點的時間。
〇節(jié)點1:第一個路徑和目的地,默認情況下總是包含。
■位置:節(jié)點的位置(本地空間)。
■刪除:刪除節(jié)點的按鈕。
■等待時間:平臺等待移動到下一個節(jié)點的時間。在場景視圖中可以看到這樣一個帶有兩個節(jié)點的平臺。
八、交互系統(tǒng)
2D碰撞系統(tǒng)
?
玩家可以通過多個名為InteractOn*的組件與游戲對象進行互動:
●InteractOnCollision2D
●InteractOnTrigger2D
●InteractOnButton2D
交互依賴于擁有Collider 2D組件的對象。碰撞器是物體周圍的一個看不見的區(qū)域,可以檢測到什么東西接觸或進入它。我們在套件中使用的主要是Box (Box Collider 2D), Capsule (Capsule Collider 2D)和Circle (Circle Collider 2D)。這些都在套件中提供的各種預碼件中為你設置好了。如果你想在對象上添加新的交互類型或創(chuàng)建自己的交互類型,取決于你使用的是以下哪個InteractOn組件,你必須注意Collider上的Is Trigger復選框,你想讓交互的對象。我們將注意到Collider將需要處于一個特定的InteractOn組件的狀態(tài)。
碰撞2D互動
這用于在物體碰撞器接觸時觸發(fā)事件。
?
●腳本:正在使用的腳本名稱(不能更改)。
●圖層:只有選中圖層上的對象才會觸發(fā)事件。
●On Collision():這里列出的事件將在屬于設置圖層的對象發(fā)生碰撞時發(fā)生。(如果你自己設置,不需要在碰撞器上啟用is Trigger)
互動觸發(fā)2D
當一個對象進入碰撞器時觸發(fā)事件,當一個對象存在碰撞器時觸發(fā)更多事件。(如果制作自己的,請確保碰撞器組件上啟用Is Trigger)。
●腳本:正在使用的腳本名稱(不能更改)。
●圖層:只有選中圖層上的對象才會觸發(fā)事件。
●On Enter():這里列出的事件將發(fā)生,當一個對象屬于設置層進入觸發(fā)器。
●On Exit():這里列出的事件將發(fā)生,當一個對象屬于設置層退出觸發(fā)器。
●庫存檢查:這允許你確保事件只發(fā)生在當一個進入觸發(fā)器的對象有一個對象在它的庫存。例如,當玩家進入觸發(fā)區(qū)域時,只有在他們的庫存中有鑰匙時才會打開一扇門。
〇Size:默認設置為0,增加這個數(shù)字來增加觸發(fā)器應該期望的庫存數(shù)量。
元素0:第一次庫存檢查。
■庫存物品(Inventory Items):它期望在與它碰撞的對象庫存中的對象。
●大小:你希望觸發(fā)對象在其庫存中攜帶的物品數(shù)量。
元素0:需要的第一個庫存物品。這必須匹配預期的名稱,這些名稱列在庫存系統(tǒng)部分。
●On has Item():當對象持有庫存物品中設置的所有物品時觸發(fā)事件。
●On Does Not Have Item():當物品不包含所有物品時觸發(fā)事件。
按鈕互動2D
當一個對象在觸發(fā)區(qū)域內,玩家按下游戲中的互動按鈕時,這用于觸發(fā)事件(關于互動按鈕的更多信息,請參閱玩家輸入部分)。(如果你自己制作,請確保在Collider組件上啟用Is Trigger)
●腳本:正在使用的腳本名稱(不能更改)。
●圖層:只有選中圖層上的對象才會觸發(fā)事件。
●On Enter():這里列出的事件將發(fā)生,當一個對象屬于設置層進入觸發(fā)器。
●On Exit():這里列出的事件將發(fā)生,當一個對象屬于設置層退出觸發(fā)器。
●庫存檢查:這允許你確保事件只發(fā)生當一個對象進入觸發(fā)器和按下交互按鈕有一個對象在其庫存。例如,當玩家進入觸發(fā)器并按下互動區(qū)域時,只有在他們的庫存中有鑰匙時才會打開一扇門。
〇Size:默認設置為0,增加這個數(shù)字來增加觸發(fā)器應該期望的庫存數(shù)量。
元素0:第一次庫存檢查。
■庫存物品(Inventory Items):它期望在與它碰撞的對象庫存中的對象。
●大小:你希望觸發(fā)對象在其庫存中攜帶的物品數(shù)量。
元素0:需要的第一個庫存物品。這必須匹配預期的名稱,這些名稱列在庫存系統(tǒng)部分。
●On Button Press():當交互按鈕被按下時觸發(fā)的事件。?
九、存檔系統(tǒng)
存貨系統(tǒng)由兩部分組成,存貨控制部分和存貨項目。庫存控制器應該添加到持有庫存的對象中。應該將庫存物品腳本添加到正在收集的物品中。例如Ellen(庫存控制器)將收集一個Key(庫存項目)庫存控制器能夠自動收集與碰撞器的接觸庫存項目,并定義了發(fā)生的行動,當給定的對象被接收或刪除。
存檔控制器
這個組件有一個條目的每個項目,可以攜帶在您的庫存。組件可以存在于角色、箱子或商店中。
?
庫存事件:事件列表發(fā)生在特定的對象添加到庫存。增加這里的數(shù)字以添加新的事件(提示:您可以通過右鍵單擊列表中的名稱并選擇delete Array Element來刪除事件)。
〇鍵:是代表物品的唯一標識符,例如鑰匙,槍,職員。這必須與您希望收集的物品上的物品清單組件中的密鑰相匹配。庫存只能保存每個對象的一個實例;如果一個具有相同Key的對象已經在庫存中,庫存控制器中的添加事件將不會被調用。
〇OnAdd:當物品被添加到庫存時觸發(fā)的事件。
〇OnRemove:當物品從庫存中移除時觸發(fā)的事件。
〇數(shù)據(jù)設置:參見Persistent Data文檔獲取更多信息。
不要混淆道具的Key(游戲邦注:即分配給道具的唯一標識符)和Key(游戲邦注:我們喜歡在游戲中使用的收集對象)。文檔中使用粗體表示惟一標識符,以避免混淆。
物品庫存
任何可以在庫存中攜帶的項目都需要一個庫存項目組件。這指定項目的關鍵,一個音頻剪輯和哪個層可以拾取項目。InventoryItem是添加到游戲對象中的組件,代表該項目。它還需要一個圓形碰撞器2D,如果缺少將自動添加一個。該碰撞器被設置為觸發(fā)器,用于檢測玩家何時觸摸對象。游戲對象的狀態(tài)(活動或不活動)被保存,所以當場景重新加載和玩家重新進入區(qū)域時它保持不變。
●庫存鍵:物品的唯一名稱(如Key1),用于跟蹤物品是否已經擁有。
●層:收集物品的對象所在的層。
●Disable On Enter:該設置在對象被收集后禁用該對象。
●剪輯:收集項目時播放的音頻剪輯。如果為空,則不會播放剪輯。
●數(shù)據(jù)設置:參見Persistent Data文檔獲取更多信息。
?代碼所在位置,如果想深入了解該功能是如何實現(xiàn)的,可以查看腳本代碼
十、收集器
該組件用于根據(jù)已收集的物品數(shù)量改變對象的精靈。
一旦收集了所有的項目,就會調用On Unlocked函數(shù)。在下面的示例中,要收集的三個庫存項是Key1、Key2和Key3。每當收集到庫存中的一個道具時,精靈便會發(fā)生改變。
Interact On Trigger 2D和Interact On Button 2D也可以檢查該組件是否滿足要求。
●Required Inventory Item Keys:需要收集的物品的Keys列表。一旦ALL被收集,它將觸發(fā)On Unlocked事件。
〇Size:需要收集的條目數(shù)量。大小增加了下面元素的數(shù)量。
〇Element:被收集對象的Key。
●解鎖狀態(tài)精靈:收集道具時將顯示的精靈列表。精靈會按順序改變。
〇大小:精靈插槽的數(shù)量。
〇元素:收集物品時改變對象外觀的精靈。
●Key Director Trigger:如果設置了一個Director序列,則會觸發(fā)一個Director序列。
Character Inventory:持有庫存控制器的對象,該組件用于跟蹤集合。
●On Unlocked():當所有道具都被收集并改變精靈時事件會觸發(fā)。
●數(shù)據(jù)設置:參見Persistent Data文檔獲取更多信息。
十一、刷敵人
敵人預制體在Prefabs < Enemies中,這將控制產生更多的敵人在您的場景中。
●預制件:敵人的預制件將被生成。
●初始池數(shù):這決定了將在池中持有的敵人數(shù)量。在這里輸入一個很好的值等于需要生成的并發(fā)敵人的數(shù)量。
●Total Enemies to be spawn:產卵者將產卵的敵人數(shù)量,直到它停止產卵的敵人。
●Concurrent Enemies to be spawn:產卵者同時在世界上產卵的敵人數(shù)量。例如,如果這是5個,總共10個敵人,產卵者將產卵5個敵人。一旦一個被殺死,它會產生一個新的,除非它已經產生了10個。
刷出區(qū)域:這是刷出點周圍刷出區(qū)域的范圍。敵人將在該區(qū)域內隨機產生。這可以通過刷出點周圍的白色矩形小工具在場景視圖中顯示出來。
?
●Spawn Delay(刷出延遲:從一個敵人死亡到下一個敵人出現(xiàn)的時間間隔。)
●Removal Delay(移除延遲:敵人被送回池中的時間)
十二、游戲工具包高級主題
后面章節(jié)包含了關于Game Kit系統(tǒng)的更深入的信息,可能需要更多的Unity知識,一些主題需要c#知識。
十三、隨機音頻播放器
這個腳本允許您從用戶分配的剪輯列表中選擇一個隨機的聲音播放。你可以看到它被用來控制Ellen預制組件上的不同聲音(在Ellen的SoundSources子游戲對象下檢查)。例如,查看FootstepSource,您可以看到它定義了一個包含四個腳步聲音的列表,腳步將隨機選擇這些聲音,并添加了音調隨機化。這個例子還包括使用覆蓋每個特定的瓷磚-一個覆蓋的異形廢墟瓷磚播放不同的腳步聲,如果艾倫走在草地表面。
十四、腳本
腳本,RandomAudioPlayer PlayRandomSound函數(shù)是由其他腳本調用時需要播放聲音(例如引發(fā)的腳步聲音PlayFootstep在該函數(shù),函數(shù)本身是由動畫剪輯的幀調用腳與地面接觸的地方。)這個功能可以使用TileBase去選擇覆蓋聲音(游戲邦注:例如腳步將使用玩家所開啟的當前表面,子彈碰撞將使用它剛剛碰撞過的表面的Tile)。
十五、音頻
AudioSurface是一個腳本可以添加到任何對象,不是tilemap(如移動或轉移平臺,移動框等),允許您定義瓷磚應該使用音頻播放器時尋找一個覆蓋的聲音(如一塊石頭盒子會使用一個AudioSurface外星人瓷磚瓷磚的設置,所以走在上面會觸發(fā)“石階”的聲音,而不是正常的“地面”的聲音。)
十六、視效
此組件用于從池中生成VFX預制件,停用它們,并在生命周期過期后將它們返回到池中。
VFXController是項目文件夾中的一個資產(在資源文件夾內),它允許你列出游戲將使用的所有視覺特效。它將創(chuàng)建一個使用這些視覺特效的實例池,移動在游戲開始時實例化視覺特效預制的成本,而不是每次使用它們。像PlayerController或StateMachineBehaviour TriggerVFX這樣的腳本將通過名稱觸發(fā)這些VFX。
和音頻播放器一樣,它也允許你定義每個貼圖的覆蓋。例如,你可以為每個腳步設置一個覆蓋的視覺效果,這取決于腳步在哪個表面上著陸。(對于VFXController附帶這個項目,你可以看到一個例子在DustPuff視效,使用一個覆蓋當玩家走在石頭)最重要的磚是由觸發(fā)視效的腳本(例如腳步將當前的表面,一顆子彈擊中表面會通過瓷磚的表面,可以在非貼圖對象上設置覆蓋貼圖;請參考聲音文檔Sounds.txt,了解如何設置覆蓋游戲對象對應的內容。
十七、數(shù)據(jù)持久性
數(shù)據(jù)持久性系統(tǒng)允許你在游戲過程中保存一些數(shù)據(jù),保存一些關于玩家已經做了什么的信息。如果沒有它,因為每個區(qū)域都是一個新場景,進入一個區(qū)域將加載該區(qū)域的“默認”狀態(tài)(游戲邦注:如它是在編輯器中設計的),但玩家所采取的任何永久行動(如抓鑰匙或武器)都將被“取消”。
使用編輯器
數(shù)據(jù)系統(tǒng)通過一個名為IDataPersister的腳本接口工作。
實現(xiàn)這個接口的對象(如內置的InventoryItem, HubDoor, PlayerInput等)可以從PersistentDataManager中讀寫數(shù)據(jù)
實現(xiàn)該接口的單行為在檢查器的底部有一個Data Settings折疊頁。設置包括:
數(shù)據(jù)標簽:這是對象的唯一標識符,由管理器用來將數(shù)據(jù)鏈接到該對象。它可以是任何東西:一些內置組件使用一個自動生成的唯一ID,但它也可以是一個手動輸入的名稱,如“Zone_3_key”或“Quest_Item_Card”等。
持久性類型:對象可以是:
〇Don't Persist:允許禁用持久性,對于需要在場景改變時重置的對象很有用(例如,你可能想在重新啟動關卡時再次關閉一扇門)
〇只讀:只能讀數(shù)據(jù),不能寫數(shù)據(jù)。一種使用方法是讓一個只寫的對象(見下面)具有相同的數(shù)據(jù)標簽。這個對象
將使用另一個對象為該標簽寫的數(shù)據(jù),但不能重寫它。
〇Write Only:只能寫數(shù)據(jù),不能讀取數(shù)據(jù)。請參閱上面的只讀使用示例。
〇讀寫:最常見的使用情況,對象讀取和寫入其給定的數(shù)據(jù)標簽數(shù)據(jù)
數(shù)據(jù)保存加載周期
SaveData對場景中IDataPersister的所有實例在場景過渡出來之前被調用。LoadData在加載新場景后,在場景中IDataPersister的所有實例上被調用。可以在任何時候通過調用persistentdatammanager . setdirty (this)來手動保存數(shù)據(jù)。
代碼中的使用示例
在代碼中使用數(shù)據(jù)管理器的方式是,在啟用/啟動數(shù)據(jù)管理器時讀取相關數(shù)據(jù)并對其作出反應。例如,庫存項將其狀態(tài)寫入持久化數(shù)據(jù)(活動或非活動)。因此,當場景加載時,庫存項將檢索與其標簽相關聯(lián)的數(shù)據(jù)。如果保存了一個假值,這意味著對象已經被檢索,它可以禁用自己。另一個例子是保存狀態(tài)的門。當場景加載并讀取數(shù)據(jù)時,它可以將自己設置為所需的狀態(tài)(例如打開/關閉)。
場景與smb
SceneLinkedSMB是一個類,它擴展了statemachinebehaviour的工作方式。它允許Animator狀態(tài)機中的Behaviour保持對MonoBehaviour的引用。
雖然scenelinkedsmb可以在任何需要引用特定MonoBehaviour的地方使用,但它們的設計理念是將邏輯和功能分離。
動畫控制器包含一個狀態(tài)機,它是控制執(zhí)行流的理想狀態(tài)機。
使用scenelinkedsmb,你可以調用MonoBehaviour上的公共函數(shù),允許它控制功能,因為它可以更容易地獲得場景引用。通過這種方式,scenelinkedsmb可以控制作為狀態(tài)機的一部分的邏輯和monobehaviour,它們被鏈接到控制功能。
使用SceneLinkedSMB
?
要使用SceneLinkedSMB編寫一個新的行為,你需要:
●讓你的新類繼承SceneLinkedSMB。由于類是Generic,您需要指定它將持有的Monobehaviour的類型。例如:public class EnemyAttackState: SceneLinkedSMB<Enemy>
●使用該狀態(tài)初始化每個對象的動畫。在上面的例子中,我們可以在Enemy類的Start()函數(shù)中添加以下一行:SceneLinkedSMB<Enemy>。初始化(動畫師,這個);在這個例子中,animator是一個指向狀態(tài)為SceneLinkedSMB<Enemy> on的動畫器的引用。注意,即使在多個狀態(tài)下有10個不同的腳本,也只需要調用一次。只要他們都繼承自SceneLinkedSMB<Enemy>他們都會被初始化。
●覆蓋任何你需要的狀態(tài)函數(shù)。更多的功能被添加到SceneLinkedSMB,以允許更具體的控制何時功能發(fā)生。在你的類中,你可以訪問一個名為m_MonoBehaviour的受保護成員,它與類的泛型類型參數(shù)具有相同的類型。繼續(xù)我們的例子,m_MonoBehaviour將是敵人類型。
例子
Enemy.cs public class Enemy: MonoBehaviour { Animator animator; void Start() { animator = GetComponent<Animator>(); SceneLinkedSMB<Enemy>.Initialise(animator, this);}public void TrickerAttack() { // ... } } EnemyAttackState.cs public class EnemyAttackState: SceneLinkedSMB<Enemy> { public override void OnSLStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // m_MonoBehaviour is of type Enemy m_MonoBehaviour.TrickerAttack (); } }十八、對象池
Gamekit為其某些系統(tǒng)使用了可擴展的對象池系統(tǒng)。下面的解釋只適用于那些希望擴展系統(tǒng)以供自己使用的人,而不需要使用Gamekit的知識。?
為了擴展對象池系統(tǒng),必須創(chuàng)建兩個類——一個繼承自ObjectPool,另一個繼承自PoolObject。繼承自ObjectPool的類是池本身,而繼承自PoolObject的類是池中每個預制件的包裝器。這兩個類由泛型類型鏈接。ObjectPool和PoolObject必須具有相同的兩種泛型類型:繼承自ObjectPool的類和按此順序繼承自PoolObject的類。這很容易用一個例子來說明:
public class SpaceshipPool: ObjectPool<SpaceshipPool, Spaceship> { … } public class Spaceship: PoolObject<SpaceshipPool, Spaceship> { … }這樣一來,池就知道它包含的對象的類型,而對象也知道它們所屬的池的類型。這些類可以有第三種泛型類型。只有當您希望為PoolObject的WakeUp函數(shù)提供一個參數(shù)時,才需要這樣做,當PoolObject從池中取出時,該函數(shù)將被調用。例如,當我們的飛船被喚醒時,他們可能需要知道他們有多少燃料,所以可以有一個額外的浮子類型如下:
public class SpaceshipPool: ObjectPool<SpaceshipPool, Spaceship, float> { … } public class Spaceship: PoolObject<SpaceshipPool, Spaceship, float> { … }默認情況下,PoolObject有以下字段:
●inPool:這個bool值決定當前池子對象是在池中還是醒著。
實例:這個游戲對象是這個PoolObject包裝的實例化預制件。
objectPool:這是這個PoolObject所屬的對象池。它具有與該類的ObjectPool類型相同的類型。PoolObject還具有以下虛函數(shù):
●setreference:在PoolObject第一次創(chuàng)建時調用。它的目的是緩存引用,這樣當PoolObject被喚醒時就不需要收集它們,盡管它可以用于任何其他一次性設置。
●WakeUp:當PoolObject被喚醒并從池中收集時調用。它的目的是在每次使用PoolObject時執(zhí)行所需的任何設置。如果給類提供了第三個泛型參數(shù),那么可以使用該類型的參數(shù)調用WakeUp。
●Sleep:當PoolObject被返回到存儲池時調用。它的目的是在使用PoolObject之后執(zhí)行任何需要的清理。
●ReturnToPool:默認情況下,它簡單地將PoolObject返回到池中,但是如果需要其他功能,它可以被覆蓋。一個對象池是一個MonoBehaviour,因此可以添加到游戲對象中。默認情況下,它有以下字段:
●Prefab:這是一個對Prefab的引用,它將被實例化多次來創(chuàng)建池。
InitialPoolCount:將在Start方法中創(chuàng)建的PoolObjects的數(shù)量。
Pool:一個PoolObjects的列表。ObjectPool還具有以下功能:
●Start:這是初始池創(chuàng)建發(fā)生的地方。您應該注意,如果ObjectPool中有Start函數(shù),它將有效地隱藏基類版本。
●CreateNewPoolObject:當創(chuàng)建poolobject時調用,調用它們的setreference函數(shù),然后調用Sleep函數(shù)。它不是虛的,所以不能被覆蓋,但是它是受保護的,因此可以在繼承類中調用。
Pop:調用此函數(shù)從池中獲取一個PoolObject。默認情況下,它將搜索第一個inPool標志設置為true的對象并返回它。如果none為真,它將創(chuàng)建一個新的并返回它。它將在將要返回的任何PoolObject上調用WakeUp。這是虛擬的,可以被覆蓋。
●Push:調用此函數(shù)將一個PoolObject放回池中。默認情況下,它只是設置inPool標志并在PoolObject上調用Sleep,但它是虛擬的,可以被覆蓋。關于如何使用對象池系統(tǒng)的完整示例,請參見BulletPool文檔和腳本。
子彈池
子彈池MonoBehaviour是一個子彈對象的池,每一個都包裝了一個子彈預制的實例。BulletPool同時用于Ellen和敵人,但使用方式略有不同。對于Ellen,有一個BulletPool MonoBehaviour附加到父游戲對象,子彈預制設置為它的預制字段。BulletPool的另一個用途是在EnemyBehaviour類中。它使用GetObjectPool靜態(tài)函數(shù)來使用BulletPools,而不需要主動創(chuàng)建它們。
BulletPool類有以下字段:
●預制:這是你希望使用的子彈預制。
●初始池數(shù):這是多少子彈將創(chuàng)建在池開始。它應該和你期望一次使用的數(shù)量一樣多。如果需要更多,它們將在運行時創(chuàng)建。
●Pool:這是Pool中的子彈對象。這在檢查器中沒有顯示。
BulletPool類具有以下功能:
●Pop:使用此功能從池中獲得一個子彈對象。
●Push:使用此功能將子彈對象放回池中。
●GetObjectPool:這是一個靜態(tài)函數(shù),將找到一個適當?shù)淖訌棾亟o定的特定預制。當從池中獲得子彈時,它以子彈對象的形式出現(xiàn)。
BulletObject類有以下字段:
●InPool:這個特定的子彈是否在池中或被使用。
●實例:實例化的預制件。
ObjectPool:對該子彈對象所屬的子彈池的引用。
Transform:對實例的Transform組件的引用。
●Rigidbody2D:對實例的Rigidbody2D組件的引用。
SpriteRenderer:對SpriteRenderer組件實例的引用。
Bullet:引用實例的Bullet腳本。
BulletObject具有以下功能:
●WakeUp:這是由彈池調用Pop函數(shù)時調用的。
●Sleep:當Push函數(shù)被調用時,由BulletPool調用。
●ReturnToPool:當你完成一個特定的項目符號時,這個應該被調用。它將調用其BulletPool的Push函數(shù),從而調用其Sleep函數(shù)。
十九、行為樹
注意:這是一個只使用腳本的系統(tǒng),你至少需要了解腳本和c#如何在Unity中工作的基本知識,才能理解它是如何工作和如何使用它
顧名思義,行為樹是一種使用動作樹編碼行為的方法。它們在Game Kit中用于控制AI的敵人行為和boss戰(zhàn)斗序列。
下面是一個行為樹的可視化例子:
理論
在游戲的每次更新過程中,這棵樹都是“打勾”的,這意味著它將遍歷根節(jié)點的每個子節(jié)點,如果該節(jié)點有子節(jié)點,則進一步向下,等等。
每個節(jié)點都有關聯(lián)的動作,并將向其父節(jié)點返回三種狀態(tài)之一:
●Success:節(jié)點成功完成任務。
●Failure:節(jié)點任務失敗。
繼續(xù):節(jié)點還沒有完成任務。
返回的狀態(tài)由每個節(jié)點的父節(jié)點以不同的方式使用。
例如:
●如果當前子節(jié)點返回Failure或Success,選擇器將使下一個子節(jié)點處于活動狀態(tài);如果當前子節(jié)點返回Continue,則保持當前子節(jié)點為活動狀態(tài)。
測試節(jié)點將調用子節(jié)點,如果測試為真則返回子節(jié)點狀態(tài),如果測試為假則返回失敗而不調用子節(jié)點。
游戲裝備實現(xiàn)
行為樹在游戲工具包中的使用方式是通過腳本。下面是一個非常簡單的行為樹的例子:
首先,我們需要使用BTAI添加;在文件的頂部
Root aiRoot = BT.Root(); aiRoot.Do( BT.If(TestVisibleTarget).Do ( BT.Call(Aim), BT.Call(Shoot) ), BT.Sequence().Do(BT.Call(Walk),BT.Wait(5.0f),BT.Call(Turn),BT.Wait(1.0f),BT.Call(Turn)) );aiRoot應該作為成員存儲在類中,因為您需要在Update函數(shù)中調用aiRoot. tick(),以便可以執(zhí)行Tree操作。
讓我們來看看更新將如何在airroot. tick()中進行:
首先,我們測試TestVisibleTarget函數(shù)是否返回true。如果是,它將繼續(xù)執(zhí)行子進程,這些子進程將調用Aim和Shoot函數(shù)
●如果測試返回false, If節(jié)點將返回Failure,根節(jié)點將轉到下一個子節(jié)點。這是一個序列,它首先執(zhí)行它的第一個子節(jié)點
〇調用Walk函數(shù)。它返回Success,以便序列將下一個子節(jié)點設置為活動的并執(zhí)行它
〇執(zhí)行“Wait”節(jié)點。因為它必須等待5秒,并且是第一次調用,所以它還沒有到達等待時間,所以它將返回Continue
〇當序列從它的活動子節(jié)點接收到一個Continue狀態(tài)時,它不會改變活動子節(jié)點,所以它將在下一次更新時從該子節(jié)點開始
●一旦Wait節(jié)點更新到足夠的時間到達它的計時器,它將返回Success,這樣序列將轉到下一個子節(jié)點。
節(jié)點表
順序序列執(zhí)行
子節(jié)點一個接一個。如果子進程返回:
成功:該序列將在下一幀的下一個子幀上打勾。
失敗:序列將返回到下一幀的第一個子序列。
繼續(xù):序列將在下一幀再次調用該節(jié)點。
隨機序列
每次調用它時,從它的子列表中隨機執(zhí)行一個子節(jié)點。您可以在構造函數(shù)中指定一個權重列表,以int數(shù)組的形式應用于每個子對象,以使某些子對象更容易被選中。
選擇器
按順序執(zhí)行所有子節(jié)點,直到返回Success,然后退出,不執(zhí)行其余的子節(jié)點。如果沒有返回成功,則該節(jié)點將返回失敗。
呼叫
調用給定的函數(shù),它總是返回Success。
如果
?
調用給定函數(shù)。
如果返回true,則調用當前活動的子對象并返回其狀態(tài)。
否則,它將返回Failure而不調用子節(jié)點
循環(huán)
只要給定的函數(shù)返回true就繼續(xù)(所以當樹被選中時,它將再次從該節(jié)點開始,而不計算之前的所有節(jié)點)。
孩子們將一個接一個地被處死。
當函數(shù)返回false并且循環(huán)中斷時將返回Failure。
條件
如果給定的函數(shù)返回true,則該節(jié)點返回Success;如果給定的函數(shù)返回false,則返回Failure。
當與依賴于其子節(jié)點的結果的其他節(jié)點連接時有用(例如Sequence, Selector等)。
重復
將連續(xù)執(zhí)行所有子節(jié)點的給定次數(shù)。
始終返回Continue直到到達計數(shù),在計數(shù)中返回Success。
等待
將返回Continue,直到到達給定的時間(從第一次調用時開始),然后返回Success。觸發(fā)
允許在給定的動畫器中設置一個觸發(fā)器(如果最后一個參數(shù)設置為false,則取消觸發(fā)器)。總是返回成功。
SetBool
允許在給定的動畫中設置一個布爾參數(shù)的值。總是返回成功
SetActive
設置游戲對象的活動/非活動狀態(tài)。總是返回成功。
總結
以上是生活随笔為你收集整理的unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序:归并排序(C)
- 下一篇: 计算机信息的一般处理过程,信息一般处理过