注 - 「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