gpt4 book ai didi

unity3d - 复制 Unity 的神秘界面功能

转载 作者:行者123 更新时间:2023-12-04 23:40:01 24 4
gpt4 key购买 nike

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(IPPointerDownHandler 中的唯一项)。

惊人的!

这是我写的一个类似的界面......
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...");
}

回顾一下,使用 Unity 的界面,该函数会自动调用,无需进一步努力 - 消费者无需注册或其他任何东西。

可悲的是,我只能这样实现:

我写了一个“守护进程”..
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 或其他地方)、重新效率、放置等时,都会有明显的反优雅

  • • 如果消费者在守护进程没有搜索它们的时候出现,这种方法当然会失败(Unity 的魔法接口(interface)不会遇到这个问题 - 他们有更多的魔法来处理这个问题)

    (PS,我知道如何编写一个放置守护进程等的自动助手:请不要这样回复,谢谢!)

    事实上,显然 Unity 的开发人员在幕后运行了一些系统,这一切都做得很好,因为“他们的”接口(interface)能够完美地调用所有需要的调用,即使是动态创建的项目等。

    最好的解决方案是什么?我是否坚持需要一个守护进程?也许必须注册?

    (这肯定会很糟糕——实际上通常不能在典型的 Unity 项目中使用——只是让它成为一个可以继承的类;这种类型的设施自然是一个接口(interface)。)

    回顾一下,Unity 有这个:
    public class LaraCroft:MonoBehaviour,IPointerDownHandler

    当然,我有办法进行替换,扩展,为此...
    public class LaraCroft:MonoBehaviour,ISuperiorPointerDownHandler

    然后可以以相同的方式使用/共享该界面的神奇品质?我可以做得很好,但只是我制作了一个守护进程。

    更新

    Unity 中“ISingleFingerHandler”“IPinchHandler”和类似概念的完整解决方案在这里: https://stackoverflow.com/a/40591301/294884

    最佳答案

    你说你不想做一个守护进程,但这正是 Unity 正在做的事情。 StandaloneInputModule 添加 UI 组件时自动添加的类 是那个守护进程 .

    enter image description here

    您可以做的是创建一个新类,该类派生自 BaseInputModule 派生的类之一。 (likey PointerInputModule 对于您的情况) 可以处理监听触发器并引发您的额外事件,然后将该新类添加到 EventSystem 对象。

    请参阅 Event System 上的 Unity 手册部分有关如何创建自定义事件的说明以及有关输入模块功能的更多详细信息。

    关于unity3d - 复制 Unity 的神秘界面功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40576493/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com