激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

unity3d 網(wǎng)絡(luò)游戲開發(fā)(Unity3D開發(fā)實(shí)踐:動(dòng)作游戲《君臨都市》案例剖析(贈(zèng)送活動(dòng)))

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

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

unity3d 網(wǎng)絡(luò)游戲開發(fā)(Unity3D開發(fā)實(shí)踐:動(dòng)作游戲《君臨都市》案例剖析(贈(zèng)送活動(dòng)))

文/周尚宣


本文選自機(jī)械工業(yè)出版社出版的《Unity3D動(dòng)作游戲開發(fā)》一書的9.1節(jié),略有改動(dòng)。經(jīng)出版社授權(quán)刊登于此。



君臨都市是一款PS2末期推出的動(dòng)作游戲,它沿襲了格斗游戲嚴(yán)謹(jǐn)?shù)呐卸ú⒁匀_格斗作為其主要戰(zhàn)斗模式。戰(zhàn)斗中存在著大量的投技、拆投、組合技等,游戲中還設(shè)有部位破壞的獨(dú)特概念,角色被分為上中下三段傷害區(qū)域,玩家不可一味地對(duì)其某一段進(jìn)行攻擊,從而增加戰(zhàn)斗的策略性。本節(jié)將針對(duì)多人組合技能以及人形通用動(dòng)作的設(shè)計(jì)來進(jìn)行剖析。


通用動(dòng)作方案設(shè)計(jì)


本作中設(shè)有60名敵人,包括不同的流派、體型、身高等,如第16關(guān)的空手道角色或女主角的功夫等。如此之多的角色動(dòng)畫是這一類游戲的典型問題之一,通常可以采用一套通用動(dòng)畫的多個(gè)不同形體的方式并借助通用骨骼去解決,即一個(gè)動(dòng)畫同時(shí)做瘦、中、胖三個(gè)版本,以匹配不同體型的敵人。在Unity引擎中,使用人形動(dòng)畫的功能可以解決這類需求。


繼續(xù)觀察本作會(huì)發(fā)現(xiàn),一些流派使用的角色相對(duì)較少,且角色大都為中等體型,并且女性角色較少。所以進(jìn)一步優(yōu)化,在制作通用骨骼動(dòng)畫時(shí)對(duì)于使用固定流派的敵人可以做一套通用;而對(duì)于通用流派的敵人,建議依據(jù)身高、體型制作兩套或以上通用動(dòng)畫即可。


組合攻擊的再實(shí)現(xiàn)


本作中的組合攻擊通常是指多個(gè)己方角色同時(shí)對(duì)敵人發(fā)動(dòng)的特殊動(dòng)畫攻擊,或者是依賴站位在特殊條件下主角一人對(duì)多人發(fā)動(dòng)的特殊動(dòng)畫攻擊,如圖1所示。


一對(duì)三組合攻擊示意圖


這里以主角一對(duì)多組合攻擊的情形進(jìn)行腳本實(shí)現(xiàn),這種情形的觸發(fā)邏輯一般是當(dāng)主角周邊站有敵人時(shí),以敵人的某種朝向、站姿的指定規(guī)則進(jìn)行觸發(fā)??紤]到其與技能系統(tǒng)還是有一些區(qū)別,并且較為依賴敵人朝向等信息,故這里單獨(dú)作為一個(gè)模塊制作。


先來看一下實(shí)現(xiàn)這個(gè)模塊所需要的腳本結(jié)構(gòu)關(guān)系,如圖2所示。


組合攻擊功能腳本的邏輯關(guān)系


在圖2中,ComposeAttackController腳本中存放著不同的組合攻擊類型,通過Update事件函數(shù)每幀更新當(dāng)前可觸發(fā)的組合攻擊,并將信息存于索引字段中。上下文Compose- AttackContext結(jié)構(gòu)的信息存放了組合攻擊所需要角色的自身組件,如Animator、Transform等,可根據(jù)需求自行增加字段。TriggeredComposeSkill函數(shù)是在外部模塊調(diào)用時(shí)觸發(fā)并通過協(xié)程執(zhí)行的。


(1)首先定義一些基礎(chǔ)腳本。先來定義上下文結(jié)構(gòu),它包含了角色自身的一些信息。


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函數(shù)判斷當(dāng)前是否可以觸發(fā)組合攻擊;第二個(gè)參數(shù)prepareTrigger決定是否記錄參數(shù)以準(zhǔn)備觸發(fā)組合攻擊,例如在檢測(cè)的同時(shí)記錄下RaycastHit信息。第二個(gè)函數(shù)Trigger將進(jìn)入觸發(fā)邏輯。


(2)接下來編寫ComposeAttackController腳本,用于處理組合攻擊邏輯,是該模塊的核心腳本。


public class ComposeAttackController : MonoBehaviour

{

[SerializeField] Animator animator = null; //上下文所需接口,面板暴露參數(shù)

//組件列表面板暴露參數(shù)

[SerializeField] ComposeAttackBase[] composeAttackArray = null;

//當(dāng)前已觸發(fā)的組合技能索引

public int TriggerableComposeAttackIndex { get; private set; }

//對(duì)外提供組合技能數(shù)組列表

public ComposeAttackBase[] GetComposeAttackArray()

{

return composeAttackArray;

}

//每一幀更新組合技能是否觸發(fā)邏輯,但可修改enabled關(guān)閉腳本更新

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ā)條件檢測(cè)

{

unity3d 網(wǎng)絡(luò)游戲開發(fā)(Unity3D開發(fā)實(shí)踐:動(dòng)作游戲《君臨都市》案例剖析(贈(zèng)送活動(dòng)))

TriggerableComposeAttackIndex = i;

break;

}

}

}

public IEnumerator TriggeredComposeSkill(int index)//組合技能的觸發(fā)接口

{

if (index > composeAttackArray.Length - 1) //索引越界報(bào)錯(cuò)

throw new ArgumentOutOfRangeException();

var context = new ComposeAttackContext() { Animator = animator,

CasterTransform = transform };

yield return composeAttackArray[index].Trigger(context);//執(zhí)行觸發(fā)

}

}


通常將該腳本掛載至角色自身。


(3)接著編寫一個(gè)具體組合攻擊腳本ComposeAttack1。若角色前后或左右都有敵人,就會(huì)觸發(fā)該組合攻擊。


public class ComposeAttackController : MonoBehaviour

{

[SerializeField] Animator animator = null; //上下文所需接口,面板暴露參數(shù)

//組件列表面板暴露參數(shù)

[SerializeField] ComposeAttackBase[] composeAttackArray = null;

//當(dāng)前已觸發(fā)的組合技能索引

public int TriggerableComposeAttackIndex { get; private set; }

//對(duì)外提供組合技能數(shù)組列表

public ComposeAttackBase[] GetComposeAttackArray()

{

return composeAttackArray;

}

//每一幀更新組合技能是否觸發(fā)邏輯,但可修改enabled關(guān)閉腳本更新

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ā)條件檢測(cè)

{

TriggerableComposeAttackIndex = i;

break;

}

}

}

public IEnumerator TriggeredComposeSkill(int index)//組合技能的觸發(fā)接口

{

if (index > composeAttackArray.Length - 1) //索引越界報(bào)錯(cuò)

throw new ArgumentOutOfRangeException();

var context = new ComposeAttackContext() { Animator = animator,

CasterTransform = transform };

yield return composeAttackArray[index].Trigger(context);//執(zhí)行觸發(fā)

}

}


這里通過CheckBox接口檢測(cè)四周是否有敵人,mIsForwardAndBackword變量存儲(chǔ)是左右受敵狀態(tài)還是前后受敵狀態(tài)。Trigger函數(shù)中的處理這里較為簡(jiǎn)單,在實(shí)際項(xiàng)目中建議將具體技能邏輯置于其中。


(4)最后將其在Project面板中創(chuàng)建,并結(jié)合ComposeAttackController腳本將其掛載。當(dāng)外部模塊觸發(fā)輸入后調(diào)用觸發(fā)接口以觸發(fā)組合攻擊,如圖3所示。


組合攻擊完成效果圖

unity3d 網(wǎng)絡(luò)游戲開發(fā)(Unity3D開發(fā)實(shí)踐:動(dòng)作游戲《君臨都市》案例剖析(贈(zèng)送活動(dòng)))

熱門課程推薦

熱門資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定