日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)

發(fā)布時間:2023/12/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

unity2d游戲開發(fā)系列教程:一、環(huán)境安裝

unity2d游戲開發(fā)系列教程:二、新建工程并熟悉Unity編輯器常用功能

unity2d游戲開發(fā)系列教程:三、場景布置,增加怪物和機關(guān)

原文下載

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)建游戲的每個組件的文檔。您將找到組件的功能定義以及這些組件中的設(shè)置。

如何使用這個文檔

使用該文檔的最好方法是像參考指南一樣,根據(jù)組件或設(shè)置進行搜索,以了解更多信息。要學(xué)習(xí)如何使用Game Kit的基礎(chǔ)知識,請查看入門指南,它將提供一個良好的使用工具包的基礎(chǔ)。 這個項目中包含的Explorer示例游戲使用了我們?yōu)橛螒蛲娣ㄌ峁┑乃薪M件。要想獲得使用組件的靈感或例子,請查看場景文件夾中的場景1到5。 重要的術(shù)語和概念用鏈接突出顯示,如果您想了解有關(guān)它們的更多信息

二、埃倫(主角)

標(biāo)準(zhǔn)的運動控制器

移動

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:

這些是角色可以站在上面的層。將其設(shè)置為平臺層允許Ellen在該層上的任何其他東西上行走,比如地面

Grounded Raycast Distance:

地面光線投射距離:默認(rèn)設(shè)置:0.1這決定了Ellen是否站在地面上,從她的碰撞器底部使用光線投射。增加這個數(shù)字會讓艾倫認(rèn)為地面更高,她的跳躍著陸會受到影響。降低這個數(shù)字會讓艾倫認(rèn)為地面更低,她會看起來像在墜落。

玩家輸入

在這個項目中,你可以很容易地為一個玩家重新映射輸入,玩家輸入腳本告訴Unity的輸入管理器,你的游戲應(yīng)該使用什么控制。無論是鍵盤、鼠標(biāo)還是Xbox One控制器,你都可以在這個組件上更改游戲的按鍵或按鈕。請注意,這個組件的任何變化都是每個場景,因為你正在改變Ellen Prefab的副本(實例)。如果你的游戲中有多個關(guān)卡,并且你已經(jīng)改變了Ellen的Player Input,你必須點擊Ellen實例頂部的Apply按鈕。這將改變設(shè)置上的原始預(yù)制和確保任何其他實例的Ellen在其他水平有相同的輸入。

我們已經(jīng)提供了一個方便的提醒,讓你知道如果你正在看一個實例,如果你在播放器輸入組件上看到這個警告,單擊選擇預(yù)制,這將帶你編輯預(yù)制。?

玩家輸入的設(shè)置如下:

輸入類型:

默認(rèn)設(shè)置:鼠標(biāo)和鍵盤輸入類型的選項,選項是鼠標(biāo)和鍵盤或控制器。這個套件的默認(rèn)控制器類型是Xbox One。

● Pause(暫停):用于暫停游戲的按鍵。

〇鍵:按下鍵盤上的鍵進行動作。

〇控制器按鈕:按下控制器按鈕進行動作。

〇Enabled:動作是開還是關(guān)。勾選是開,未勾選是關(guān)。

● Interact(交互):用于與環(huán)境交互的按鍵或按鈕。

〇鍵:按下鍵盤上的鍵進行動作。

〇控制器按鈕:按下控制器按鈕進行動作。

〇Enabled:動作是開還是關(guān)。勾選是開,未勾選是關(guān)。

● Melee Attack(近戰(zhàn)攻擊):按鍵或按鈕用于艾倫擺動她的權(quán)杖。

〇鍵:按下鍵盤上的鍵進行動作。

〇控制器按鈕:按下控制器按鈕進行動作。

〇Enabled:動作是開還是關(guān)。勾選是開,未勾選是關(guān)。

●Ranged Attack(遠(yuǎn)程攻擊):按鍵或按鈕用于艾倫射擊她的槍。

〇鍵:按下鍵盤上的鍵進行動作。

〇控制器按鈕:按下控制器按鈕進行動作。

〇Enabled:動作是開還是關(guān)。勾選是開,未勾選是關(guān)。

●Jump(跳躍):用于跳躍的按鍵或按鈕。

〇鍵:按下鍵盤上的鍵進行動作。

〇控制器按鈕:按下控制器按鈕進行動作。

〇Enabled:動作是開還是關(guān)。勾選是開,未勾選是關(guān)。

●Horizontal(水平移動):按下鍵盤或模擬桿向左或向右移動。

〇正:按下鍵盤上的鍵向右移動字符(X軸為正)。

〇負(fù):按下鍵盤上的鍵向左移動字符(X軸為負(fù))。

〇控制器軸:控制器模擬桿或按鈕左右移動。

●Vertical(垂直移動):按下鍵盤或模擬桿,使其蹲伏或向上看。

〇正:按下鍵盤上的鍵,使相機向上移動(Y軸為正)。

〇負(fù)值:按下鍵盤上的鍵使其蹲伏(Y軸為負(fù)值)。

〇控制器軸:控制器模擬搖桿或按鈕,可仰視和蹲伏。

●Persistence Type and Data Tag(持久性類型和數(shù)據(jù)標(biāo)簽):有關(guān)數(shù)據(jù)持久性系統(tǒng)如何工作的信息,請參見數(shù)據(jù)持久性部分。是否啟用近戰(zhàn)攻擊和遠(yuǎn)程攻擊是該類持久化的數(shù)據(jù)。

Player Character(玩家角色) 玩家角色腳本保存了Ellen在游戲中的所有行為信息,這里的設(shè)置會影響移動,音頻和攝像機。如果你改變?nèi)魏卧O(shè)置,它將只適用于該場景的預(yù)制實例,如果你希望改變發(fā)生在你的游戲的所有級別,單擊應(yīng)用在實例的頂部的改變,以應(yīng)用到Ellen預(yù)制。

?

參考:默認(rèn)情況下你不需要調(diào)整這個。這些是所有的參考腳本需要功能,他們完全發(fā)現(xiàn)在艾倫預(yù)制件。

〇Sprite Renderer:用于確定角色面對的方向。

〇Damageable(可傷害性):用于確定角色受傷時的移動方向。

〇Melee Damager(近戰(zhàn)傷害):用于在適當(dāng)?shù)膭赢嬛袉⒂?禁用傷害。

〇Facing Left/Right Bullet Spawn Point(面對左/右子彈刷出點):用于射擊時刷出子彈的位置。

〇Bullet Pool(子彈池):用于生成子彈。

〇Camera Follow Target(攝像機跟隨目標(biāo)):用于控制攝像機相對于角色的位置,這允許行為,如在快速移動時從角色保持領(lǐng)先。

移動設(shè)置:這些設(shè)置用于控制Ellen在地面上移動的速度。

〇Max Speed(最大移動速度):默認(rèn)設(shè)置:7 Ellen能跑多快。

〇Ground Acceleration(地面加速度):默認(rèn)設(shè)置:100 Ellen在地面上達(dá)到最大速度的速度。

〇Ground Deceleration(地面減速):默認(rèn)設(shè)置:100 Ellen在沒有輸入時減速到停止的速度。

〇Pushing Speed Proportion(推箱速度比例):默認(rèn)設(shè)置:0.5 Ellen推箱子時的最大速度比例。

空中設(shè)置:這些設(shè)置是為了控制Ellen在不落地(在空中)時的移動速度。

〇Airborne Accel Proportion(機載加速比例):默認(rèn)設(shè)置:1 Ellen不接地時使用的地面加速比例。

〇Airborne Decel Proportion(機載減速比例):默認(rèn)設(shè)置:0.5 Ellen不接地時使用的地面減速比例。

〇Gravity(重力):默認(rèn)設(shè)置:38 Ellen向地面加速的速度。這也會影響跳躍高度。

〇Jump Speed(跳躍速度):默認(rèn)設(shè)置:16.5 Ellen起跳速度。這將影響跳躍高度。

〇Jump Abort Speed Reduction(跳躍中止減速):默認(rèn)設(shè)置:100當(dāng)跳躍按鈕被釋放時,跳躍值被降低的速度。這將影響跳躍高度。

受傷設(shè)置:這些設(shè)置決定了Ellen受傷時的動作和出現(xiàn)方式。有關(guān)Ellen如何對損害作出反應(yīng)的其他設(shè)置,請參閱本文件關(guān)于損害系統(tǒng)的章節(jié)。

〇傷害跳躍角度:默認(rèn)設(shè)置:45當(dāng)Ellen受傷時,她會從傷害的來源跳向空中。這是她從水平方向跳起的角度。

〇傷害跳躍速度:默認(rèn)設(shè)置:8埃倫在受到傷害時的起跳速度

〇閃爍持續(xù)時間:默認(rèn)設(shè)置:0.05當(dāng)Ellen受傷時,她的精靈快速打開和關(guān)閉產(chǎn)生閃爍的效果。這個持續(xù)時間設(shè)置了精靈在閃爍時停留的時間。

近戰(zhàn)設(shè)置:這些設(shè)置如何埃倫移動時,她擺動她的權(quán)杖。關(guān)于艾倫如何損害的其他設(shè)置,請看這篇文件中損害制度的章節(jié)。

〇近戰(zhàn)攻擊沖刺速度:默認(rèn)設(shè)置:15 Ellen用權(quán)杖攻擊時水平?jīng)_刺的距離。

〇Dash While Airborne:默認(rèn)設(shè)置:啟用一個可選的設(shè)置,在空中攻擊時啟用一個Dash。這將設(shè)置水平移動,而不是增加它,如果艾倫已經(jīng)在空中水平移動,這個設(shè)置可能不會被注意到。

?

遠(yuǎn)程設(shè)置:這些設(shè)置與Ellen開槍時產(chǎn)生的子彈有關(guān)。

〇射擊每秒:默認(rèn)設(shè)置:2每秒可以產(chǎn)生的最大子彈數(shù)量。

〇子彈速度:默認(rèn)設(shè)置:30子彈產(chǎn)生時的速度。

〇握槍超時時間:默認(rèn)設(shè)置:1.5 Ellen停止射擊后,還能堅持多長時間。

〇右子彈刷出點動畫:默認(rèn)設(shè)置:啟用子彈刷出點動畫跟隨槍的位置,默認(rèn)情況下Ellen資產(chǎn)在右邊有一個子彈刷出位置。當(dāng)她面對左邊時,我們將鏡像刷出點動畫。如果你想添加自己面向左側(cè)的動畫精靈,請取消選中該框。

音頻設(shè)置:我們隨機播放Ellen的各種動作的音頻,這樣聽起來就不會重復(fù)。這些是對RandomAudioPlayers的引用,它可以播放音頻。這些不應(yīng)該被編輯。

〇腳步聲音頻播放器:當(dāng)Ellen做一個步驟時使用的隨機音頻播放器。

〇Landing AudioPlayer:當(dāng)Ellen在空中落地時使用的RandomAudioPlayer。

〇Hurt AudioPlayer:當(dāng)Ellen損壞時使用的隨機音頻播放器。

〇混戰(zhàn)音頻播放器:當(dāng)艾倫進行混戰(zhàn)攻擊時使用的隨機音頻播放器。

〇遠(yuǎn)程攻擊音頻播放器:當(dāng)Ellen做遠(yuǎn)程攻擊時使用的隨機音頻播放器。

相機跟隨設(shè)置:不是直接以艾倫為相機中心位置,而是動態(tài)跟隨到艾倫的新位置。這些設(shè)置控制偏移量。

〇相機水平朝向偏移量:默認(rèn)設(shè)置:2目標(biāo)在Ellen前水平偏移量。

〇相機水平速度偏移量:默認(rèn)設(shè)置:0.2根據(jù)Ellen的水平速度移動目標(biāo)的數(shù)量。

〇相機垂直輸入偏移量:默認(rèn)設(shè)置:2目標(biāo)垂直偏移量是基于玩家的輸入。

〇最大水平阻尼時間:默認(rèn)值:0.4目標(biāo)從無偏移量到所需水平偏移量所需要的時間。

〇最大垂直增量阻尼時間:默認(rèn)值:0.6目標(biāo)從無偏移量到所需的垂直偏移量的垂直移動所需要的時間。

〇垂直相機偏移延遲:默認(rèn)設(shè)置:1在目標(biāo)開始垂直移動之前,需要按住向上或向下輸入鍵的時間,以便玩家可以“向上”或“向下”。

雜項設(shè)置:用于其他設(shè)置的文件夾。

精靈最初的面孔:默認(rèn)設(shè)置:禁用這是指精靈資產(chǎn)本身沒有任何翻轉(zhuǎn)。它可以用來確定子彈應(yīng)該從哪個點產(chǎn)生。

三、敵人

敵人的行為

敵人行為組件適用于游戲中的兩個敵人Chomper和Spitter。這兩個敵人都使用相同的組件,只是使用了不同的設(shè)置。

●Sprite Faces Left:如果Sprite Faces Left,則選中復(fù)選框

●運動

〇速度:敵人的速度。

〇重力:它下落的速度。

●參考

〇射彈預(yù)制:敵人的射彈預(yù)制可以發(fā)射(只針對射彈敵人)。

●掃描設(shè)置

〇視野方向:敵人可以探測到玩家的方向。這是用場景視圖中的綠色圓圈描繪的

〇View FOV:敵人的視野范圍。這是用場景視圖中的綠色圓圈描繪的

視野距離:敵人能看到玩家的距離。這是用場景視圖中的綠色圓圈描繪的

〇目標(biāo)消失前的時間:當(dāng)玩家超出射程后,敵人停止追逐或搜索玩家的時間。

近戰(zhàn)攻擊信息,僅適用于近戰(zhàn)敵人,如Chomper。

〇近戰(zhàn)距離:敵人能夠擊中玩家的距離。

〇近戰(zhàn)傷害:對敵人的傷害腳本。更多信息請參見損壞系統(tǒng)。

〇接觸傷害:對敵人的接觸傷害腳本,這個腳本通過接觸敵人造成傷害。

〇攻擊沖刺:當(dāng)敵人攻擊時,啟動或禁用沖刺。

〇攻擊力:當(dāng)玩家受到攻擊時所施加的力量,這是在玩家受到攻擊后將其擊退的原因。

遠(yuǎn)程攻擊信息,僅適用于像Spitter這樣的遠(yuǎn)程敵人。

〇射擊起點:射出物被發(fā)射的位置。

〇射擊角度:射出物從原點被射擊的角度。

〇Shoot Force:投射物所受的力。

〇射速:射彈的速度。

●音頻

〇射擊音頻:射擊時使用的隨機音頻播放器。

〇近戰(zhàn)攻擊音頻:當(dāng)近戰(zhàn)攻擊發(fā)生時使用的隨機音頻播放器。

〇Die Audio:當(dāng)敵人死亡時使用的隨機audioplayer。

〇Foot Step Audio: RandomAudioPlayer用于敵人的腳步。

●Misc

〇閃爍持續(xù)時間:如果敵人的生命值大于1,當(dāng)它被擊中時,它將閃爍表示命中。該值表示閃爍持續(xù)的時間。

四、健康管理

?

健康

生命拾取是當(dāng)玩家走過它時能夠提供生命值的預(yù)制件。它可以在Prefabs < Interactables中找到

●Health Amount(生命值):盒子所提供的生命值

●On Giving Health (關(guān)于提供生命值):當(dāng)與盒子相撞時事件會觸發(fā),玩家將獲得生命值。

五、壓板

壓力板是自動設(shè)置的,可以檢測到走到它上面的玩家,它會亮起來并播放聲音。你可以連接壓力墊來觸發(fā)諸如開門之類的事件。

●Activation Type(激活類型):如何激活按鈕。下面的選項將根據(jù)此設(shè)置更改。

〇Item Count:激活壓力墊上的對象數(shù)量。

〇Mass(質(zhì)量):激活墊子所需物體的重量。

●Required Count:在On Pressed & On Release中觸發(fā)事件所需的物品數(shù)量。如果激活類型更改,則此更改為Required Mass。

(可選)當(dāng)平臺不被按下時,要改變的精靈。只有當(dāng)Boxes選項擁有Sprite Renderer時才需要

●激活盒精靈:(可選)精靈切換,當(dāng)平臺按下。只有當(dāng)Boxes選項擁有Sprite Renderer時才需要

(可選)將被推到pressuread上的盒子列表,當(dāng)它們被推下去時,精靈將改變?yōu)槟切┰贒eactivated Box Sprite和Activated Box Sprite中。

●On Pressed():當(dāng)壓力墊被按下時發(fā)生的事件,這取決于正確的Required Count或Required Mass

●On Release():當(dāng)壓力墊釋放時發(fā)生的事件,這取決于正確的Required Count或Required Mass

六、傷害系統(tǒng)

套件中的損害系統(tǒng)由兩個組件組成:損害器和可損害腳本。添加一個Damager腳本到一個對象,使它能夠?qū)θ魏尉哂衐amable組件的對象造成損害,只要它們的設(shè)置匹配

傷害

“損壞組件”具有與“可損壞組件”和“不可損壞組件”發(fā)生碰撞的事件。生命值的計算是自動完成的,這些事件是用來觸發(fā)游戲玩法改變或視覺效果。Damager組件不需要碰撞器,它會在場景視圖中顯示一個盒子小裝置,你可以用它來調(diào)整它的大小和位置。

●傷害:它將對一個可傷害的(如Ellen或Chomper)造成的傷害。

●偏移量和大小:這是定義Damager碰撞框的兩個參數(shù)。這是在場景視圖的尖峰上顯示的外框,當(dāng)它碰撞時會造成損壞。

●基于精靈朝向的偏移:這個設(shè)置允許損害器根據(jù)精靈朝向的方向改變位置。這是在Ellen上使用的,可以讓損害者根據(jù)她面對的方向向左或向右撇。

●Sprite Renderer:上述設(shè)置使用的Sprite Renderer。

●Can Hit Triggers:切換Damager是否會與被選中的觸發(fā)器發(fā)生沖突,或者完全忽略被選中的觸發(fā)器。

●Force Respawn:如果啟用,包含damage的物體將立即重生到最近的檢查點(Acid預(yù)制在玩家掉進水里時使用這個功能)。

忽略無敵:如果開啟,傷害者仍然會對傷害值進行“攻擊”,但不會移除生命值(Acid會使用這個屬性,這樣玩家就會一直重生,即使他們在之前的敵人攻擊中是無敵的)。

●可命中的層:傷害者會造成傷害的層。沒有被選中的圖層將不會受到傷害。

●On damage Hit:當(dāng)物體被擊中并且有一個damage組件時,事件將在這里播放。

非傷害攻擊:當(dāng)物體被擊中但沒有傷害組件時,事件將在這里播放。

可被損壞的

可損壞組件接收對象與附加在其上的Damager組件碰撞造成的損壞。當(dāng)受到傷害、生命值恢復(fù)、生命值改變或生命值完全耗盡(死亡)時,會發(fā)生事件。與Damager相反,damable組件依賴于附加在同一個游戲?qū)ο笊系呐鲎财?#xff0c;所以除了向?qū)ο筇砑觗amable Script之外,不要忘記添加碰撞器來定義可命中區(qū)域。

●Starting Health:健康級別。傷害者將在每次攻擊時移除他們的生命值。當(dāng)這個值達(dá)到0時,可傷害物品就會死亡。

●傷害后無懈可擊:這種傷害在沖擊后的一段時間內(nèi)變得無懈可擊。

●刀傷持續(xù)時間:在受到傷害后認(rèn)為刀傷不受傷害的時間(僅適用于之前設(shè)置)。

●Disable On Death:該設(shè)置將在死亡時禁用GameObject。

●中心偏移:用于定義可損壞物體的中心位置(偏移(0,0,0)表示它位于游戲?qū)ο蟮奈恢?。用于計算到Damager的距離。

●On Take Damage:當(dāng)物體受到傷害時觸發(fā)事件。

●On Die:事件觸發(fā)時的對象

獲得生命值:當(dāng)一個物體獲得新的生命值時觸發(fā)的事件。

●持久類型:參見持久數(shù)據(jù)

●數(shù)據(jù)標(biāo)簽:參見持久數(shù)據(jù)

檢查點

檢查點在Prefabs < SceneControl文件夾中

每當(dāng)玩家進入一個檢查點碰撞器時,這個檢查點就會被激活。當(dāng)他們掉進水里(或被任何帶有原力重生設(shè)置的傷害者擊中),他們將在檢查點重新出現(xiàn)。注意:玩家會重新出現(xiàn)在游戲?qū)ο蟮奈恢蒙?#xff0c;所以要確保它在地面上?

七、移動平臺

要在場景中創(chuàng)建一個移動平臺,請將移動平臺預(yù)制件Prefabs < Interactables從項目視圖拖到場景視圖中。它包括一個移動平臺腳本,Box Collider 2D, Rigidbody 2D,平臺效應(yīng)器2D和一個平臺捕獲腳本。

平臺捕手腳本允許平臺上的對象自由移動。而且不需要調(diào)整。在場景視圖中,你會看到紅色的虛線和變換工具在末端,這表示平臺將采取的路徑和它的目的地。在任意方向拖動變換工具來改變路徑和目標(biāo)。

●平臺捕手:自動在平臺上找到平臺捕手腳本,無需更改。

●預(yù)覽位置:允許你瀏覽和預(yù)覽平臺將去的場景視圖。

●開始移動:當(dāng)啟用時,平臺將在關(guān)卡加載時開始移動。如果未勾選,則需要由事件觸發(fā)。

〇When becoming visible:該選項僅在平臺設(shè)置為Start Moving時才會出現(xiàn)。如果這是啟用的,平臺將只在屏幕上可見時才開始移動,而不是在關(guān)卡加載時。

●循環(huán):定義平臺到達(dá)路徑終點時的反應(yīng)。

〇BACK_FORTH:平臺在起點和終點之間來回移動。

〇LOOP:一旦平臺到達(dá)路徑的最后一個點,它將直線移動到起點,重新開始循環(huán),形成一個循環(huán)。

〇ONCE:到達(dá)終點時平臺停止。

●速度:默認(rèn)設(shè)置:2平臺移動的速度(單位為每秒)。

?

●添加節(jié)點:此按鈕將添加另一個節(jié)點,或目標(biāo)點到您的平臺的路徑。平臺從一個節(jié)點移動到另一個節(jié)點。

〇節(jié)點0:表示平臺位置。不能刪除。沒有什么立場是不能改變的。

■等待時間:平臺等待移動到下一個節(jié)點的時間。

〇節(jié)點1:第一個路徑和目的地,默認(rèn)情況下總是包含。

■位置:節(jié)點的位置(本地空間)。

■刪除:刪除節(jié)點的按鈕。

■等待時間:平臺等待移動到下一個節(jié)點的時間。在場景視圖中可以看到這樣一個帶有兩個節(jié)點的平臺。

八、交互系統(tǒng)

2D碰撞系統(tǒng)

?

玩家可以通過多個名為InteractOn*的組件與游戲?qū)ο筮M行互動:

●InteractOnCollision2D

●InteractOnTrigger2D

●InteractOnButton2D

交互依賴于擁有Collider 2D組件的對象。碰撞器是物體周圍的一個看不見的區(qū)域,可以檢測到什么東西接觸或進入它。我們在套件中使用的主要是Box (Box Collider 2D), Capsule (Capsule Collider 2D)和Circle (Circle Collider 2D)。這些都在套件中提供的各種預(yù)碼件中為你設(shè)置好了。如果你想在對象上添加新的交互類型或創(chuàng)建自己的交互類型,取決于你使用的是以下哪個InteractOn組件,你必須注意Collider上的Is Trigger復(fù)選框,你想讓交互的對象。我們將注意到Collider將需要處于一個特定的InteractOn組件的狀態(tài)。

碰撞2D互動

這用于在物體碰撞器接觸時觸發(fā)事件。

?

●腳本:正在使用的腳本名稱(不能更改)。

●圖層:只有選中圖層上的對象才會觸發(fā)事件。

●On Collision():這里列出的事件將在屬于設(shè)置圖層的對象發(fā)生碰撞時發(fā)生。(如果你自己設(shè)置,不需要在碰撞器上啟用is Trigger)

互動觸發(fā)2D

當(dāng)一個對象進入碰撞器時觸發(fā)事件,當(dāng)一個對象存在碰撞器時觸發(fā)更多事件。(如果制作自己的,請確保碰撞器組件上啟用Is Trigger)。

●腳本:正在使用的腳本名稱(不能更改)。

●圖層:只有選中圖層上的對象才會觸發(fā)事件。

●On Enter():這里列出的事件將發(fā)生,當(dāng)一個對象屬于設(shè)置層進入觸發(fā)器。

●On Exit():這里列出的事件將發(fā)生,當(dāng)一個對象屬于設(shè)置層退出觸發(fā)器。

●庫存檢查:這允許你確保事件只發(fā)生在當(dāng)一個進入觸發(fā)器的對象有一個對象在它的庫存。例如,當(dāng)玩家進入觸發(fā)區(qū)域時,只有在他們的庫存中有鑰匙時才會打開一扇門。

〇Size:默認(rèn)設(shè)置為0,增加這個數(shù)字來增加觸發(fā)器應(yīng)該期望的庫存數(shù)量。

元素0:第一次庫存檢查。

■庫存物品(Inventory Items):它期望在與它碰撞的對象庫存中的對象。

●大小:你希望觸發(fā)對象在其庫存中攜帶的物品數(shù)量。

元素0:需要的第一個庫存物品。這必須匹配預(yù)期的名稱,這些名稱列在庫存系統(tǒng)部分。

●On has Item():當(dāng)對象持有庫存物品中設(shè)置的所有物品時觸發(fā)事件。

●On Does Not Have Item():當(dāng)物品不包含所有物品時觸發(fā)事件。

按鈕互動2D

當(dāng)一個對象在觸發(fā)區(qū)域內(nèi),玩家按下游戲中的互動按鈕時,這用于觸發(fā)事件(關(guān)于互動按鈕的更多信息,請參閱玩家輸入部分)。(如果你自己制作,請確保在Collider組件上啟用Is Trigger)

●腳本:正在使用的腳本名稱(不能更改)。

●圖層:只有選中圖層上的對象才會觸發(fā)事件。

●On Enter():這里列出的事件將發(fā)生,當(dāng)一個對象屬于設(shè)置層進入觸發(fā)器。

●On Exit():這里列出的事件將發(fā)生,當(dāng)一個對象屬于設(shè)置層退出觸發(fā)器。

●庫存檢查:這允許你確保事件只發(fā)生當(dāng)一個對象進入觸發(fā)器和按下交互按鈕有一個對象在其庫存。例如,當(dāng)玩家進入觸發(fā)器并按下互動區(qū)域時,只有在他們的庫存中有鑰匙時才會打開一扇門。

〇Size:默認(rèn)設(shè)置為0,增加這個數(shù)字來增加觸發(fā)器應(yīng)該期望的庫存數(shù)量。

元素0:第一次庫存檢查。

■庫存物品(Inventory Items):它期望在與它碰撞的對象庫存中的對象。

●大小:你希望觸發(fā)對象在其庫存中攜帶的物品數(shù)量。

元素0:需要的第一個庫存物品。這必須匹配預(yù)期的名稱,這些名稱列在庫存系統(tǒng)部分。

●On Button Press():當(dāng)交互按鈕被按下時觸發(fā)的事件。?

九、存檔系統(tǒng)

存貨系統(tǒng)由兩部分組成,存貨控制部分和存貨項目。庫存控制器應(yīng)該添加到持有庫存的對象中。應(yīng)該將庫存物品腳本添加到正在收集的物品中。例如Ellen(庫存控制器)將收集一個Key(庫存項目)庫存控制器能夠自動收集與碰撞器的接觸庫存項目,并定義了發(fā)生的行動,當(dāng)給定的對象被接收或刪除。

存檔控制器

這個組件有一個條目的每個項目,可以攜帶在您的庫存。組件可以存在于角色、箱子或商店中。

?

庫存事件:事件列表發(fā)生在特定的對象添加到庫存。增加這里的數(shù)字以添加新的事件(提示:您可以通過右鍵單擊列表中的名稱并選擇delete Array Element來刪除事件)。

〇鍵:是代表物品的唯一標(biāo)識符,例如鑰匙,槍,職員。這必須與您希望收集的物品上的物品清單組件中的密鑰相匹配。庫存只能保存每個對象的一個實例;如果一個具有相同Key的對象已經(jīng)在庫存中,庫存控制器中的添加事件將不會被調(diào)用。

〇OnAdd:當(dāng)物品被添加到庫存時觸發(fā)的事件。

〇OnRemove:當(dāng)物品從庫存中移除時觸發(fā)的事件。

〇數(shù)據(jù)設(shè)置:參見Persistent Data文檔獲取更多信息。

不要混淆道具的Key(游戲邦注:即分配給道具的唯一標(biāo)識符)和Key(游戲邦注:我們喜歡在游戲中使用的收集對象)。文檔中使用粗體表示惟一標(biāo)識符,以避免混淆。

物品庫存

任何可以在庫存中攜帶的項目都需要一個庫存項目組件。這指定項目的關(guān)鍵,一個音頻剪輯和哪個層可以拾取項目。InventoryItem是添加到游戲?qū)ο笾械慕M件,代表該項目。它還需要一個圓形碰撞器2D,如果缺少將自動添加一個。該碰撞器被設(shè)置為觸發(fā)器,用于檢測玩家何時觸摸對象。游戲?qū)ο蟮臓顟B(tài)(活動或不活動)被保存,所以當(dāng)場景重新加載和玩家重新進入?yún)^(qū)域時它保持不變。

●庫存鍵:物品的唯一名稱(如Key1),用于跟蹤物品是否已經(jīng)擁有。

●層:收集物品的對象所在的層。

●Disable On Enter:該設(shè)置在對象被收集后禁用該對象。

●剪輯:收集項目時播放的音頻剪輯。如果為空,則不會播放剪輯。

●數(shù)據(jù)設(shè)置:參見Persistent Data文檔獲取更多信息。

?代碼所在位置,如果想深入了解該功能是如何實現(xiàn)的,可以查看腳本代碼

十、收集器

該組件用于根據(jù)已收集的物品數(shù)量改變對象的精靈。

一旦收集了所有的項目,就會調(diào)用On Unlocked函數(shù)。在下面的示例中,要收集的三個庫存項是Key1、Key2和Key3。每當(dāng)收集到庫存中的一個道具時,精靈便會發(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:如果設(shè)置了一個Director序列,則會觸發(fā)一個Director序列。

Character Inventory:持有庫存控制器的對象,該組件用于跟蹤集合。

●On Unlocked():當(dāng)所有道具都被收集并改變精靈時事件會觸發(fā)。

●數(shù)據(jù)設(shè)置:參見Persistent Data文檔獲取更多信息。

十一、刷敵人

敵人預(yù)制體在Prefabs < Enemies中,這將控制產(chǎn)生更多的敵人在您的場景中。

●預(yù)制件:敵人的預(yù)制件將被生成。

●初始池數(shù):這決定了將在池中持有的敵人數(shù)量。在這里輸入一個很好的值等于需要生成的并發(fā)敵人的數(shù)量。

●Total Enemies to be spawn:產(chǎn)卵者將產(chǎn)卵的敵人數(shù)量,直到它停止產(chǎn)卵的敵人。

●Concurrent Enemies to be spawn:產(chǎn)卵者同時在世界上產(chǎn)卵的敵人數(shù)量。例如,如果這是5個,總共10個敵人,產(chǎn)卵者將產(chǎn)卵5個敵人。一旦一個被殺死,它會產(chǎn)生一個新的,除非它已經(jīng)產(chǎn)生了10個。

刷出區(qū)域:這是刷出點周圍刷出區(qū)域的范圍。敵人將在該區(qū)域內(nèi)隨機產(chǎn)生。這可以通過刷出點周圍的白色矩形小工具在場景視圖中顯示出來。

?

Spawn Delay(刷出延遲:從一個敵人死亡到下一個敵人出現(xiàn)的時間間隔。)

Removal Delay(移除延遲:敵人被送回池中的時間)

十二、游戲工具包高級主題

后面章節(jié)包含了關(guān)于Game Kit系統(tǒng)的更深入的信息,可能需要更多的Unity知識,一些主題需要c#知識。

十三、隨機音頻播放器

這個腳本允許您從用戶分配的剪輯列表中選擇一個隨機的聲音播放。你可以看到它被用來控制Ellen預(yù)制組件上的不同聲音(在Ellen的SoundSources子游戲?qū)ο笙聶z查)。例如,查看FootstepSource,您可以看到它定義了一個包含四個腳步聲音的列表,腳步將隨機選擇這些聲音,并添加了音調(diào)隨機化。這個例子還包括使用覆蓋每個特定的瓷磚-一個覆蓋的異形廢墟瓷磚播放不同的腳步聲,如果艾倫走在草地表面。

十四、腳本

腳本,RandomAudioPlayer PlayRandomSound函數(shù)是由其他腳本調(diào)用時需要播放聲音(例如引發(fā)的腳步聲音PlayFootstep在該函數(shù),函數(shù)本身是由動畫剪輯的幀調(diào)用腳與地面接觸的地方。)這個功能可以使用TileBase去選擇覆蓋聲音(游戲邦注:例如腳步將使用玩家所開啟的當(dāng)前表面,子彈碰撞將使用它剛剛碰撞過的表面的Tile)。

十五、音頻

AudioSurface是一個腳本可以添加到任何對象,不是tilemap(如移動或轉(zhuǎn)移平臺,移動框等),允許您定義瓷磚應(yīng)該使用音頻播放器時尋找一個覆蓋的聲音(如一塊石頭盒子會使用一個AudioSurface外星人瓷磚瓷磚的設(shè)置,所以走在上面會觸發(fā)“石階”的聲音,而不是正常的“地面”的聲音。)

十六、視效

此組件用于從池中生成VFX預(yù)制件,停用它們,并在生命周期過期后將它們返回到池中。

VFXController是項目文件夾中的一個資產(chǎn)(在資源文件夾內(nèi)),它允許你列出游戲?qū)⑹褂玫乃幸曈X特效。它將創(chuàng)建一個使用這些視覺特效的實例池,移動在游戲開始時實例化視覺特效預(yù)制的成本,而不是每次使用它們。像PlayerController或StateMachineBehaviour TriggerVFX這樣的腳本將通過名稱觸發(fā)這些VFX。

和音頻播放器一樣,它也允許你定義每個貼圖的覆蓋。例如,你可以為每個腳步設(shè)置一個覆蓋的視覺效果,這取決于腳步在哪個表面上著陸。(對于VFXController附帶這個項目,你可以看到一個例子在DustPuff視效,使用一個覆蓋當(dāng)玩家走在石頭)最重要的磚是由觸發(fā)視效的腳本(例如腳步將當(dāng)前的表面,一顆子彈擊中表面會通過瓷磚的表面,可以在非貼圖對象上設(shè)置覆蓋貼圖;請參考聲音文檔Sounds.txt,了解如何設(shè)置覆蓋游戲?qū)ο髮?yīng)的內(nèi)容。

十七、數(shù)據(jù)持久性

數(shù)據(jù)持久性系統(tǒng)允許你在游戲過程中保存一些數(shù)據(jù),保存一些關(guān)于玩家已經(jīng)做了什么的信息。如果沒有它,因為每個區(qū)域都是一個新場景,進入一個區(qū)域?qū)⒓虞d該區(qū)域的“默認(rèn)”狀態(tài)(游戲邦注:如它是在編輯器中設(shè)計的),但玩家所采取的任何永久行動(如抓鑰匙或武器)都將被“取消”。

使用編輯器

數(shù)據(jù)系統(tǒng)通過一個名為IDataPersister的腳本接口工作。

實現(xiàn)這個接口的對象(如內(nèi)置的InventoryItem, HubDoor, PlayerInput等)可以從PersistentDataManager中讀寫數(shù)據(jù)

實現(xiàn)該接口的單行為在檢查器的底部有一個Data Settings折疊頁。設(shè)置包括:

數(shù)據(jù)標(biāo)簽:這是對象的唯一標(biāo)識符,由管理器用來將數(shù)據(jù)鏈接到該對象。它可以是任何東西:一些內(nèi)置組件使用一個自動生成的唯一ID,但它也可以是一個手動輸入的名稱,如“Zone_3_key”或“Quest_Item_Card”等。

持久性類型:對象可以是:

〇Don't Persist:允許禁用持久性,對于需要在場景改變時重置的對象很有用(例如,你可能想在重新啟動關(guān)卡時再次關(guān)閉一扇門)

〇只讀:只能讀數(shù)據(jù),不能寫數(shù)據(jù)。一種使用方法是讓一個只寫的對象(見下面)具有相同的數(shù)據(jù)標(biāo)簽。這個對象

將使用另一個對象為該標(biāo)簽寫的數(shù)據(jù),但不能重寫它。

〇Write Only:只能寫數(shù)據(jù),不能讀取數(shù)據(jù)。請參閱上面的只讀使用示例。

〇讀寫:最常見的使用情況,對象讀取和寫入其給定的數(shù)據(jù)標(biāo)簽數(shù)據(jù)

數(shù)據(jù)保存加載周期

SaveData對場景中IDataPersister的所有實例在場景過渡出來之前被調(diào)用。LoadData在加載新場景后,在場景中IDataPersister的所有實例上被調(diào)用。可以在任何時候通過調(diào)用persistentdatammanager . setdirty (this)來手動保存數(shù)據(jù)。

代碼中的使用示例

在代碼中使用數(shù)據(jù)管理器的方式是,在啟用/啟動數(shù)據(jù)管理器時讀取相關(guān)數(shù)據(jù)并對其作出反應(yīng)。例如,庫存項將其狀態(tài)寫入持久化數(shù)據(jù)(活動或非活動)。因此,當(dāng)場景加載時,庫存項將檢索與其標(biāo)簽相關(guān)聯(lián)的數(shù)據(jù)。如果保存了一個假值,這意味著對象已經(jīng)被檢索,它可以禁用自己。另一個例子是保存狀態(tài)的門。當(dāng)場景加載并讀取數(shù)據(jù)時,它可以將自己設(shè)置為所需的狀態(tài)(例如打開/關(guān)閉)。

場景與smb

SceneLinkedSMB是一個類,它擴展了statemachinebehaviour的工作方式。它允許Animator狀態(tài)機中的Behaviour保持對MonoBehaviour的引用。

雖然scenelinkedsmb可以在任何需要引用特定MonoBehaviour的地方使用,但它們的設(shè)計理念是將邏輯和功能分離。

動畫控制器包含一個狀態(tài)機,它是控制執(zhí)行流的理想狀態(tài)機。

使用scenelinkedsmb,你可以調(diào)用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個不同的腳本,也只需要調(diào)用一次。只要他們都繼承自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)建兩個類——一個繼承自O(shè)bjectPool,另一個繼承自PoolObject。繼承自O(shè)bjectPool的類是池本身,而繼承自PoolObject的類是池中每個預(yù)制件的包裝器。這兩個類由泛型類型鏈接。ObjectPool和PoolObject必須具有相同的兩種泛型類型:繼承自O(shè)bjectPool的類和按此順序繼承自PoolObject的類。這很容易用一個例子來說明:

public class SpaceshipPool: ObjectPool<SpaceshipPool, Spaceship> { … } public class Spaceship: PoolObject<SpaceshipPool, Spaceship> { … }

這樣一來,池就知道它包含的對象的類型,而對象也知道它們所屬的池的類型。這些類可以有第三種泛型類型。只有當(dāng)您希望為PoolObject的WakeUp函數(shù)提供一個參數(shù)時,才需要這樣做,當(dāng)PoolObject從池中取出時,該函數(shù)將被調(diào)用。例如,當(dāng)我們的飛船被喚醒時,他們可能需要知道他們有多少燃料,所以可以有一個額外的浮子類型如下:

public class SpaceshipPool: ObjectPool<SpaceshipPool, Spaceship, float> { … } public class Spaceship: PoolObject<SpaceshipPool, Spaceship, float> { … }

默認(rèn)情況下,PoolObject有以下字段:

●inPool:這個bool值決定當(dāng)前池子對象是在池中還是醒著。

實例:這個游戲?qū)ο笫沁@個PoolObject包裝的實例化預(yù)制件。

objectPool:這是這個PoolObject所屬的對象池。它具有與該類的ObjectPool類型相同的類型。PoolObject還具有以下虛函數(shù):

●setreference:在PoolObject第一次創(chuàng)建時調(diào)用。它的目的是緩存引用,這樣當(dāng)PoolObject被喚醒時就不需要收集它們,盡管它可以用于任何其他一次性設(shè)置。

●WakeUp:當(dāng)PoolObject被喚醒并從池中收集時調(diào)用。它的目的是在每次使用PoolObject時執(zhí)行所需的任何設(shè)置。如果給類提供了第三個泛型參數(shù),那么可以使用該類型的參數(shù)調(diào)用WakeUp。

●Sleep:當(dāng)PoolObject被返回到存儲池時調(diào)用。它的目的是在使用PoolObject之后執(zhí)行任何需要的清理。

●ReturnToPool:默認(rèn)情況下,它簡單地將PoolObject返回到池中,但是如果需要其他功能,它可以被覆蓋。一個對象池是一個MonoBehaviour,因此可以添加到游戲?qū)ο笾小DJ(rèn)情況下,它有以下字段:

●Prefab:這是一個對Prefab的引用,它將被實例化多次來創(chuàng)建池。

InitialPoolCount:將在Start方法中創(chuàng)建的PoolObjects的數(shù)量。

Pool:一個PoolObjects的列表。ObjectPool還具有以下功能:

●Start:這是初始池創(chuàng)建發(fā)生的地方。您應(yīng)該注意,如果ObjectPool中有Start函數(shù),它將有效地隱藏基類版本。

●CreateNewPoolObject:當(dāng)創(chuàng)建poolobject時調(diào)用,調(diào)用它們的setreference函數(shù),然后調(diào)用Sleep函數(shù)。它不是虛的,所以不能被覆蓋,但是它是受保護的,因此可以在繼承類中調(diào)用。

Pop:調(diào)用此函數(shù)從池中獲取一個PoolObject。默認(rèn)情況下,它將搜索第一個inPool標(biāo)志設(shè)置為true的對象并返回它。如果none為真,它將創(chuàng)建一個新的并返回它。它將在將要返回的任何PoolObject上調(diào)用WakeUp。這是虛擬的,可以被覆蓋。

●Push:調(diào)用此函數(shù)將一個PoolObject放回池中。默認(rèn)情況下,它只是設(shè)置inPool標(biāo)志并在PoolObject上調(diào)用Sleep,但它是虛擬的,可以被覆蓋。關(guān)于如何使用對象池系統(tǒng)的完整示例,請參見BulletPool文檔和腳本。

子彈池

子彈池MonoBehaviour是一個子彈對象的池,每一個都包裝了一個子彈預(yù)制的實例。BulletPool同時用于Ellen和敵人,但使用方式略有不同。對于Ellen,有一個BulletPool MonoBehaviour附加到父游戲?qū)ο?#xff0c;子彈預(yù)制設(shè)置為它的預(yù)制字段。BulletPool的另一個用途是在EnemyBehaviour類中。它使用GetObjectPool靜態(tài)函數(shù)來使用BulletPools,而不需要主動創(chuàng)建它們。

BulletPool類有以下字段:

●預(yù)制:這是你希望使用的子彈預(yù)制。

●初始池數(shù):這是多少子彈將創(chuàng)建在池開始。它應(yīng)該和你期望一次使用的數(shù)量一樣多。如果需要更多,它們將在運行時創(chuàng)建。

●Pool:這是Pool中的子彈對象。這在檢查器中沒有顯示。

BulletPool類具有以下功能:

●Pop:使用此功能從池中獲得一個子彈對象。

●Push:使用此功能將子彈對象放回池中。

●GetObjectPool:這是一個靜態(tài)函數(shù),將找到一個適當(dāng)?shù)淖訌棾亟o定的特定預(yù)制。當(dāng)從池中獲得子彈時,它以子彈對象的形式出現(xiàn)。

BulletObject類有以下字段:

●InPool:這個特定的子彈是否在池中或被使用。

●實例:實例化的預(yù)制件。

ObjectPool:對該子彈對象所屬的子彈池的引用。

Transform:對實例的Transform組件的引用。

●Rigidbody2D:對實例的Rigidbody2D組件的引用。

SpriteRenderer:對SpriteRenderer組件實例的引用。

Bullet:引用實例的Bullet腳本。

BulletObject具有以下功能:

●WakeUp:這是由彈池調(diào)用Pop函數(shù)時調(diào)用的。

●Sleep:當(dāng)Push函數(shù)被調(diào)用時,由BulletPool調(diào)用。

●ReturnToPool:當(dāng)你完成一個特定的項目符號時,這個應(yīng)該被調(diào)用。它將調(diào)用其BulletPool的Push函數(shù),從而調(diào)用其Sleep函數(shù)。

十九、行為樹

注意:這是一個只使用腳本的系統(tǒng),你至少需要了解腳本和c#如何在Unity中工作的基本知識,才能理解它是如何工作和如何使用它

顧名思義,行為樹是一種使用動作樹編碼行為的方法。它們在Game Kit中用于控制AI的敵人行為和boss戰(zhàn)斗序列。

下面是一個行為樹的可視化例子:

理論

在游戲的每次更新過程中,這棵樹都是“打勾”的,這意味著它將遍歷根節(jié)點的每個子節(jié)點,如果該節(jié)點有子節(jié)點,則進一步向下,等等。

每個節(jié)點都有關(guān)聯(lián)的動作,并將向其父節(jié)點返回三種狀態(tài)之一:

●Success:節(jié)點成功完成任務(wù)。

●Failure:節(jié)點任務(wù)失敗。

繼續(xù):節(jié)點還沒有完成任務(wù)。

返回的狀態(tài)由每個節(jié)點的父節(jié)點以不同的方式使用。

例如:

●如果當(dāng)前子節(jié)點返回Failure或Success,選擇器將使下一個子節(jié)點處于活動狀態(tài);如果當(dāng)前子節(jié)點返回Continue,則保持當(dāng)前子節(jié)點為活動狀態(tài)。

測試節(jié)點將調(diào)用子節(jié)點,如果測試為真則返回子節(jié)點狀態(tài),如果測試為假則返回失敗而不調(diào)用子節(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應(yīng)該作為成員存儲在類中,因為您需要在Update函數(shù)中調(diào)用aiRoot. tick(),以便可以執(zhí)行Tree操作。

讓我們來看看更新將如何在airroot. tick()中進行:

首先,我們測試TestVisibleTarget函數(shù)是否返回true。如果是,它將繼續(xù)執(zhí)行子進程,這些子進程將調(diào)用Aim和Shoot函數(shù)

●如果測試返回false, If節(jié)點將返回Failure,根節(jié)點將轉(zhuǎn)到下一個子節(jié)點。這是一個序列,它首先執(zhí)行它的第一個子節(jié)點

〇調(diào)用Walk函數(shù)。它返回Success,以便序列將下一個子節(jié)點設(shè)置為活動的并執(zhí)行它

〇執(zhí)行“Wait”節(jié)點。因為它必須等待5秒,并且是第一次調(diào)用,所以它還沒有到達(dá)等待時間,所以它將返回Continue

〇當(dāng)序列從它的活動子節(jié)點接收到一個Continue狀態(tài)時,它不會改變活動子節(jié)點,所以它將在下一次更新時從該子節(jié)點開始

●一旦Wait節(jié)點更新到足夠的時間到達(dá)它的計時器,它將返回Success,這樣序列將轉(zhuǎn)到下一個子節(jié)點。

節(jié)點表

順序序列執(zhí)行

子節(jié)點一個接一個。如果子進程返回:

成功:該序列將在下一幀的下一個子幀上打勾。

失敗:序列將返回到下一幀的第一個子序列。

繼續(xù):序列將在下一幀再次調(diào)用該節(jié)點。

隨機序列

每次調(diào)用它時,從它的子列表中隨機執(zhí)行一個子節(jié)點。您可以在構(gòu)造函數(shù)中指定一個權(quán)重列表,以int數(shù)組的形式應(yīng)用于每個子對象,以使某些子對象更容易被選中。

選擇器

按順序執(zhí)行所有子節(jié)點,直到返回Success,然后退出,不執(zhí)行其余的子節(jié)點。如果沒有返回成功,則該節(jié)點將返回失敗。

呼叫

調(diào)用給定的函數(shù),它總是返回Success。

如果

?

調(diào)用給定函數(shù)。

如果返回true,則調(diào)用當(dāng)前活動的子對象并返回其狀態(tài)。

否則,它將返回Failure而不調(diào)用子節(jié)點

循環(huán)

只要給定的函數(shù)返回true就繼續(xù)(所以當(dāng)樹被選中時,它將再次從該節(jié)點開始,而不計算之前的所有節(jié)點)。

孩子們將一個接一個地被處死。

當(dāng)函數(shù)返回false并且循環(huán)中斷時將返回Failure。

條件

如果給定的函數(shù)返回true,則該節(jié)點返回Success;如果給定的函數(shù)返回false,則返回Failure。

當(dāng)與依賴于其子節(jié)點的結(jié)果的其他節(jié)點連接時有用(例如Sequence, Selector等)。

重復(fù)

將連續(xù)執(zhí)行所有子節(jié)點的給定次數(shù)。

始終返回Continue直到到達(dá)計數(shù),在計數(shù)中返回Success。

等待

將返回Continue,直到到達(dá)給定的時間(從第一次調(diào)用時開始),然后返回Success。觸發(fā)

允許在給定的動畫器中設(shè)置一個觸發(fā)器(如果最后一個參數(shù)設(shè)置為false,則取消觸發(fā)器)。總是返回成功。

SetBool

允許在給定的動畫中設(shè)置一個布爾參數(shù)的值。總是返回成功

SetActive

設(shè)置游戲?qū)ο蟮幕顒?非活動狀態(tài)。總是返回成功。

總結(jié)

以上是生活随笔為你收集整理的unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。