1. 程式人生 > >一個簡易的觸發器實現(二)

一個簡易的觸發器實現(二)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

public delegate void TriggerExec(bool trigger);

public class WorldEventTriggerManager:Singleton<WorldEventTriggerManager>
{
    public enum TriggerType//在此擴充套件
    {
        ReachLevel = 1,//玩家達到等級
FinishQuest = 5,//完成任務id的任務 } List<WorldEventTrigger> triggerLst = new List<WorldEventTrigger>(); uint count = 0; public void Update() { for (int i = triggerLst.Count - 1; i >= 0; i--) { if(triggerLst[i].IsValid() == false) { triggerLst.RemoveAt(i); continue
; } if (triggerLst[i].IsTrigger()) { triggerLst[i].Exec(true); triggerLst.RemoveAt(i); } } } public uint GetTrigger(WordEventTriggerPro pro, TriggerExec exec) { if(pro.type == (uint)TriggerType.ReachLevel) { count++; LevelTrigger tri = new
LevelTrigger(pro, exec); triggerLst.Add(tri); tri.TriggerIndex = count; return count; } else if (pro.type == (uint)TriggerType.FinishQuest) { count++; QuestTrigger tri = new QuestTrigger(pro, exec); triggerLst.Add(tri); tri.TriggerIndex = count; return count; } else { Debug.LogErrorFormat("can't support this type trigger,type is:{0}",pro.type); return 0; } } public bool DelTrigger(uint index) { for (int i = 0; i < triggerLst.Count; i++) { if(triggerLst[i].TriggerIndex == index) { triggerLst.RemoveAt(i); return true; } } return false; } public void Triggering() { for (int i = triggerLst.Count - 1; i >= 0; i--) { if (triggerLst[i].IsTrigger()) { triggerLst[i].Exec(false); triggerLst.RemoveAt(i); } } } public string GetTriggerTip(uint index) { for (int i = 0; i < triggerLst.Count; i++) { if(triggerLst[i].TriggerIndex == index) { WorldEventTrigger tri = triggerLst[i]; return tri.GetTriggerTip(); } } return string.Empty; } } public abstract class WorldEventTrigger//抽象類 { public uint TriggerIndex; protected WordEventTriggerPro mPro; protected TriggerExec mExec; public WorldEventTrigger(WordEventTriggerPro pro,TriggerExec exec) { mPro = pro; mExec = exec; } abstract public bool IsTrigger(); abstract public void Exec(bool trigger); abstract public bool IsValid(); abstract public string GetTriggerTip(); } public class LevelTrigger : WorldEventTrigger//實現類 { int curLevel;//舊等級 public LevelTrigger(WordEventTriggerPro pro, TriggerExec exec) : base(pro, exec) { curLevel = UserMgr.mPlayerInfo.level; } public override bool IsTrigger() { if (UserMgr.mPlayerInfo.level >= mPro.value1) { return true; } return false; } public override void Exec(bool trigger) { if (mExec != null) { mExec(trigger); } } public override bool IsValid() { return curLevel < mPro.value1; } public override string GetTriggerTip() { string str = CDbStringMgr<String_Ui>.GetUtf8String(9052); return str; } } public class QuestTrigger : WorldEventTrigger//實現類 { uint questId = 0;//當前任務id public QuestTrigger(WordEventTriggerPro pro, TriggerExec exec) : base(pro, exec) { QuestRecord qr = QuestMgr.Instance.GetMainTask(); if (qr != null && qr.db_quest != null&& qr.db_quest.quest_proto != null) { questId = QuestMgr.Instance.GetCurQuestId();//.level; } else { questId = QuestMgr.Instance.GetCurQuestId(); Debug.LogErrorFormat("no main Task"); } } public override bool IsTrigger() { QuestRecord qr = QuestMgr.Instance.GetMainTask(); if(qr == null || qr.db_quest == null || qr.db_quest.quest_proto == null) { return false; } if (qr.db_quest.quest_proto.id >= mPro.value1) { return true; } return false; } public override void Exec(bool trigger) { if (mExec != null) { mExec(trigger); } } public override bool IsValid() { return questId < mPro.value1; } public override string GetTriggerTip() { string str = CDbStringMgr<String_Ui>.GetUtf8String(9052); return str; } }

上面的程式碼還不能直接使用,因為引用了其他不能傳的類
還是老規矩,有空(懶癌晚期的我好難)去掉那些無關緊要的其他類
然後更新一版純淨版的程式碼

開源是一種精神