中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

上海最好的網站建設公司/百度競價推廣方案

上海最好的網站建設公司,百度競價推廣方案,wordpress自動加標簽,佳木斯市向陽區(qū)建設派出所網站文章目錄 先來看看最終效果前言開始BUFF系統加幾個BUFF測試1. 逐層消失,升級不重置剩余時間的BUFF2. 一次性全部消失,升級重置剩余時間的BUFF3. 永久BUFF,類似被動BUFF4. 負面BUFF,根據當前BUFF等級計算每秒收到傷害值&#xff0c…

文章目錄

  • 先來看看最終效果
  • 前言
  • 開始
  • BUFF系統
  • 加幾個BUFF測試
    • 1. 逐層消失,升級不重置剩余時間的BUFF
    • 2. 一次性全部消失,升級重置剩余時間的BUFF
    • 3. 永久BUFF,類似被動BUFF
    • 4. 負面BUFF,根據當前BUFF等級計算每秒收到傷害值,當兩個不同單位向同一個單位施加同一個buff時BUFF獨立存在
    • 5. 一級疊加兩層,后面都疊加一層
  • 最終效果
  • 參考
  • 源碼
  • 完結

先來看看最終效果

在這里插入圖片描述

前言

當今大多數游戲都擁有一些形式的Buff系統,利用這種系統可以增強或削弱游戲角色的特定屬性。在Unity中,我們可以使用腳本輕松地創(chuàng)建這樣的Buff系統。

在本教程中,我們將探索如何實現一種基本的Buff系統,其中包括對游戲中的玩家或敵對角色施加各種不同類型的Buff。我們還將學習如何設置時間限制和疊加限制,以及如何實現Buff效果的應用和移除。

通過本教程,您將學習如何在Unity中創(chuàng)建一個完整的Buff系統,為您的游戲增加全新的深度和策略性。

開始

新增腳本PlayerController,添加玩家血量和攻擊力變量,并實時顯示

public class PlayerController : MonoBehaviour
{[Header("生命值")]public float HP;[Header("攻擊力")]public float AD;public TextMeshProUGUI HPText;public TextMeshProUGUI ADText;private void Update(){HPText.text = $"生命值:{HP}";ADText.text = $"攻擊力:{AD}";}
}

效果
在這里插入圖片描述
繪制BUFF顯示界面
狀態(tài)欄
在這里插入圖片描述
遮罩
在這里插入圖片描述
最終效果
在這里插入圖片描述

BUFF系統

定義BUFF類型枚舉

public enum BuffType
{/// <summary>/// 正面buff/// </summary>Buff,/// <summary>/// 負面buff/// </summary>Debuff,/// <summary>/// 沒有buff/// </summary>None,
}

BUFF沖突方式枚舉類型

/// <summary>
/// 當兩個不同單位向同一個單位施加同一個buff時的沖突處理
/// </summary>
public enum ConflictResolution
{/// <summary>/// 合并為一個buff,疊層(提高等級)/// </summary>combine,/// <summary>/// 獨立存在/// </summary>separate,/// <summary>/// 覆蓋,后者覆蓋前者/// </summary>cover,
}

新建BuffBase,Buff系統中的基類

public class BuffBase
{private GameObject m_Owner;private string m_Provider = "";private float m_MaxDuration = 3;private float m_TimeScale = 1;private int m_MaxLevel = 1;private BuffType m_BuffType = BuffType.None;private ConflictResolution m_ConflictResolution = ConflictResolution.cover;private bool m_Dispellable = true;private string m_Name = "默認名稱";private string m_Description = "這個Buff沒有介紹";private int m_Demotion = 1;private string m_IconPath = "";private int m_CurrentLevel = 0;private float m_ResidualDuration = 3;private bool m_Initialized = false;/// <summary>/// 此buff的持有者/// </summary>public GameObject Owner{get { return m_Owner; }protected set { m_Owner = value; }}/// <summary>/// 此Buff的提供者/// </summary>public string Provider{get { return m_Provider; }protected set { m_Provider = value; }}/// <summary>/// Buff的初始持續(xù)時間/// </summary>public float MaxDuration{get { return m_MaxDuration; }protected set { m_MaxDuration = Math.Clamp(value, 0, float.MaxValue); }}/// <summary>/// buff的時間流失速度,最小為0,最大為10。/// </summary>public float TimeScale{get { return m_TimeScale; }set { m_TimeScale = Math.Clamp(value, 0, 10); }}/// <summary>/// buff的最大堆疊層數,最小為1,最大為2147483647/// </summary>public int MaxLevel{get { return m_MaxLevel; }protected set { m_MaxLevel = Math.Clamp(value, 1, int.MaxValue); }}/// <summary>/// Buff的類型,分為正面、負面、中立三種/// </summary>public BuffType BuffType{get { return m_BuffType; }protected set { m_BuffType = value; }}/// <summary>/// 當兩個不同單位向同一個單位施加同一個buff時的沖突處理/// 分為三種:/// combine,合并為一個buff,疊層(提高等級)///  separate,獨立存在///   cover, 覆蓋,后者覆蓋前者/// </summary>public ConflictResolution ConflictResolution{get { return m_ConflictResolution; }protected set { m_ConflictResolution = value; }}/// <summary>/// 可否被驅散/// </summary>public bool Dispellable{get { return m_Dispellable; }protected set { m_Dispellable = value; }}/// <summary>/// Buff對外顯示的名稱/// </summary>public string Name{get { return m_Name; }protected set { m_Name = value; }}/// <summary>/// Buff的介紹文本/// </summary>public string Description{get { return m_Description; }protected set { m_Description = value; }}/// <summary>/// 圖標資源的路徑/// </summary>public string IconPath{get { return m_IconPath; }protected set { m_IconPath = value; }}/// <summary>/// 每次Buff持續(xù)時間結束時降低的等級,一般降低1級或者降低為0級。/// </summary>public int Demotion{get { return m_Demotion; }protected set { m_Demotion = Math.Clamp(value, 0, MaxLevel); }}/// <summary>/// Buff的當前等級/// </summary>public int CurrentLevel{get { return m_CurrentLevel; }set{//計算出改變值int change = Math.Clamp(value, 0, MaxLevel) - m_CurrentLevel;OnLevelChange(change);m_CurrentLevel += change;}}/// <summary>/// Buff的當前剩余時間/// </summary>public float ResidualDuration{get { return m_ResidualDuration; }set { m_ResidualDuration = Math.Clamp(value, 0, float.MaxValue); }}/// <summary>/// 當Owner獲得此buff時觸發(fā)/// 由BuffManager在合適的時候調用/// </summary>public virtual void OnGet() { }/// <summary>/// 當Owner失去此buff時觸發(fā)/// 由BuffManager在合適的時候調用/// </summary>public virtual void OnLost() { }/// <summary>/// Update,由BuffManager每物理幀調用/// </summary>public virtual void FixedUpdate() { }/// <summary>/// 當等級改變時調用/// </summary>/// <param name="change">改變了多少級</param>protected virtual void OnLevelChange(int change) { }/// <summary>/// 初始化/// </summary>/// <param name="owner"></param>/// <param name="provider"></param>/// <exception cref="Exception"></exception>public virtual void Initialize(GameObject owner, string provider){if (m_Initialized){throw new Exception("不能對已經初始化的buff再次初始化");}if (owner == null || provider == null){throw new Exception("初始化值不能為空");}Owner = owner;Provider = provider;m_Initialized = true;}
}

新建ShowBuff,控制BUFF的顯示

public class ShowBuff : MonoBehaviour
{[SerializeField, Header("Buff項預制體")]private GameObject m_BuffItemTemplate;[SerializeField, Header("對象池")]private GameObject m_Pool;[SerializeField, Header("Buff項父物體")]private GameObject m_Buffs;[SerializeField, Header("與Buff相關聯的游戲對象")]private PlayerController m_Hero;private ObjectPool<UI_BuffItem> m_BuffItemPool;// Buff項對象池// Buff項對象池的創(chuàng)建函數,用于實例化Buff項private UI_BuffItem Pool_CreateFunc(){return Instantiate(m_BuffItemTemplate, this.transform).GetComponent<UI_BuffItem>();}// Buff項對象池的獲取時回調,用于激活對象并設置父物體private void Pool_ActionOnGet(UI_BuffItem UI_BuffItem){UI_BuffItem.gameObject.SetActive(true);UI_BuffItem.transform.SetParent(m_Buffs.transform);}// Buff項對象池的回收時回調,用于隱藏對象并設置父物體private void Pool_ActionOnRelease(UI_BuffItem UI_BuffItem){UI_BuffItem.gameObject.SetActive(false);UI_BuffItem.transform.SetParent(m_Pool.transform);}// Buff項對象池的銷毀時回調,用于銷毀對象private void Pool_ActionOnDestroy(UI_BuffItem UI_BuffItem){Destroy(UI_BuffItem.gameObject);}// Buff監(jiān)聽器,當有新的Buff時調用ShowBuffCore方法private void BuffListener(BuffBase newBuff){ShowBuffCore(newBuff);}private void ShowBuffCore(BuffBase buff){m_BuffItemPool.Get().Initialize(buff, m_BuffItemPool);}private void Awake(){m_BuffItemPool = new ObjectPool<UI_BuffItem>(Pool_CreateFunc,Pool_ActionOnGet,Pool_ActionOnRelease,Pool_ActionOnDestroy,true,100,10000);// 遍歷BuffManager中與m_Hero關聯的所有Buff,并調用ShowBuffCore方法顯示它們foreach (BuffBase item in BuffManager.Instance.StartObserving(m_Hero.gameObject, BuffListener)){ShowBuffCore(item);}}}

掛載腳本并配置參數
在這里插入圖片描述
新增UI_BuffItem,控制Buff信息UI顯示

public class UI_BuffItem : MonoBehaviour
{[SerializeField, Header("遮罩層")]private Image m_Mask_M;[SerializeField, Header("等級文本")]private TextMeshProUGUI m_Level;[SerializeField, Header("邊框")]private Image m_Frame;[SerializeField, Header("圖標")]private Image m_Icon;[Space][Header("Buff詳情")][SerializeField, Header("詳情彈窗")]private GameObject m_BuffInfo;[SerializeField, Header("Buff名稱文本")]private TextMeshProUGUI m_BuffName;[SerializeField, Header("Buff描述文本")]private TextMeshProUGUI m_Description;[SerializeField, Header("Buff來源文本")]private TextMeshProUGUI m_Provider;private ObjectPool<UI_BuffItem> m_RecyclePool;private bool m_Initialized = false;// 是否已經初始化private bool m_NeedNumber = false;// 是否需要顯示等級private bool m_NeedLine = false;// 是否需要顯示計時工具private BuffBase m_TargetBuff;public void OnPointerEnter(){m_BuffInfo.gameObject.SetActive(true);ShowInfo(m_TargetBuff);}// 顯示Buff詳細信息public void ShowInfo(BuffBase buff){m_BuffName.text = buff.Name;m_Description.text = buff.Description;m_Provider.text = "來自:" + buff.Provider;}public void OnPointerExit(){m_BuffInfo.gameObject.SetActive(false);}public void Initialize(BuffBase buff, ObjectPool<UI_BuffItem> recyclePool){m_Icon.sprite = Resources.Load<Sprite>(buff.IconPath);m_TargetBuff = buff;m_RecyclePool = recyclePool;if (m_TargetBuff.MaxLevel > 1){m_NeedNumber = true;m_Level.gameObject.SetActive(true);}else{m_NeedNumber = false;m_Level.gameObject.SetActive(false);}if (m_TargetBuff.TimeScale > 0){m_NeedLine = true;m_Mask_M.gameObject.SetActive(true);}else{m_NeedLine = false;m_Mask_M.gameObject.SetActive(false);}switch (buff.BuffType){case BuffType.Buff:m_Frame.color = Color.green;break;case BuffType.Debuff:m_Frame.color = Color.red;break;case BuffType.None:m_Frame.color = Color.white;break;default:break;}m_Initialized = true;}private void Update(){if (m_Initialized){//需要顯示計時工具才顯示if (m_NeedLine){m_Mask_M.fillAmount = 1 - (m_TargetBuff.ResidualDuration / m_TargetBuff.MaxDuration);}//需要顯示等級才顯示if (m_NeedNumber){m_Level.text = m_TargetBuff.CurrentLevel.ToString();}//如果當前等級等于零說明他已經被廢棄了,所以就可以回收了if (m_TargetBuff.CurrentLevel == 0 ){m_RecyclePool.Release(this);}}}
}

綁定腳本,配置參數并添加鼠標移入移出事件
在這里插入圖片描述
新增ShowBuff,控制BUFFBuff的顯示

public class ShowBuff : MonoBehaviour
{[SerializeField, Header("Buff項預制體")]private GameObject m_BuffItemTemplate;[SerializeField, Header("對象池")]private GameObject m_Pool;[SerializeField, Header("Buff項父物體")]private GameObject m_Buffs;[SerializeField, Header("與Buff相關聯的游戲對象")]private PlayerController m_Hero;private ObjectPool<UI_BuffItem> m_BuffItemPool;// Buff項對象池// Buff項對象池的創(chuàng)建函數,用于實例化Buff項private UI_BuffItem Pool_CreateFunc(){return Instantiate(m_BuffItemTemplate, this.transform).GetComponent<UI_BuffItem>();}// Buff項對象池的獲取時回調,用于激活對象并設置父物體private void Pool_ActionOnGet(UI_BuffItem UI_BuffItem){UI_BuffItem.gameObject.SetActive(true);UI_BuffItem.transform.SetParent(m_Buffs.transform);}// Buff項對象池的回收時回調,用于隱藏對象并設置父物體private void Pool_ActionOnRelease(UI_BuffItem UI_BuffItem){UI_BuffItem.gameObject.SetActive(false);UI_BuffItem.transform.SetParent(m_Pool.transform);}// Buff項對象池的銷毀時回調,用于銷毀對象private void Pool_ActionOnDestroy(UI_BuffItem UI_BuffItem){Destroy(UI_BuffItem.gameObject);}// Buff監(jiān)聽器,當有新的Buff時調用ShowBuffCore方法private void BuffListener(BuffBase newBuff){ShowBuffCore(newBuff);}private void ShowBuffCore(BuffBase buff){m_BuffItemPool.Get().Initialize(buff, m_BuffItemPool);}private void Awake(){m_BuffItemPool = new ObjectPool<UI_BuffItem>(Pool_CreateFunc,Pool_ActionOnGet,Pool_ActionOnRelease,Pool_ActionOnDestroy,true,100,10000);// 遍歷BuffManager中與m_Hero關聯的所有Buff,并調用ShowBuffCore方法顯示它們foreach (BuffBase item in BuffManager.Instance.StartObserving(m_Hero.gameObject, BuffListener)){ShowBuffCore(item);}}
}

掛載腳本,配置參數
在這里插入圖片描述
新增BuffManager,BUFF管理類

public class BuffManager : MonoBehaviour
{/// <summary>/// 固定時間更新的更新頻率,此值不宜過高,可以過低(會增加性能消耗)。/// </summary>public const float FixedDeltaTime = 0.1f;#region 單例private static BuffManager m_Instance;public static BuffManager Instance{get{if (m_Instance == null){GameObject l_GameObject = new GameObject("Buff Manager");m_Instance = l_GameObject.AddComponent<BuffManager>();DontDestroyOnLoad(l_GameObject);}return m_Instance;}}#endregion/// <summary>/// 存儲了所有的buff,key為buff持有者,value為他所持有的所有buff。/// </summary>private Dictionary<GameObject, List<BuffBase>> m_BuffDictionary = new Dictionary<GameObject, List<BuffBase>>(25);private Dictionary<GameObject, Action<BuffBase>> m_ObserverDicitinary = new Dictionary<GameObject, Action<BuffBase>>(25);#region Public方法/// <summary>/// 返回要觀察的對象現有的buff,并且在對象被添加新buff時通知你/// (如果現在對象身上沒有buff會返回空列表,不會返回null)/// </summary>/// <returns></returns>public List<BuffBase> StartObserving(GameObject target, Action<BuffBase> listener){List<BuffBase> list;//添加監(jiān)聽if (!m_ObserverDicitinary.ContainsKey(target)){m_ObserverDicitinary.Add(target, null);}m_ObserverDicitinary[target] += listener;//查找已有buffif (m_BuffDictionary.ContainsKey(target)){list = m_BuffDictionary[target];}else{list = new List<BuffBase>();}//返回return list;}/// <summary>/// 停止觀察某一對象,請傳入與調用開始觀察方法時使用的相同參數。/// </summary>/// <param name="target"></param>/// <param name="listener"></param>/// <exception cref="Exception"></exception>public void StopObsveving(GameObject target, Action<BuffBase> listener){if (!m_ObserverDicitinary.ContainsKey(target)){throw new Exception("要停止觀察的對象不存在");}m_ObserverDicitinary[target] -= listener;if (m_ObserverDicitinary[target] == null){m_ObserverDicitinary.Remove(target);}}/// <summary>/// 在目標身上掛buff/// </summary>/// <typeparam name="T"></typeparam>/// <param name="target"></param>/// <param name="provider"></param>/// <param name="level"></param>public void AddBuff<T>(GameObject target, string provider, int level = 1) where T : BuffBase, new(){//如果我們的字典里沒有存儲這個key,就進行初始化if (!m_BuffDictionary.ContainsKey(target)){m_BuffDictionary.Add(target, new List<BuffBase>(5));//目標身上自然沒有任何buff,直接掛一個新buff即可AddNewBuff<T>(target, provider, level);return;}//如果目標身上沒有任何buff,直接掛一個新buff即可if (m_BuffDictionary[target].Count == 0){AddNewBuff<T>(target, provider, level);return;}//遍歷看看目標身上有沒有已存在的要掛的buff。List<T> temp01 = new List<T>();foreach (BuffBase item in m_BuffDictionary[target]){if (item is T){temp01.Add(item as T);}}//如果沒有直接掛一個新buff就行了//如果有已存在的要掛的buff,就要進行沖突處理了if (temp01.Count == 0){AddNewBuff<T>(target, provider, level);}else{switch (temp01[0].ConflictResolution){//如果是獨立存在,那也直接掛buffcase ConflictResolution.separate:bool temp = true;foreach (T item in temp01){if (item.Provider == provider){item.CurrentLevel += level;temp = false;continue;}}if (temp){AddNewBuff<T>(target, provider, level);}break;//如果是合并,則跟已有的buff疊層。case ConflictResolution.combine:temp01[0].CurrentLevel += level;break;//如果是覆蓋,則移除舊buff,然后添加這個buff。case ConflictResolution.cover:RemoveBuff(target, temp01[0]);AddNewBuff<T>(target, provider, level);break;}}}/// <summary>/// 獲得單位身上指定類型的buff的列表/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Owner"></param>/// <returns></returns>public List<T> FindBuff<T>(GameObject Owner) where T : BuffBase, new(){List<T> result = new List<T>();if (m_BuffDictionary.ContainsKey(Owner)){List<BuffBase> buff = m_BuffDictionary[Owner];foreach (BuffBase item in buff){if (item is T){result.Add(item as T);}}}return result;}/// <summary>/// 獲得單位身上所有的buff/// 如果單位身上沒有任何buff則返回空列表/// </summary>/// <param name="Owner"></param>/// <returns></returns>public List<BuffBase> FindAllBuff(GameObject Owner){List<BuffBase> result = new List<BuffBase>();if (m_BuffDictionary.ContainsKey(Owner)){result = m_BuffDictionary[Owner];}return result;}/// <summary>/// 移除單位身上指定的一個buff/// </summary>/// <param name="owner"></param>/// <param name="buff"></param>/// <returns>是否成功,如果失敗說明目標不存在</returns>public bool RemoveBuff(GameObject owner, BuffBase buff){if (!m_BuffDictionary.ContainsKey(owner)){return false;}bool haveTarget = false;foreach (BuffBase item in m_BuffDictionary[owner]){if (item == buff){haveTarget = true;item.CurrentLevel -= item.CurrentLevel;item.OnLost();m_BuffDictionary[owner].Remove(item);break;}}if (!haveTarget){return false;}return true;}#endregion#region Private方法private void AddNewBuff<T>(GameObject target, string provider, int level) where T : BuffBase, new(){T buff = new T();buff.Initialize(target, provider);m_BuffDictionary[target].Add(buff);buff.ResidualDuration = buff.MaxDuration;buff.CurrentLevel = level;buff.OnGet();if (m_ObserverDicitinary.ContainsKey(target)){m_ObserverDicitinary[target]?.Invoke(buff);}}#endregionprivate WaitForSeconds m_WaitForFixedDeltaTimeSeconds = new WaitForSeconds(FixedDeltaTime);private IEnumerator ExecuteFixedUpdate(){while (true){yield return m_WaitForFixedDeltaTimeSeconds;//執(zhí)行所有buff的update;foreach (KeyValuePair<GameObject, List<BuffBase>> item1 in m_BuffDictionary){foreach (BuffBase item2 in item1.Value){if (item2.CurrentLevel > 0 && item2.Owner != null){item2.FixedUpdate();}}}}}private WaitForSeconds m_WaitFor10Seconds = new WaitForSeconds(10f);private Dictionary<GameObject, List<BuffBase>> m_BuffDictionaryCopy = new Dictionary<GameObject, List<BuffBase>>(25);private IEnumerator ExecuteGrabageCollection(){while (true){yield return m_WaitFor10Seconds;//復制一份m_BuffDictionaryCopy.Clear();foreach (KeyValuePair<GameObject, List<BuffBase>> item in m_BuffDictionary){m_BuffDictionaryCopy.Add(item.Key, item.Value);}//清理無用對象foreach (KeyValuePair<GameObject, List<BuffBase>> item in m_BuffDictionaryCopy){//如果owner被刪除,我們這邊也跟著刪除if (item.Key == null){m_BuffDictionary.Remove(item.Key);continue;}//如果一個owner身上沒有任何buff,就沒必要留著他了if (item.Value.Count == 0){m_BuffDictionary.Remove(item.Key);continue;}}}}private void Awake(){StartCoroutine(ExecuteFixedUpdate());StartCoroutine(ExecuteGrabageCollection());}private BuffBase m_Transfer_Buff;private void FixedUpdate(){//清理無用對象foreach (KeyValuePair<GameObject, List<BuffBase>> item in m_BuffDictionary){//清理無用buff//降低持續(xù)時間for (int i = item.Value.Count - 1; i >= 0; i--){m_Transfer_Buff = item.Value[i];//如果等級為0,則移除if (m_Transfer_Buff.CurrentLevel == 0){RemoveBuff(item.Key, m_Transfer_Buff);continue;}//如果持續(xù)時間為0,則降級,//降級后如果等級為0則移除,否則刷新持續(xù)時間if (m_Transfer_Buff.ResidualDuration == 0){m_Transfer_Buff.CurrentLevel -= m_Transfer_Buff.Demotion;if (m_Transfer_Buff.CurrentLevel == 0){RemoveBuff(item.Key, m_Transfer_Buff);continue;}else{m_Transfer_Buff.ResidualDuration = m_Transfer_Buff.MaxDuration;}}//降低持續(xù)時間m_Transfer_Buff.ResidualDuration -= Time.fixedDeltaTime;}}}
}

加幾個BUFF測試

1. 逐層消失,升級不重置剩余時間的BUFF

public class Buff001 : BuffBase
{// Buff每秒鐘恢復的生命值private float m_HealingPerSecond = 20f;// 作用目標,即被添加Buff的角色private PlayerController playerController;// 初始化Buff的屬性和狀態(tài)public override void Initialize(GameObject owner, string provider){base.Initialize(owner, provider);// 獲取作用目標的PlayerController組件playerController = owner.GetComponent<PlayerController>();// 設置Buff的基本屬性MaxDuration = 15; // 最大持續(xù)時間為15秒TimeScale = 1f;   // 時間流失速度為正常值MaxLevel = 5;     // 最大等級為5級BuffType = BuffType.Buff; // Buff類型為增益效果ConflictResolution = ConflictResolution.combine; // Buff沖突時采用合并方式Dispellable = false; // 不可被驅散Name = "生命值";   // Buff的名稱Description = $"每秒恢復{m_HealingPerSecond}點生命值"; // Buff的描述Demotion = 1; // 每次Buff持續(xù)時間結束時降低的等級IconPath = "Icon/2003"; // Buff的圖標路徑}// 在固定時間間隔內更新Buff的效果public override void FixedUpdate(){// 每秒鐘恢復指定的生命值playerController.HP += m_HealingPerSecond * BuffManager.FixedDeltaTime;}
}

調用測試

public class Test : MonoBehaviour
{public PlayerController playerController;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){//作用目標 來源:自己,每次加1層BuffManager.Instance.AddBuff<Buff001>(playerController.gameObject, "自己", 1);}}
}

效果
在這里插入圖片描述

2. 一次性全部消失,升級重置剩余時間的BUFF

public class Buff002 : BuffBase
{// 攻擊力增加的數值private float m_ADUp = 10f;private PlayerController playerController;public override void Initialize(GameObject owner, string provider){base.Initialize(owner, provider);MaxDuration = 5f;// 最大持續(xù)時間為5秒MaxLevel = 10;// 最大等級為10級BuffType = BuffType.Buff;// Buff類型為增益效果ConflictResolution = ConflictResolution.combine;// Buff沖突時采用合并方式Dispellable = false;// 不可被驅散Name = "借來的短劍";// Buff的名稱Description = "每層增加10點攻擊力";// Buff的描述IconPath = "Icon/1036";// Buff的圖標路徑Demotion = MaxLevel;// 每次Buff持續(xù)時間結束時降低的等級playerController = Owner.GetComponent<PlayerController>();}//當等級改變時調用protected override void OnLevelChange(int change){// 根據變化的等級調整角色的攻擊力playerController.AD += m_ADUp * change;//每次升級,重置Buff的當前剩余時間ResidualDuration = MaxDuration;}
}

調用

BuffManager.Instance.AddBuff<Buff002>(playerController.gameObject, "自己", 1);

效果
在這里插入圖片描述

3. 永久BUFF,類似被動BUFF

public class Buff003 : BuffBase
{PlayerController playerController;public override void Initialize(GameObject owner, string provider){base.Initialize(owner, provider);TimeScale = 0f;// 時間縮放為0,暫停游戲中的時間流逝MaxLevel = int.MaxValue;// 最大等級設置為int的最大值,表示無限等級BuffType = BuffType.Buff;// Buff類型為增益效果ConflictResolution = ConflictResolution.separate;// Buff沖突時采用分離方式Dispellable = false;// 不可被驅散Name = "盛宴";Description = "增加生命值";IconPath = "Icon/Feast";Demotion = 0;// 每次Buff持續(xù)時間結束時降低的等級playerController = owner.GetComponent<PlayerController>();}// 當Buff等級發(fā)生變化時觸發(fā)protected override void OnLevelChange(int change){// 根據變化的等級調整角色的生命值playerController.HP += change;}
}

調用

BuffManager.Instance.AddBuff<Buff003>(playerController.gameObject, "自己", 80);

效果
在這里插入圖片描述

4. 負面BUFF,根據當前BUFF等級計算每秒收到傷害值,當兩個不同單位向同一個單位施加同一個buff時BUFF獨立存在

public class Buff004 : BuffBase
{PlayerController playerController;// 每秒受到的傷害值float m_DamagePerSeconds = 30;public override void Initialize(GameObject owner, string provider){base.Initialize(owner, provider);playerController = owner.GetComponent<PlayerController>();MaxDuration = 5f;// Buff的最大持續(xù)時間為5秒TimeScale = 1f;// 時間縮放為1,正常流逝時間MaxLevel = 5;// 最大等級設置為5BuffType = BuffType.Debuff;// Buff類型為減益效果ConflictResolution = ConflictResolution.separate;// Buff沖突時采用分離方式Dispellable = true;// 可以被驅散Name = "流血";Description = "每層每秒受到30點傷害";IconPath = "Icon/Darius_PassiveBuff";Demotion = MaxLevel;// 每次Buff持續(xù)時間結束時降低的等級}// 當Buff等級發(fā)生變化時觸發(fā)protected override void OnLevelChange(int change){//每次升級,重置Buff的當前剩余時間ResidualDuration = MaxDuration;}public override void FixedUpdate(){// 根據當前等級、每秒傷害值和固定時間步長來計算角色受到的傷害playerController.HP -= m_DamagePerSeconds * CurrentLevel * BuffManager.FixedDeltaTime;}
}

調用

if (Input.GetKeyDown(KeyCode.Alpha4))
{BuffManager.Instance.AddBuff<Buff004>(playerController.gameObject, "敵人1", 1);
}
if (Input.GetKeyDown(KeyCode.Alpha5))
{BuffManager.Instance.AddBuff<Buff004>(playerController.gameObject, "敵人2", 1);
}

效果
在這里插入圖片描述

5. 一級疊加兩層,后面都疊加一層

public class Buff005 : BuffBase
{PlayerController playerController;// 每秒受到的傷害值float m_DamagePerSeconds = 10;public override void Initialize(GameObject owner, string provider){base.Initialize(owner, provider);playerController = owner.GetComponent<PlayerController>();MaxDuration = 1f;// Buff的最大持續(xù)時間為1秒TimeScale = 1f;// 時間縮放為1,正常流逝時間MaxLevel = int.MaxValue;// 最大等級設置為int.MaxValue,即無限大BuffType = BuffType.Debuff;// Buff類型為減益效果ConflictResolution = ConflictResolution.combine;// Buff沖突時采用合并方式Dispellable = true;// 可以被驅散Name = "被點燃";Description = "每秒受到10點傷害,首次受到該BUFF傷害,一次疊加2層,后續(xù)疊加1層";IconPath = "Icon/Darius_PassiveBuff";Demotion = 1;// 每次Buff持續(xù)時間結束時降低的等級}public override void FixedUpdate(){// 根據每秒傷害值和固定時間步長來計算角色受到的傷害playerController.HP -= m_DamagePerSeconds * BuffManager.FixedDeltaTime;}
}

調用

if (Input.GetKeyDown(KeyCode.Alpha6))
{int number = 1;//獲取疊加的BUff層數if(BuffManager.Instance.FindBuff<Buff005>(playerController.gameObject).Count == 0  ){number = 2;}BuffManager.Instance.AddBuff<Buff005>(playerController.gameObject, "敵人1", number);
}

效果

在這里插入圖片描述

最終效果

在這里插入圖片描述

參考

【視頻】https://www.bilibili.com/video/BV1Xy4y1N7Cb

源碼

https://gitcode.net/unity1/buffsystem
在這里插入圖片描述

完結

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,以便我第一時間收到反饋,你的每一次支持都是我不斷創(chuàng)作的最大動力。當然如果你發(fā)現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奮斗的開發(fā)者,出于興趣愛好,于是最近才開始自習unity。如果你遇到任何問題,也歡迎你評論私信找我, 雖然有些問題我可能也不一定會,但是我會查閱各方資料,爭取給出最好的建議,希望可以幫助更多想學編程的人,共勉~
在這里插入圖片描述

http://www.risenshineclean.com/news/744.html

相關文章:

  • 做網站哪個語言強/好項目推薦平臺
  • 網絡營銷與傳統營銷有哪些區(qū)別/windows優(yōu)化大師可以卸載嗎
  • 鶴壁做網站優(yōu)化/aso優(yōu)化榜單
  • 如何做企業(yè)網站推廣產品/iis搭建網站
  • 網絡營銷方式和平臺推廣/搜索引擎優(yōu)化的目的是
  • 天津武清做網站tjniu/產品互聯網營銷推廣
  • 海報設計網站官網/百度怎么做廣告
  • 石家莊有哪些做網站的公司/百度保障中心人工電話
  • 門戶網站建設工作會議/國外引流推廣軟件
  • 網站頁面類型/正規(guī)網站優(yōu)化哪個公司好
  • 推廣網站最有效方法/自己有貨源怎么找客戶
  • 重慶網站建設設計/怎么去推廣一個app
  • 網站微營銷公司哪家好/鄭州疫情最新動態(tài)
  • 品牌logo設計說明/百度seo優(yōu)化公司
  • 有什么做任務得傭金的網站/站長之家app
  • 做淘寶有哪些推廣網站/seo外鏈友情鏈接
  • 開發(fā)公司取名字大全免費查詢/貴陽網站優(yōu)化公司
  • 代碼判斷網站/上海百度競價托管
  • 運動網站建設教程/上海網站排名優(yōu)化公司
  • 濟南做網站xywlcn/百度用戶服務中心官網
  • 南海區(qū)住房和城鄉(xiāng)建設部網站/提高網站排名軟件
  • 河南那家公司做家具行業(yè)網站好/電商培訓有用嗎
  • 中山品牌網站建設推廣/軟件培訓機構有哪些?哪個比較好
  • 東莞工信部網站/公司排名seo
  • java做網站pdf/網絡營銷成功案例ppt
  • 學生怎樣做網站/模板建站哪里有
  • 免費網站制作公司/長春網站關鍵詞推廣
  • 網站產品頁面/注冊安全工程師
  • 鄭州做網站 碼通/長沙做網站的公司有哪些
  • 紀檢監(jiān)察信訪舉報網站建設/如何創(chuàng)建一個網頁