發(fā)布時間:2023-11-27 16:46:17 瀏覽量:125次

文/周尚宣
本文選自機械工業(yè)出版社出版的《Unity3D動作游戲開發(fā)》一書的9.1節(jié),略有改動。經出版社授權刊登于此。
君臨都市是一款PS2末期推出的動作游戲,它沿襲了格斗游戲嚴謹的判定并以拳腳格斗作為其主要戰(zhàn)斗模式。戰(zhàn)斗中存在著大量的投技、拆投、組合技等,游戲中還設有部位破壞的獨特概念,角色被分為上中下三段傷害區(qū)域,玩家不可一味地對其某一段進行攻擊,從而增加戰(zhàn)斗的策略性。本節(jié)將針對多人組合技能以及人形通用動作的設計來進行剖析。
通用動作方案設計
本作中設有60名敵人,包括不同的流派、體型、身高等,如第16關的空手道角色或女主角的功夫等。如此之多的角色動畫是這一類游戲的典型問題之一,通??梢圆捎靡惶淄ㄓ脛赢嫷亩鄠€不同形體的方式并借助通用骨骼去解決,即一個動畫同時做瘦、中、胖三個版本,以匹配不同體型的敵人。在Unity引擎中,使用人形動畫的功能可以解決這類需求。
繼續(xù)觀察本作會發(fā)現,一些流派使用的角色相對較少,且角色大都為中等體型,并且女性角色較少。所以進一步優(yōu)化,在制作通用骨骼動畫時對于使用固定流派的敵人可以做一套通用;而對于通用流派的敵人,建議依據身高、體型制作兩套或以上通用動畫即可。
組合攻擊的再實現
本作中的組合攻擊通常是指多個己方角色同時對敵人發(fā)動的特殊動畫攻擊,或者是依賴站位在特殊條件下主角一人對多人發(fā)動的特殊動畫攻擊,如圖1所示。
一對三組合攻擊示意圖
這里以主角一對多組合攻擊的情形進行腳本實現,這種情形的觸發(fā)邏輯一般是當主角周邊站有敵人時,以敵人的某種朝向、站姿的指定規(guī)則進行觸發(fā)??紤]到其與技能系統(tǒng)還是有一些區(qū)別,并且較為依賴敵人朝向等信息,故這里單獨作為一個模塊制作。
先來看一下實現這個模塊所需要的腳本結構關系,如圖2所示。
組合攻擊功能腳本的邏輯關系
在圖2中,ComposeAttackController腳本中存放著不同的組合攻擊類型,通過Update事件函數每幀更新當前可觸發(fā)的組合攻擊,并將信息存于索引字段中。上下文Compose- AttackContext結構的信息存放了組合攻擊所需要角色的自身組件,如Animator、Transform等,可根據需求自行增加字段。TriggeredComposeSkill函數是在外部模塊調用時觸發(fā)并通過協程執(zhí)行的。
(1)首先定義一些基礎腳本。先來定義上下文結構,它包含了角色自身的一些信息。
public struct ComposeAttackContext
{
public Transform CasterTransform { get; set; } //自身變換
public Animator Animator { get; set; } //自身Animator組件
}
隨后編寫ComposeAttackBase腳本,它定義了組合攻擊的基本抽象行為。
public abstract class ComposeAttackBase : ScriptableObject
{
public abstract bool CanTrigger(ComposeAttackContext context, bool
prepareTrigger);
public abstract IEnumerator Trigger(ComposeAttackContext context);
CanTrigger函數判斷當前是否可以觸發(fā)組合攻擊;第二個參數prepareTrigger決定是否記錄參數以準備觸發(fā)組合攻擊,例如在檢測的同時記錄下RaycastHit信息。第二個函數Trigger將進入觸發(fā)邏輯。
(2)接下來編寫ComposeAttackController腳本,用于處理組合攻擊邏輯,是該模塊的核心腳本。
public class ComposeAttackController : MonoBehaviour
{
[SerializeField] Animator animator = null; //上下文所需接口,面板暴露參數
//組件列表面板暴露參數
[SerializeField] ComposeAttackBase[] composeAttackArray = null;
//當前已觸發(fā)的組合技能索引
public int TriggerableComposeAttackIndex { get; private set; }
//對外提供組合技能數組列表
public ComposeAttackBase[] GetComposeAttackArray()
{
return composeAttackArray;
}
//每一幀更新組合技能是否觸發(fā)邏輯,但可修改enabled關閉腳本更新
public void Update()
{
var context = new ComposeAttackContext() { Animator = animator,
CasterTransform = transform };
for (int i = 0; i < composeAttackArray.Length; i++)
{
var item = composeAttackArray[i];
if (item.CanTrigger(context, true)) //觸發(fā)條件檢測
{

TriggerableComposeAttackIndex = i;
break;
}
}
}
public IEnumerator TriggeredComposeSkill(int index)//組合技能的觸發(fā)接口
{
if (index > composeAttackArray.Length - 1) //索引越界報錯
throw new ArgumentOutOfRangeException();
var context = new ComposeAttackContext() { Animator = animator,
CasterTransform = transform };
yield return composeAttackArray[index].Trigger(context);//執(zhí)行觸發(fā)
}
}
通常將該腳本掛載至角色自身。
(3)接著編寫一個具體組合攻擊腳本ComposeAttack1。若角色前后或左右都有敵人,就會觸發(fā)該組合攻擊。
public class ComposeAttackController : MonoBehaviour
{
[SerializeField] Animator animator = null; //上下文所需接口,面板暴露參數
//組件列表面板暴露參數
[SerializeField] ComposeAttackBase[] composeAttackArray = null;
//當前已觸發(fā)的組合技能索引
public int TriggerableComposeAttackIndex { get; private set; }
//對外提供組合技能數組列表
public ComposeAttackBase[] GetComposeAttackArray()
{
return composeAttackArray;
}
//每一幀更新組合技能是否觸發(fā)邏輯,但可修改enabled關閉腳本更新
public void Update()
{
var context = new ComposeAttackContext() { Animator = animator,
CasterTransform = transform };
for (int i = 0; i < composeAttackArray.Length; i++)
{
var item = composeAttackArray[i];
if (item.CanTrigger(context, true)) //觸發(fā)條件檢測
{
TriggerableComposeAttackIndex = i;
break;
}
}
}
public IEnumerator TriggeredComposeSkill(int index)//組合技能的觸發(fā)接口
{
if (index > composeAttackArray.Length - 1) //索引越界報錯
throw new ArgumentOutOfRangeException();
var context = new ComposeAttackContext() { Animator = animator,
CasterTransform = transform };
yield return composeAttackArray[index].Trigger(context);//執(zhí)行觸發(fā)
}
}
這里通過CheckBox接口檢測四周是否有敵人,mIsForwardAndBackword變量存儲是左右受敵狀態(tài)還是前后受敵狀態(tài)。Trigger函數中的處理這里較為簡單,在實際項目中建議將具體技能邏輯置于其中。
(4)最后將其在Project面板中創(chuàng)建,并結合ComposeAttackController腳本將其掛載。當外部模塊觸發(fā)輸入后調用觸發(fā)接口以觸發(fā)組合攻擊,如圖3所示。
組合攻擊完成效果圖

熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設計領域和數字藝術教育的重要性,歡迎點擊咨詢報名。
2. 手機游戲如何開發(fā)(如何制作傳奇手游,都需要準備些什么?)
?如何制作傳奇手游,都需要準備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現在的手游,說明時代在進步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費、一鍵制作炫酷特效,適合新手小白??靵碓囋?!
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇。《天命奇御》具有多線劇情多結局,不限主線發(fā)展,高自由...
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應并不會推出《巫師4》。因為《巫師》系列在策劃的時候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現《巫師4》
6. 3D動畫軟件你知道幾個?3ds Max、Blender、Maya、Houdini大比拼
當提到3D動畫軟件或動畫工具時,指的是數字內容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
想讓你的3D打印模型更堅固?不妨嘗試一下Cura參數設置和設計技巧,讓你輕松掌握!
8. 虛幻引擎5節(jié)省存儲空間用這招!緩存的清理與設置
眾所周知,虛幻引擎5(下面簡稱UE5)特別占用存儲空間,僅一個版本安裝好的文件就有60G,這還不包括我們在使用時保存的工程文件和隨之產生的緩存文件。而...
9. Bigtime加密游戲經濟體系揭秘,不同玩家角色的經濟活動
Bigtime加密游戲經濟模型分析,探討游戲經濟特點,幫助玩家更全面了解這款GameFi產品。
10. 3D動漫建模全過程,不是一般人能學的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準備設計圖片,我從雕刻進入。這一次,它將是一種純粹關注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
最新文章
同學您好!