easytouch传递消息到脚本中的方法:
如果使用js写代码,需要勾选Broadcast messages选项,other receiver选择接收消息的gameobject。因为在js里没法像c#那么方便的使用delegate,所以必须使用unity的内部消息机制来向绑定js脚本的gameobject发消息。
如果是c#代码,就不要勾选Broadcast messages选项,否则当disable c#脚本时,easytouch依然能向脚本发消息(因为指定了other receiver,只要选择了 Broadcast messages方式就会使用unity内部消息机制了)。
官方的解释:
EasyTouch is set by default to send messages by C # events. In javascript it 's impossible or very
difficult to use C# Delegates, we must use the internal broadcast messages of Unity.
具体表现是,我勾选了Boradcast messages选项,指定了消息接收gameobject。
c#脚本如下
void OnEnable()
{
EasyTouch.On_TouchStart += On_TouchStart;
Debug.Log("OnEnable");
}
// Unsubscribe
void OnDisable()
{
EasyTouch.On_TouchStart -= On_TouchStart;
Debug.Log("OnDisable");
}
// Unsubscribe
void OnDestroy()
{
EasyTouch.On_TouchStart -= On_TouchStart;
Debug.Log("OnDestroy");
}
// Touch start event
public void On_TouchStart(Gesture gesture)
{
Debug.Log( "Touch in " + gesture.position);
}
看下EasyTouch.cs里CreateGesture()方法里的这两句:
if (useBroadcastMessage){
SendGesture(message,gesture);
}
if (!useBroadcastMessage || isExtension){
RaiseEvent(message, gesture);
}
如果选择Broadcast messages选项了,则走第一个分支(unity的sendmessage机制),否则走的是event机制(c#的delegate机制)。
这块如果不看文档还真是容易用岔了,也是因为easy touch支持js c#两种模式导致的。
明显感觉还是c#的机制好,首先Broadcast messages只能指定一个receiver,如果消息要发到多个对象里去还要做其他处理。其次event模式更加灵活些,不需要在editor里指定目标,回调在代码里指定,易于绑定/解绑。