音游的核心玩法
nekocon
音游核心玩法的需求
- 判定秕脓、狀態(tài)(邏輯)
- 動(dòng)畫、特效会油、UI(表現(xiàn))
代碼設(shè)計(jì)和技術(shù)總結(jié)上細(xì)分為
判定
設(shè)計(jì):
將一個(gè)時(shí)間段預(yù)先根據(jù)譜面和note的判定區(qū)間分為n個(gè)已知判定結(jié)果的區(qū)間
將所有note的判定區(qū)間和結(jié)果存在容器中虚缎,以毫秒為單位作為key,以結(jié)果Perfect瞎抛、Great、None作為value.
前后note的區(qū)間重疊有判定優(yōu)先級(jí)之分
優(yōu)點(diǎn):判定效率取決容器的尋址速度却紧,而不是等式判定桐臊,會(huì)更高效率胎撤,更快。缺點(diǎn):數(shù)據(jù)量比較大
技術(shù)總結(jié)
根據(jù)順序断凶,判定會(huì)經(jīng)過(guò)如下3個(gè)模塊
- 觸碰
- iOS伤提、Android原生觸碰代碼
- 判定
- FixedUpdate、Update的區(qū)分
- 規(guī)范高效的代碼
-
音頻
- BGM
- key音
狀態(tài)(buff)
設(shè)計(jì)
- 定義:游戲內(nèi)所有和數(shù)值有關(guān)的行為和規(guī)則认烁,都理解為狀態(tài)肿男,如扣血、加fever却嗡、fever期間暴擊等
- 難點(diǎn):這是策劃內(nèi)容最多變的地方舶沛,為了應(yīng)對(duì)核心玩法中最冗亂、復(fù)雜的模塊窗价,必定需要一種編程模式去實(shí)現(xiàn)
技術(shù)總結(jié)
拋棄具象的Entity編程模式如庭,改用抽象接口去實(shí)現(xiàn)解耦,用組合替換繼承
public interface IBuff
{
void Execute();
}
public class Hurt : IBuff
{
public int value;
public void Execute()
{
CharacterManager.instance.hp -= value;
}
}
//Init note damage buff
IBuff hurt = new Hurt
{
value = damage,
};
//Execute when note attack
hurt.Execute();
事件(event)
再?gòu)?fù)雜的兩層關(guān)系撼港,都可以通過(guò)中間層解決-魯迅
示例1坪它,邏輯和表現(xiàn)、數(shù)據(jù)的代碼都放在一起帝牡,造成耦合:
//如果擊中Perfect區(qū)間
if (m_TimeNodeOrders[Touch.instance.touchtick] == PERFECT)
{
//生成Perfect特效
EffectManager.instance.PlayPerfect();
StaticManager.instance.AddPerfectCount();
}
示例2往毡,游戲邏輯只和event有關(guān)系,而event作為中間層和其他層產(chǎn)生關(guān)系靶溜,匿名者原則
//下面腳本放在游戲事件驅(qū)動(dòng)器GameEvent中
EventManager.instance.Regist("OnPerfectHitted").trigger += EffectManager.instance.PlayPerfect();
EventManager.instance.Regist("OnPerfectHitted").trigger += StaticManager.instance.AddPerfectCount();
//如果擊中Perfect區(qū)間
if (m_TimeNodeOrders[Touch.instance.touchtick] == PERFECT)
{
//觸發(fā)事件
EventManager.instance.Invoke("OnPerfectHitted");
}
游戲表現(xiàn)(view)
設(shè)計(jì)
定義:游戲中的實(shí)體表現(xiàn)卖擅,分別有note、人物墨技、特效惩阶、UI
技術(shù)總結(jié)
-
緩沖池(Pool)提高note和特效的生成效率、降低內(nèi)存負(fù)擔(dān)
-
動(dòng)畫狀態(tài)機(jī)(FSM)提高腳本的靈活性和準(zhǔn)確性
-
數(shù)據(jù)綁定(binding)扣汪,讓一些數(shù)據(jù)的綁定免去重復(fù)沒(méi)有創(chuàng)造性的代碼
-
著色器(shader)優(yōu)化長(zhǎng)按效率断楷,組合圖案形成長(zhǎng)按,剔除崭别,在像素著色器做透明處理
面臨的一些問(wèn)題
安卓機(jī)型的硬件不統(tǒng)一冬筒,造成適配問(wèn)題
- 游戲卡頓
- 音頻延遲
改進(jìn)
- Unity2018.3開始了新的GC系統(tǒng)可以暫時(shí)禁用GC以避免卡頓,Unity2019引入了一種新的GC工作方式茅主,incremental GC舞痰。
- Unity2018引入和ECS框架,可以更大程度地去應(yīng)用設(shè)備的多核功能诀姚,以優(yōu)化游戲核心玩法的流暢度與卡頓响牛。
- Unity2018應(yīng)用了新的音頻系統(tǒng),低延遲播放音頻。
- 核心玩法的數(shù)據(jù)綁定不再用可視化工具呀打,而是純代碼執(zhí)行
- Criware矢赁,Superpowered等一些第三方的音頻中間鍵