Unity引擎自定义协程(2017-04-25 20:20)

这几天折腾一个和米仔一起玩的桌游,是丢骰子走路的游戏。

虽然是用Unity开发,但是里面遇到一些问题处理不是很方便。

例如丢骰子,行走到一个格子上触发事件,播放动画后执行逻辑。这些东西并不复杂,但是逻辑都是异步的,用delegate回调写起来总觉得绕圈,容易出错。

游戏画面

一直在想有没有办法用协程来实现这个功能,我希望的主逻辑函数能这么写:

void Function()

{

   丢骰子

   走几步

   如果有出发事件,处理事件

   播放相机切换动画,换下一个角色

}

正常的阻塞式函数是没法这么写的,因为会被动画等操作卡住。但是用协程处理起来就方便多了。

Unity只支持它特定的几个函数,没法写做到丢完骰子后走几步,因为丢骰子是有物理动画的。

几年前问过Unity中国的程序,如何定制协程函数,给的答案是要改源代码。

在网上搜了搜,没想到Unity从5.3版本加入了一个新的类CustomYieldInstruction,从它派生就好了。

在Unity的文档中还专门举了个例子:

public class WaitUntil : CustomYieldInstruction

{

  Func<bool> action_ = null;

  public WaitUntil(Func<bool> action)

  {

    action_ = action;

  }

  public override bool keepWaiting

  {

    get

    {

      return action_();

    }

  }

}

这是个通用的等待函数,那么我的代码就可以这么写了

IEnumerator Function()

{

 dice.Throw();

 yield return new WaitUntil(()=> dice.animation == false);

 dino.Walk();

 yield return new WaitUntil(()=>dino.stop == true);

 if (current_pos.HasEvent())

  DoEvent();

 camera.SwitchPlayer();

 yield return new WaitUntil(()=>camera.stop == true);

}

这逻辑写起来清晰多了。在一个函数中描述完成所有的行为,不用将控制代码分散到各处了,连状态控制都省了。

最后派生IEnumerator这个接口也可以。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 12,985评论 3 90
  • 可能昨天的雨是为了庆祝今天的半晴半雨吧 可能晚上的噩梦是要缅怀没抓住的稻草吧 可能梦境好过现实又比现实壮烈吧 可能...
    蓝色记忆的深处阅读 219评论 0 0
  • ——期待着,信息时代的来临,究竟会给我们的世界带来多大程度的变化。 现在为止,这部电视剧我看到了第四集(也就是郑...
    渔之舟阅读 85评论 0 0
  • 在一次做题中,遇到的改错题,编译是成功的,但是运行会失败。 实现hallo,world变成hello, world...
    fenghaha阅读 3,563评论 0 0
  • 2017年10月13日星期五 今天做早饭的时候,开煤气的时候,两次沒打着火。儿孑在一旁看到了,说:妈,以后开煤气前...
    孙建胜_fa1a阅读 261评论 1 0