注 - “ISingleFingerHandler”“IPinchHandler”以及Unity类似的概念完整的解决方案是在这里:https://stackoverflow.com/a/40591301/294884仿型Unity的神秘接口电源
Unity3D有这样的接口,任何组件上的MonoBehavior你只做到这一点...
public class LaraCroft:MonoBehaviour,IPointerDownHandler
{
public void OnPointerDown(PointerEventData data)
{
Debug.Log("With no other effort, this function is called
for you, by the Unity engine, every time someone touches
the glass of your iPhone or Android.");
}
你不必须要注册,设置一个委托或其他任何东西。每当有人触摸屏幕时,OnPointerDown(IPointerDownHandler中唯一的项目)会被调用。
令人惊叹!
这里有一个类似的界面,我写...
public interface ISingleFingerDownHandler
{
void OnSingleFingerDown();
}
现在,我希望消费者能够做到这一点...
public class LaraCroft:MonoBehaviour,ISingleFingerDownHandler
{
public void OnSingleFingerDown(PointerEventData data)
{
Debug.Log("this will get called every time
the screen is touched...");
}
只是为了回顾一下,使用统一的界面(那些该功能自动调用不需要进一步的努力 - 消费者确实不是必须注册或其他任何东西。
可悲的是,我能做到,只有这样的:
我写了一个“守护” ..
public class ISingleFingerDaemon:MonoBehaviour
{
private ISingleFingerDownHandler needsUs = null;
// of course that would be a List,
// just one shown for simplicity in this example code
void Awake()
{
needsUs = GetComponent(typeof(ISingleFingerDownHandler))
as ISingleFingerDownHandler;
// of course, this could search the whole scene,
// just the local gameobject shown here for simplicity
}
... when something happens ...
if (needsUs != null) needsUs.OnSingleFingerDown(data);
}
而我得到的守护进程运行的地方。
如果你不是Unity用户 - 它所做的是查找并找到任何ISingleFingerDownHandler
使用者,保留它们的列表,然后根据需要适当调用OnPointerDown
。这工作正常,但
消费者,程序员必须记住“把守护的地方”,让它运行等
还有当你做这样的事情(在明显的抗高雅的仪态当然,统一或其他地方),重效率,安置,等等等等
•这种方法失败,如果一个消费者进来到存在于当守护程序没有为他们寻找一个时间(Unity的魔术接口不遭受这个问题 - 他们有更多的魔力对付那)
(PS,我知道如何写一个自动帮手放置守护进程等等!请不要在静脉回复,谢谢)
事实上,很明显,在统一的混蛋有一些系统会在幕后,这确实所有精美,因为“他们的”接口是完全可以调用所有需要的来电,无论甚至在飞行等
正在创建的项目有什么最佳方案?我坚持需要守护进程吗?也许需要注册?
(它肯定会吸 - 实际上通常不会在典型的统一项目可用 - 只是使它成为一个类继承;该类型的设施是自然的界面。)
因此,要回顾一下,但统一这...
public class LaraCroft:MonoBehaviour,IPointerDownHandler
肯定有对我进行替换,延伸,应该是一个办法......
public class LaraCroft:MonoBehaviour,ISuperiorPointerDownHandler
然后可以使用相同的方式/这股该界面的神奇特质?我可以做得很好,但只有我做了一个跛脚屁股守护进程。
好主,没有人甚至投了这么复杂的问题?! :) – Fattie
只是读这个 - 是的加一个。我想出了自己的roll-my-own消息系统,它需要每个对象中的一个组件侦听来自消息传递器的事件,该消息针对特定接口触发该对象上的Execute方法。这是一堆样板代码,一旦实施,效果很好。 –
确实@ChuckSavage,挺对的。对于读过这一切的人来说,我已经仔细考虑过了,认为最好是“继承”Unity的IPointerDown/etc概念,并且只是简单地拥有自己的守护进程。 (这与我们所有人在Unity代码中一直做的没有什么不同:也就是说,这是一个完全错误的路径,试图使它像Unity的系统一样)。最终结果是**可笑地简单**:http:// stackoverflow.com/a/40591301/294884链接包括一个史诗般的讨论为什么它是要走的路。 (抛开显而易见的“令人难以置信的简单和优雅”。) – Fattie