1.任务管理类与任务类是一对一的关系,而任务管理类与其他类是一对多的关系。对于一对多,比较容易想到的就是观察者模式了。在观察者模式中,是观察者决定要监视的东西,而不是事件的发生者决定谁观察它。

2.对于任务类/任务条件类/任务奖励类来说,有逻辑意义上的,也有界面意义上的,因此要分开处理。

这里给出主要的逻辑代码:

using System.Collections;
using System.Collections.Generic;
using System.Xml.Linq;
using System;public class Task {public TaskItem taskItem;//对应的UI面板public string taskID;//任务IDpublic string taskName;//任务名字public string caption;//任务描述   public List<TaskCondition> taskConditions = new List<TaskCondition>();public List<TaskReward> taskRewards = new List<TaskReward>();//根据taskNum读取xml,实现初始化public Task(string taskID){this.taskID = taskID;XElement xe = TaskManager.Instance.rootElement.Element(taskID);taskName = xe.Element("taskName").Value;caption = xe.Element("caption").Value;IEnumerable<XElement> a = xe.Elements("conditionID");IEnumerator<XElement> b = xe.Elements("conditionTargetAmount").GetEnumerator();IEnumerable<XElement> c = xe.Elements("rewardID");IEnumerator<XElement> d = xe.Elements("rewardAmount").GetEnumerator();foreach (var s in a){b.MoveNext();TaskCondition tc = new TaskCondition(s.Value, 0, int.Parse(b.Current.Value));taskConditions.Add(tc);}foreach (var s in c){d.MoveNext();TaskReward tr = new TaskReward(s.Value, int.Parse(d.Current.Value));taskRewards.Add(tr);}}//判断条件是否满足public void Check(TaskEventArgs e){TaskCondition tc;for (int i = 0; i < taskConditions.Count; i++){tc = taskConditions[i];if (tc.id == e.id){tc.nowAmount += e.amount;if(tc.nowAmount < 0) tc.nowAmount = 0;if (tc.nowAmount >= tc.targetAmount)tc.isFinish = true;elsetc.isFinish = false;taskItem.Modify(e.id,tc.nowAmount);}}for (int i = 0; i < taskConditions.Count; i++){if (!taskConditions[i].isFinish){taskItem.Finish(false);return;}}taskItem.Finish(true);e.taskID = taskID;TaskManager.Instance.FinishTask(e);}//获取奖励public void Reward(){TaskEventArgs e = new TaskEventArgs();e.taskID = taskID;TaskManager.Instance.GetReward(e);}//取消任务public void Cancel(){TaskEventArgs e = new TaskEventArgs();e.taskID = taskID;TaskManager.Instance.CancelTask(e);}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Linq;
using System;public class TaskManager : MonoSingletion<TaskManager> {public Dictionary<string, Task> dictionary = new Dictionary<string,Task>();//id,taskpublic XElement rootElement;public event EventHandler<TaskEventArgs> getEvent;//接受任务时,更新任务到任务面板等操作public event EventHandler<TaskEventArgs> finishEvent;//完成任务时,提示完成任务等操作public event EventHandler<TaskEventArgs> rewardEvent;//得到奖励时,显示获取的物品等操作public event EventHandler<TaskEventArgs> cancelEvent;//取消任务时,显示提示信息等操作void Start(){MesManager.Instance.checkEvent += CheckTask;rootElement = XElement.Load(Application.dataPath + "/TestTask/Task.xml");//得到根元素}public void GetTask(string taskID){if (!dictionary.ContainsKey(taskID)){Task t = new Task(taskID);dictionary.Add(taskID, t);TaskEventArgs e = new TaskEventArgs();e.taskID = taskID;getEvent(this, e);}}public void CheckTask(System.Object sender, TaskEventArgs e){foreach (KeyValuePair<string, Task> kv in dictionary){kv.Value.Check(e);}}public void FinishTask(TaskEventArgs e){finishEvent(this, e);}public void GetReward(TaskEventArgs e){if (dictionary.ContainsKey(e.taskID)){Task t = dictionary[e.taskID];for (int i = 0; i < t.taskRewards.Count; i++){TaskEventArgs a = new TaskEventArgs();a.id = t.taskRewards[i].id;a.amount = t.taskRewards[i].amount;a.taskID = e.taskID;rewardEvent(this,a);}}dictionary.Remove(e.taskID);}public void CancelTask(TaskEventArgs e){if (dictionary.ContainsKey(e.taskID)){cancelEvent(this,e);dictionary.Remove(e.taskID);}}
}

思路(这里以怪物被消灭后为例):

1.怪物消灭后,发送信息到消息中心,消息中心再将消息分发给监听它的东西,例如得分增加,经验上升等等,其中包括发送给我们的TaskManager(如果没有消息中心,那么如果想增加一个观察者观察怪物消灭的信息,就要改动怪物的代码,相反,如果使用消息中心,那么只需要在新增的观察者中注册事件就可以了)

2.TaskManager将信息传递到正在执行的任务Task,Task根据条件判断是否完成任务,如果完成了,则通知TaskManager(两者是一对一的关系)

3.TaskManager将任务完成的消息分发出去

测试:

1.对于收集物品的任务,当收集完成后,再丢弃部分物品。结果:任务不显示完成,领取不了奖励

2.多个任务同时进行。结果:可以领取完成了任务的奖励

3.接受任务后再打开任务面板。结果:显示正常

4.任务中存在相同条件的。结果:正常

不足:

1.对于收集物品的任务,没有对物品起始数量进行初始化

2..等等

总结:

这里可以看到事件委托的强大了吧!

这是unitypackage:

http://yun.baidu.com/s/1gdH7sWF

Ps:导入unity后会发现报错,这时只需添加一个MonoSingletion类即可:http://blog.csdn.net/lyh916/article/details/45898343

[Unity实战]一个简单的任务系统(一)相关推荐

  1. [Unity实战]一个简单的unity手写摇杆[入门级][手写demo][开箱可用]

    一个简单的unity手写摇杆 1.摇杆是什么 2.常见的unity摇杆插件 3.如何做一个简单摇杆(代码) 4.效果展示 5.github 1.摇杆是什么 固定移动摇杆的意思指固定一个摇杆的贴图,操作 ...

  2. swift for循环_Swift | 实战一个简单的素数计算器demo

    Swift 实战一个简单的素数计算器demo 本期我们来介绍如何用storyboard来实现一个素数计算器demo,storyboard可以明确地知道界面上的组件与代码的关系,而且比起仅用代码写要方便 ...

  3. unity编写一个简单的小游戏

    unity编写一个简单的小游戏 简易fly bird的制作 关于flybird 场景的搭建和素材的导入 使用素材搭建game和scene 制作柱体 bird的script column的sprite ...

  4. [Unity实战]一个好用的lua/xlua/tolua/slua调试工具 LuaPerfect 好用到飞起..[Debug][开箱可用]

    [Unity实战]一个好用的lua/xlua/tolua/slua调试工具 LuaPerfect 好用到飞起..[Debug][开箱可用] 什么是LuaPerfect 1.官网地址: 2.如何使用 3 ...

  5. 基于unity创建一个简单的VR demo

    创建一个VR项目 我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体. Step 1 打开Unity,创建一个新的空项目. Step 2 在Unity的菜单中选择F ...

  6. Unity 3D 一个简单的角色控制脚本

    之所以写这个脚本,是因为我想起了我还是新手的时候,那时为了一个角色控制脚本百度了半天还是一无所获,因为看不懂啊,都写的太高级了 希望这个脚本能够帮助那些 像曾经的我一样迷失于代码中的新手们能够清晰的理 ...

  7. 使用Unity制作一个简单的聊天室

    使用控制台作为一个服务器,在Unity中开发客户端,制作一个简易的聊天室,无论哪个客户端发送消息,其他的客户端都会实时的显示出来. 服务器代码 using System; using System.C ...

  8. Android项目实战——一个简单的记事本程序

    因为自己刚看完第一行代码,就想做一个小小的项目来巩固一下自己的知识,顺便检验一下自己的学习成果. 运行界面如图: 相信大家都已经看出来了,这个app分为两个activity,MainActivity中 ...

  9. 如何在 Unity 中使用 Probuilder 设计一个简单的关卡

    通常,当您开始在 Unity 中开发游戏时,您需要一个精简版的环境,您可以在其中移动角色. ProBuilder 允许您快速创建 3D 关卡和原型,以及创建基本的 3D 模型,而无需离开 Unity. ...

最新文章

  1. python中的 怎么用_Python中如何调用Linux命令
  2. 婚姻是唯一没有领导者的联盟
  3. 方舟原始恐惧代码_源代码分支管理模式丨中国DevOps社区
  4. GetOpenFileName的简单使用实例
  5. Android开发之设置DialogFragment的窗体背景色的方法亲测可用
  6. WinXP中鲜为人知的28项隐藏功能
  7. java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法
  8. 深度优先算法解决有向有权图的最短路径问题
  9. jpa原生query_Spring Data Jpa @Query原生SQL
  10. linux配置erp访问端口_nginx配置相同端口号访问多个项目
  11. MySQL中的insert ignore into, replace into等的一些用法总结
  12. 游戏测试(面试可用)
  13. 服务器中的软件如何备份文件夹在哪里找,itunes备份文件在哪,如何找到itunes的备份文件...
  14. U盘全新安装High sierra及打造mac,win10双系统
  15. quickbuild php,通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控
  16. 虚拟机中无ens33文件的解决办法
  17. 网络基础(六)-- 路由器的转发原理,路由表,静态路由及其配置
  18. Android 安卓ADB命令远程调试 单个或多个设备调试
  19. android文字转语音文件格式,Android文字转语音
  20. CPU 负载与 CPU 使用率可不是一回事

热门文章

  1. 振动论坛---MATLAB
  2. 沉浸式三维虚拟展厅交互体验科技感十足
  3. 操作系统原理及应用复习(第2版)大部分课后习题
  4. chrome.webRequest
  5. Neo4j 使用场景
  6. 《原神》鸣声水位岛屿解密方法介绍
  7. python threading中的join和setDaemon方法
  8. Python单元测试框架《python 自动化框架 pytest》
  9. 电子计算机模拟器,TI-89计算器模拟器(TI-89 Emulator)
  10. iPhone游戏中既播放背景音乐又播放特效声音的办