首页 > 代码库 > Unity中任务系统书写

Unity中任务系统书写

  任务系统一直是游戏中非常重要的系统,它一直伴随在游戏左右,玩家通过完任务去赚取装备,去升级,所以说任务系统是非常重要的,值得我们好好去架构。在手机中的任务系统没有PC端那么复杂,在Unity中由于有委托以及事件等语法功能,实现起来相对简单。接下来我们就开始实现任务系统。

    第一步:我们需要定义任务类,我们的设计思路是一个任务对象就是一个协程coroutine,任务能够开始,停止,暂停,如果试图开始一个被停止或者是被终止的任务它是错误的。

以下是代码构建:

public class Task
{

	public bool Running {
		get {
			return task.Running;
		}
	}
	

	public bool Paused {
		get {
			return task.Paused;
		}
	}
	
	public delegate void FinishedHandler(bool manual);
	
	public event FinishedHandler Finished;


	public Task(IEnumerator c, bool autoStart = true)
	{
		task = TaskManager.CreateTask(c);
		task.Finished += TaskFinished;
		if(autoStart)
			Start();
	}
	

	public void Start()
	{
		task.Start();
	}

	public void Stop()
	{
		task.Stop();
	}
	
	public void Pause()
	{
		task.Pause();
	}
	
	public void Unpause()
	{
		task.Unpause();
	}
	
	void TaskFinished(bool manual)
	{
		FinishedHandler handler = Finished;
		if(handler != null)
			handler(manual);
	}
	
	TaskManager.TaskState task;
}

第二步:我们需要一个管理类来创建任务。
class TaskManager : MonoBehaviour
{
	public class TaskState
	{
		public bool Running {
			get {
				return running;
			}
		}

		public bool Paused  {
			get {
				return paused;
			}
		}

		public delegate void FinishedHandler(bool manual);
		public event FinishedHandler Finished;

		IEnumerator coroutine;
		bool running;
		bool paused;
		bool stopped;
		
		public TaskState(IEnumerator c)
		{
			coroutine = c;
		}
		
		public void Pause()
		{
			paused = true;
		}
		
		public void Unpause()
		{
			paused = false;
		}
		
		public void Start()
		{
			running = true;
			singleton.StartCoroutine(CallWrapper());
		}
		
		public void Stop()
		{
			stopped = true;
			running = false;
		}
		
		IEnumerator CallWrapper()
		{
			yield return null;
			IEnumerator e = coroutine;
			while(running) {
				if(paused)
					yield return null;
				else {
					if(e != null && e.MoveNext()) {
						yield return e.Current;
					}
					else {
						running = false;
					}
				}
			}
			
			FinishedHandler handler = Finished;
			if(handler != null)
				handler(stopped);
		}
	}

	static TaskManager singleton;

	public static TaskState CreateTask(IEnumerator coroutine)
	{
		if(singleton == null) {
			GameObject go = new GameObject("TaskManager");
			singleton = go.AddComponent<TaskManager>();
		}
		return new TaskState(coroutine);
	}
}

我们通过调用函数CeateTask来不断的创建新任务。

手游端的任务系统其实只要通过委托就可以把任务系统实现出来,当然,我们的数据加载其它的需要CreateTask中的协程来实现了。

本文出自 “海游移动” 博客,请务必保留此出处http://jxwgame.blog.51cto.com/943299/1602630

Unity中任务系统书写