博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OnLevelWasLoaded 在脚本中执行顺序
阅读量:4881 次
发布时间:2019-06-11

本文共 2029 字,大约阅读时间需要 6 分钟。

  在做战斗的时候,为了避免相互引用造成代码混乱,需要使用消息系统(Messenger)来broadcast掉血的消息,而listener是在awake中增加的。

  奇怪的事出现了,直接加载运行这个场景的时候很正常,但是一旦从另一个场景 进入的时候,问题就出现了,一大片的 

  “BroadcastException: Broadcasting message "barbarian_03_01LoseHealth" but no listener found. Try marking the message with Messenger.MarkAsPermanent.”

  也就是说消息没有了,找不到了。但我明明在awake中添加了listener,执行到update中broadcast的时候肯定有啊。

  不管,先 MarkAsPermanent 。能用,但是这些永久消息,设为永久以后会造成混乱啊。

  再看messenger 代码:

public void OnLevelWasLoaded(int level)    {        Messenger.Cleanup();            }

  每次load一个新level 的时候,都会清理Messenger,删除不是永久的部分。

  如果是删除了的话,那么OnlevelWasLoaded 就是执行在Awake之后了。

  把add listener放到 start中,运行,可以诶。

   那么猜测 执行顺序   awake -> onlevelwasloaded -> start

  google自杀一记,结果

  http://forum.unity3d.com/threads/onlevelwasloaded-before-or-after-awake-start.57409/

  http://answers.unity3d.com/questions/59873/onlevelwasloaded-called-before-awake.html

  结果全部是说  onlevelwasloaded -> awake -> start 。

  

  于是自己做了个验证: 

  scene1: 

  

using UnityEngine;using System.Collections;public class Loadlevel : MonoBehaviour {    void Awake()    {        DontDestroyOnLoad(this.gameObject);     //!!!        Debug.Log(Application.loadedLevel + " awake");    }    void Start()    {        Debug.Log(Application.loadedLevel + " start");        Application.LoadLevel("Scene2");    }    void Update()    {        Debug.Log(Application.loadedLevel+" update");    }    public void OnLevelWasLoaded(int level)    {        Debug.Log("On level was loaded " + level);    }}

 

  scene2:

  

using UnityEngine;using System.Collections;public class Loadlevel1 : MonoBehaviour {    void Awake()    {        Debug.Log(Application.loadedLevel + " awake");    }    void Start()    {        Debug.Log(Application.loadedLevel + " start");           }    void Update()    {        Debug.Log(Application.loadedLevel+" update");    }    void OnLevelWasLoaded(int level)    {        Debug.Log("OnLevelWasLoaded  "+ level);    }}

  执行结果:

  

  显而易见了。

  后来想想,google到的那些结果不是最新的,可能是以前版本和现在版本的执行顺序不一样所致。

  

 

转载于:https://www.cnblogs.com/binpan/p/4363092.html

你可能感兴趣的文章
python 横向比较最大值 贴标签
查看>>
NYOJ--703
查看>>
SqlServer 获取表主键的方法
查看>>
Redis和Memcache对比及选择
查看>>
Spark:大数据的电花火石!
查看>>
基于STM32的学习型通用红外遥控设备的设计实现(三)
查看>>
【第五天打卡。
查看>>
Maven进价:Maven构建错误汇总
查看>>
Scrapy:Python的爬虫框架【转摘】
查看>>
坚持每天一个小程序(TFTP下载和上传)
查看>>
C# 函数3
查看>>
如何设置水晶报表(crystal reports)的字段自动换行
查看>>
ionic hidden scroll bar
查看>>
Java IO 序列化与反序列化
查看>>
EclEmma安装与使用
查看>>
不能使用联机NuGet 程序包
查看>>
selenium之Javascript定位方式和处理隐藏元素的方法介绍
查看>>
(转)Sql server中 如何用sql语句创建视图
查看>>
WinForms中设置窗体随鼠标移动
查看>>
Eclipse快捷键/快捷操作汇总
查看>>