? 曰曰摸天天摸人人看久久,美国一级大黄大色毛片视频,欧美人与性动交Α欧美精品
聯系我們

給我們留言

聯系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設計園納金網

郵箱:info@narkii.com

電話:0595-82682267

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

當前位置:主頁 > 3D教程 > 圖文教程

簡單的技能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/



相關文章
網友評論

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

關閉

全部評論:0條

推薦
熱門