游戏中的任务系统
一条任务线RhMissionBase是由有序的步骤RhStepBase组成的。
每个步骤下可能只需要做一件事,也可能做几件事,但这几个步骤是并行的。比如一个步骤要杀A怪10只,B怪10只。
using System.Collections.Generic;
using UnityEngine;
using LitJson;
//任务状态
public enum MissionStateEnum
{
Accept,
Success,
Fail,
}
//单条对话类
public class RhDialogUnit
{
public int Id;
//头像图片名
public string HeadName;
//对话内容
public string Dia;
}
//步骤基类
public class RhStepBase
{
public int Id;
//名称
public string Name;
//描述
public string Des;
//关键字
public string Key;
//数量
public int Count;
//完成数量
public int FinishedCount;
public List<RhDialogUnit> Dias;
public List<RhStepBase> branchSteps; //子步骤 无序
public bool IsFinished { get; set; }
public RhStepBase()
{
Dias = new List<RhDialogUnit>();
branchSteps = new List<RhStepBase>();
}
//该步骤在任务中是第几步
public int GetStepCountInMission(RhMissionBase mission)
{
if (mission.ChildSteps == null) return -1;
for (int i = 0; i < mission.ChildSteps.Count; i++)
{
if (Id == mission.ChildSteps[i].Id)
{
return i;
}
}
return -1;
}
public virtual string ToJson()
{
return JsonMapper.ToJson(this);
}
}
//任务基类
public class RhMissionBase
{
public int Id;
public string Name;
public string Des;
//子步骤 有序进行
public List<RhStepBase> ChildSteps;
private bool isFinished;
public RhMissionBase()
{
ChildSteps = new List<RhStepBase>();
}
public int CurrentStepCount { get; set; }
//任务从第0步开始
public bool IsFinished
{
get
{
if (CurrentStepCount == ChildSteps.Count)
{
isFinished = true;
}
else
{
isFinished = false;
}
return isFinished;
}
}
public RhStepBase GetStep(int stepCount)
{
if (stepCount >= ChildSteps.Count)
{
Debug.Log("步骤数超出任务子步骤数量");
return null;
}
return ChildSteps[stepCount];
}
public RhStepBase GetCurrentStep()
{
return ChildSteps[CurrentStepCount];
}
public void CurrentStepComplete()
{
GetCurrentStep().IsFinished = true;
CurrentStepCount++;
}
public string ToJson()
{
return JsonMapper.ToJson(this);
}
}
//任务管理器
public class MissionManagerBase : RhMono {
public static MissionManagerBase _instance;
public TextAsset StepText;
//包含所有子步骤下的分支步骤
public Dictionary<int, RhStepBase> StepDic;
public TextAsset MissionText;
public Dictionary<int, RhMissionBase> MissionDic;
public RhMissionBase CurrentMission;
protected int finishedMissionCount;
public virtual void Awake()
{
_instance = this;
StepDic = new Dictionary<int, RhStepBase>();
MissionDic = new Dictionary<int, RhMissionBase>();
ReadStepText();
ReadMissionText();
}
public virtual void ReadStepText()
{
}
public virtual void ReadMissionText()
{
}
/// <summary>
/// 检查当前任务是否完成
/// </summary>
public virtual void CheckCurrentMissionComplete()
{
if (CurrentMission.IsFinished)
{
CurrentMissionComplete();
}
//未完成 跳下一步
else
{
if (RhMissionPanel._instance != null)
RhMissionPanel._instance.ChangeStep();
}
}
/// <summary>
/// 检查当前步骤是否完成
/// </summary>
public virtual void CheckCurrentStepComplete()
{
if (CurrentMission.GetCurrentStep().IsFinished)
{
CurrentStepComplete();
}
}
/// <summary>
/// 当前步骤完成后
/// </summary>
public virtual void CurrentStepComplete()
{
//ModeManagerBase.GetModeManager().CurrentStepComplete(CurrentMission.GetCurrentStep().Id);
CurrentMission.CurrentStepComplete();
CheckCurrentMissionComplete();
}
/// <summary>
/// 当前任务完成后
/// </summary>
public virtual void CurrentMissionComplete()
{
finishedMissionCount++;
}
/// <summary>
/// 接收新任务
/// </summary>
/// <param name="missionId"></param>
public virtual void ReceiveMission(int missionId)
{
CurrentMission = MissionDic[missionId];
CurrentMission.CurrentStepCount = 0;
}
/// <summary>
/// 所有任务是否完成
/// </summary>
/// <returns></returns>
public virtual bool IsAllMissionComplete()
{
if (CurrentMission.IsFinished && finishedMissionCount == MissionDic.Count)
return true;
return false;
}
}