? 日本成人黄色网站在线观看,欧美αv日韩αⅴ亚洲
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽(yáng)街道洪山路國(guó)際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁(yè) > 3D教程 > 圖文教程

簡(jiǎn)單的技能Buff系統(tǒng)

來(lái)源: 未知 | 責(zé)任編輯:六月芳菲 | 發(fā)布時(shí)間: 2018-03-07 09:36 | 瀏覽量:

更多精彩unity教程:http://www.594ljc.cn/resource/


在本教程中,我將向您展示如何使用可腳本化對(duì)象為Unity創(chuàng)建靈活的buff系統(tǒng)。我們將使用可編寫(xiě)腳本的對(duì)象作為快速創(chuàng)建和管理buff的方法,而不必使用外部數(shù)據(jù)類型(如xml或txt文件)。這可以讓我們將buff數(shù)據(jù)從游戲邏輯中分離出來(lái),例如持續(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ù)來(lái)激活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。 通過(guò)從最后一幀提供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來(lái)保存SpeedIncrease上的數(shù)據(jù)。 另外,通過(guò)調(diào)用InitializeBuff,我們可以創(chuàng)建一個(gè)TimedSpeedBuff,我們將在下面實(shí)現(xiàn)。 我們還使用CreateAssetMenu屬性來(lái)將此腳本化對(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è)簡(jiǎn)單的buff,但是您可以看到,在Activate()函數(shù)中,MovementComponent的速度增加,然后在End()函數(shù)中,更改被還原。 這就是實(shí)現(xiàn)你的buff所需要的。。
 

更多精彩unity教程:http://www.594ljc.cn/resource/


相關(guān)文章
網(wǎng)友評(píng)論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)

關(guān)閉

全部評(píng)論:0條

推薦
熱門(mén)