簡單的技能Buff系統(tǒng)
來源:
未知 |
責(zé)任編輯:六月芳菲 |
發(fā)布時(shí)間: 2018-03-07 09:36 | 瀏覽量:
更多精彩unity教程:http://m.trusteddivorcelawyers.com/resource/
在本教程中,我將向您展示如何使用可腳本化對(duì)象為Unity創(chuàng)建靈活的buff系統(tǒng)。我們將使用可編寫腳本的對(duì)象作為快速創(chuàng)建和管理buff的方法,而不必使用外部數(shù)據(jù)類型(如xml或txt文件)。這可以讓我們將buff數(shù)據(jù)從游戲邏輯中分離出來,例如持續(xù)時(shí)間和統(tǒng)計(jì)數(shù)據(jù)。正如您將看到的那樣,這也將允許我們使用CreateAssetMenu屬性將我們的可腳本化對(duì)象綁定為資產(chǎn)。
我們?cè)O(shè)計(jì)的前提將圍繞三個(gè)類。玩家類,buff類和buff腳本對(duì)象。玩家類作為我們的通用玩家模型,它可以同時(shí)具有多個(gè)buff,以及相同類型(堆疊)的多個(gè)buff。 buff腳本對(duì)象充當(dāng)我們的數(shù)據(jù),buff類是我們之間的橋梁,處理每個(gè)buff的邏輯。
首先,我們將創(chuàng)建一個(gè)我們的buff腳本對(duì)象。每個(gè)buff應(yīng)該有一個(gè)持續(xù)時(shí)間,我們需要一種從我們的數(shù)據(jù)創(chuàng)建這個(gè)buff的方法。
ScriptableBuff.cs
public abstract class ScriptableBuff : ScriptableObject
{
public float Duration;
public abstract TimedBuff InitializeBuff(GameObject obj);
}
到目前為止,我們的ScriptableBuff只包含一個(gè)持續(xù)時(shí)間的字段和一個(gè)返回TimedBuff對(duì)象的抽象方法。 TimedBuff是我們需要鏈接數(shù)據(jù)和播放模型的橋梁。
TimedBuff.cs
public abstract class TimedBuff
{
protected float duration;
protected ScriptableBuff buff;
protected GameObject obj;
public Boolean IsFinished
{
get { return duration <= 0? true: false; }
}
public TimedBuff(float duration, ScriptableBuff buff, GameObject obj)
{
this.duration = duration;
this.buff = buff;
this.obj = obj;
}
public void Tick(float delta)
{
duration -= delta;
if(duration <= 0)
End();
}
public abstract void Activate();
public abstract void End();
}
我們假設(shè)所有的buff都有一個(gè)持續(xù)時(shí)間,但是你可以很容易地改變。 我們希望所有TimedBuff對(duì)象存儲(chǔ)引用持續(xù)時(shí)間,buff數(shù)據(jù)和接收buff的游戲?qū)ο蟆?還有以下方法:
void Tick(float delta) – 在buff的更新循環(huán)中調(diào)用它。 這用于在剩余的持續(xù)時(shí)間內(nèi)保持定時(shí)器,完成后調(diào)用End()。
void Activate() – 在初始化后調(diào)用此函數(shù)來激活buff logic.void End()- 持續(xù)時(shí)間結(jié)束時(shí)調(diào)用。 也可以提早調(diào)用“end”buff。
現(xiàn)在我們只需要玩家類。 為此,我們將創(chuàng)建一個(gè)名為BuffableEntity的MonoBehaviour組件。
BuffableEntity.cs
public class BuffableEntity: MonoBehaviour
{
public List<TimedBuff> CurrentBuffs = new List<TimedBuff>();
void Update()
{
//if (Game.isPaused)
// return;
foreach(TimedBuff buff in CurrentBuffs.ToArray())
{
buff.Tick(Time.deltaTime);
if (buff.IsFinished)
{
CurrentBuffs.Remove(buff);
}
}
}
public void AddBuff(TimedBuff buff)
{
CurrentBuffs.Add(buff);
buff.Activate();
}
}
BuffableEntity保存所有當(dāng)前的buff的列表。 在每個(gè)更新循環(huán)期間,它會(huì)選中每個(gè)buff,并刪除已經(jīng)完成的buff。 通過從最后一幀提供deltaTime,這樣可以更好地控制更新buff的時(shí)間。 例如,您可能希望凍結(jié)游戲暫?;蛲婕冶惶蕴瓡r(shí)的持續(xù)時(shí)間。
那么我們?nèi)绾问褂眠@個(gè)buff系統(tǒng)呢?
SpeedBuff.cs
[CreateAssetMenu(menuName = "Buffs/SpeedBuff")]
public class SpeedBuff: ScriptableBuff
{
public float SpeedIncrease;
public override TimedBuff InitializeBuff(GameObject obj)
{
return new TimedSpeedBuff(Duration, this, obj);
}
}
這擴(kuò)展了我們的ScriptableBuff來保存SpeedIncrease上的數(shù)據(jù)。 另外,通過調(diào)用InitializeBuff,我們可以創(chuàng)建一個(gè)TimedSpeedBuff,我們將在下面實(shí)現(xiàn)。 我們還使用CreateAssetMenu屬性來將此腳本化對(duì)象創(chuàng)建為asset。
TimedSpeedBuff.cs
public class TimedSpeedBuff : TimedBuff
{
private SpeedBuff speedBuff;
private MovementComponent movementComponent;
public TimedSpeedBuff(float duration, ScriptableBuff buff, GameObject obj) : base(duration, buff, obj)
{
movementComponent = obj.GetComponent<MovementComponent>();
speedBuff = (SpeedBuff)buff;
}
public override void Activate()
{
SpeedBuff speedBuff = (SpeedBuff) buff;
movementComponent.moveSpeed += speedBuff.SpeedIncrease;
}
public override void End()
{
movementComponent.moveSpeed -= speedBuff.SpeedIncrease;
}
}
這只是一個(gè)簡單的buff,但是您可以看到,在Activate()函數(shù)中,MovementComponent的速度增加,然后在End()函數(shù)中,更改被還原。 這就是實(shí)現(xiàn)你的buff所需要的。。
更多精彩unity教程:http://m.trusteddivorcelawyers.com/resource/
-
分享到:
相關(guān)文章
網(wǎng)友評(píng)論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門