一个简易的触发器实现(二)

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

上面的代码还不能直接使用,因为引用了其他不能传的类
还是老规矩,有空(懒癌晚期的我好难)去掉那些无关紧要的其他类
然后更新一版纯净版的代码

开源是一种精神

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值