我应该使用什么来代替 OnMouseXXX 事件处理程序?

Gui*_*Poy 2 c# performance android input unity-game-engine

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

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

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

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

Pro*_*mer 5

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

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

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

OnMouseDragOnMouseDown功能是专门为桌面上所作的。是的,它们也适用于移动设备,但应避免使用。

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

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

OnBeginDragOnEndDrag功能将在所有GameObjects包括3D,2D和UI工作。对于 2D,您需要连接Physics2DRaycaster到相机。对于 3D,您必须连接PhysicsRaycaster到相机。

请参阅这篇文章了解如何让它在任何游戏对象上工作。

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");
    }
}
Run Code Online (Sandbox Code Playgroud)