【问题标题】:What shall I use instead of OnMouseXXX event handlers?我应该使用什么来代替 OnMouseXXX 事件处理程序?
【发布时间】:2017-11-18 21:27:52
【问题描述】:

我构建了一个小应用程序,在其中一些对象中使​​用了 OnMouseDrag 和 OnMouseDown。我认为这将是最好的选择,因为这种方法不在 Update 方法中。然而,在编译应用程序时,Unity 说“游戏脚本或其他自定义代码包含 OnMouseXXX 事件处理程序。此类处理程序的存在可能会影响手持设备的性能。”

那么...我应该使用什么来代替 OnMouseDrag 和 OnMouseDown?

我已经看到我可以使用 Input.GetMouseButtonDown。但要做到这一点,我必须为每个具有 OnMouseDown 的对象添加一个 Update 方法。这不是比拥有 OnMouseDrag 更糟糕吗?

而且,为什么 OnMouseXXX 事件不利于手持设备的性能?

【问题讨论】:

    标签: c# android performance unity3d input


    【解决方案1】:

    而且,为什么 OnMouse 事件对手持设备的性能不利 设备?

    它们对性能来说还不错。我没有遇到过任何糟糕的性能,但您收到该错误的原因是因为 Unity 可能在移动设备上做更多的工作以使其正常工作。它不是为此而设计的,但您不应该注意到仅使用它们会影响任何性能。

    那么...我应该使用什么来代替 OnMouseDrag 和 OnMouseDown?

    OnMouseDragOnMouseDown 函数专为台式机设计。是的,它们也可以在移动设备上使用,但应该避免使用。

    应该避免使用它们,因为它们不适用于所有对象。例如,它们不适用于新的 UGUI 系统。

    您应该使用OnBeginDragOnEndDrag,这两者都需要您实现IBeginDragHandlerIEndDragHandler

    OnBeginDragOnEndDrag 函数适用于所有游戏对象,包括 3D、2D 和 UI。对于 2D,您需要将 Physics2DRaycaster 附加到相机。对于 3D,您必须将 PhysicsRaycaster 附加到相机。

    请参阅this 帖子了解如何让它在任何游戏对象上运行。

    using UnityEngine.EventSystems;
    
    public class Dragger: MonoBehaviour,
        IBeginDragHandler, IEndDragHandler
    {
        public void OnBeginDrag(PointerEventData eventData)
        {
            Debug.Log("Drag Begin");
        }
    
        public void OnDrag(PointerEventData eventData)
        {
            Debug.Log("Dragging");
        }
    
        public void OnEndDrag(PointerEventData eventData)
        {
            Debug.Log("Drag Ended");
        }
    }
    

    【讨论】:

    • 感谢您在顶部添加“使用”语句
    猜你喜欢
    • 2010-11-05
    • 2010-12-06
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多