簡單的技能Buff系統
來源:
未知 |
責任編輯:六月芳菲 |
發(fā)布時間: 2018-03-07 09:36 | 瀏覽量:
更多精彩unity教程:http://m.594ljc.cn/resource/
在本教程中,我將向您展示如何使用可腳本化對象為Unity創(chuàng)建靈活的buff系統。我們將使用可編寫腳本的對象作為快速創(chuàng)建和管理buff的方法,而不必使用外部數據類型(如xml或txt文件)。這可以讓我們將buff數據從游戲邏輯中分離出來,例如持續(xù)時間和統計數據。正如您將看到的那樣,這也將允許我們使用CreateAssetMenu屬性將我們的可腳本化對象綁定為資產。
我們設計的前提將圍繞三個類。玩家類,buff類和buff腳本對象。玩家類作為我們的通用玩家模型,它可以同時具有多個buff,以及相同類型(堆疊)的多個buff。 buff腳本對象充當我們的數據,buff類是我們之間的橋梁,處理每個buff的邏輯。
首先,我們將創(chuàng)建一個我們的buff腳本對象。每個buff應該有一個持續(xù)時間,我們需要一種從我們的數據創(chuàng)建這個buff的方法。
ScriptableBuff.cs
public abstract class ScriptableBuff : ScriptableObject
{
public float Duration;
public abstract TimedBuff InitializeBuff(GameObject obj);
}
到目前為止,我們的ScriptableBuff只包含一個持續(xù)時間的字段和一個返回TimedBuff對象的抽象方法。 TimedBuff是我們需要鏈接數據和播放模型的橋梁。
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();
}
我們假設所有的buff都有一個持續(xù)時間,但是你可以很容易地改變。 我們希望所有TimedBuff對象存儲引用持續(xù)時間,buff數據和接收buff的游戲對象。 還有以下方法:
void Tick(float delta) – 在buff的更新循環(huán)中調用它。 這用于在剩余的持續(xù)時間內保持定時器,完成后調用End()。
void Activate() – 在初始化后調用此函數來激活buff logic.void End()- 持續(xù)時間結束時調用。 也可以提早調用“end”buff。
現在我們只需要玩家類。 為此,我們將創(chuàng)建一個名為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保存所有當前的buff的列表。 在每個更新循環(huán)期間,它會選中每個buff,并刪除已經完成的buff。 通過從最后一幀提供deltaTime,這樣可以更好地控制更新buff的時間。 例如,您可能希望凍結游戲暫?;蛲婕冶惶蕴瓡r的持續(xù)時間。
那么我們如何使用這個buff系統呢?
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);
}
}
這擴展了我們的ScriptableBuff來保存SpeedIncrease上的數據。 另外,通過調用InitializeBuff,我們可以創(chuàng)建一個TimedSpeedBuff,我們將在下面實現。 我們還使用CreateAssetMenu屬性來將此腳本化對象創(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;
}
}
這只是一個簡單的buff,但是您可以看到,在Activate()函數中,MovementComponent的速度增加,然后在End()函數中,更改被還原。 這就是實現你的buff所需要的。。
更多精彩unity教程:http://m.594ljc.cn/resource/
-
分享到:
相關文章
網友評論
全部評論:0條
推薦
熱門