一個簡易的觸發器實現(二)
阿新 • • 發佈:2019-02-02
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;
}
}
上面的程式碼還不能直接使用,因為引用了其他不能傳的類
還是老規矩,有空(懶癌晚期的我好難)去掉那些無關緊要的其他類
然後更新一版純淨版的程式碼
開源是一種精神