类似游戏中的任务系统

游戏中的任务系统
一条任务线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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值