最近一个开发的一个内容是使用Unity发布WebGL的方式。
有个要求是不要在Unity里面直接把UI做上去,而是使用页面上的按钮。我当时一想,这个简单,因为这种操作玩过太多次了,直接发消息就可以了,就像这样:
myGameInstance.SendMessage('InternalObj', 'SwitchStyle');
但是发现和在Unity里面直接点击按钮的效果有区别,本来通过原来的按钮点击之后,画面是有个渐变过程的切换效果,但是从页面上发消息的方式画面直接切换了,没了渐变过程,我就纳闷了,不管是按钮直接调用方法,还是发消息的方式,调用的是同一个方法,怎么就效果不一样了,于是我在网上查看了消息机制调用和直接调用的区别,说实在的,没找到说的太清楚的内容,大概好像是说“SendMessage会等消息处理完才返回”,不是很理解这个意思,不过由于我在被调用的方法里面使用了协程,类似下面这种:
public void Switch()
{
StartCoroutine(SetTransition());
StartCoroutine(DelaySwitch());
}
我想,是不是这个发送消息不适合协程机制呢?
那就换个思路吧,发消息不直接调用方法,而是把方法放到队列里,然后在Update里检查执行,或者直接添加到事件里,执行完事件后,把事件清空。于是有了下面的写法。
UnityAction msgAct = null;
void Update()
{
if (msgAct != null)
{
msgAct.Invoke();
msgAct = null;
}
}
void SwitchStyle()
{
msgAct += switchStyle.Switch;
}
"void SwitchStyle()"这个方法是页面上的消息调用的,直接执行"switchStyle.Switch();"代码的话效果有问题,把"switchStyle.Switch"添加到事件里面,在Update里面执行的效果是对的。
问题似乎是解决了,但是为什么呢?我也没想太清楚,期盼有路过的大神解惑。