亚洲AV免费看深爱成人|日韩av另类一级特黄片在线|中国免费一级黄片|国产av一二三区|亚洲有码AV在线|久久亚洲国产日韩欧美|成人免费AV网站|婷婷一区综合一区|亚洲AV无码导航|高级欧美成人网站

unity3d 網絡游戲開發(fā)(Unity3D開發(fā)實踐:動作游戲《君臨都市》案例剖析(贈送活動))

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

?Unity3D開發(fā)實踐:動作游戲《君臨都市》案例剖析(贈送活動)

unity3d 網絡游戲開發(fā)(Unity3D開發(fā)實踐:動作游戲《君臨都市》案例剖析(贈送活動))

文/周尚宣


本文選自機械工業(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ā)條件檢測

{

unity3d 網絡游戲開發(fā)(Unity3D開發(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所示。


組合攻擊完成效果圖

unity3d 網絡游戲開發(fā)(Unity3D開發(fā)實踐:動作游戲《君臨都市》案例剖析(贈送活動))

熱門課程推薦

熱門資訊

請綁定手機號

x

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯系,請保持電話暢通!
確定