Unity中任务系统书写

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

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

以下是代码构建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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;
}
 
第二步:我们需要一个管理类来创建任务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值