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

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;
    }
}

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

開源是一種精神

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章