Unity 中的按钮,不使用 UI?

Buttons in Unity, without using UI?

在 Unity 中有没有一种方法可以在不使用 UI 层的情况下创建一个简单的 2D 按钮。我有一个有很多按钮的游戏,我不想在 UI 中制作整个应用程序。也欢迎使用更多控件:开关、滑块等。

PS。我看到了 NGUI,到目前为止我不喜欢它。还有什么吗?

Is there a way in Unity to create a simple 2D button without using the UI layer

您可以使用 Sprite/Sprite Render 作为 Button。首先创建一个游戏对象并将 EventSystemStandaloneInputModule 附加到它。将 Physics2DRaycaster 附加到相机,实现 IPointerClickHandler 并覆盖 OnPointerClick 函数。通过转到 GameObject->2D Object->Sprite 创建一个 2D Sprite,然后将脚本附加到雪碧。这是执行此操作的完整代码:

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;

public class SPRITEBUTTON: MonoBehaviour, IPointerClickHandler,
                                  IPointerDownHandler, IPointerEnterHandler,
                                  IPointerUpHandler, IPointerExitHandler
{

    void Start()
    {
        //Attach Physics2DRaycaster to the Camera
        Camera.main.gameObject.AddComponent<Physics2DRaycaster>();

        addEventSystem();
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Mouse Clicked!");
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Mouse Down!");
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("Mouse Enter!");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("Mouse Up!");
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("Mouse Exit!");
    }

    //Add Event System to the Camera
    void addEventSystem()
    {
        GameObject eventSystem = null;
        GameObject tempObj = GameObject.Find("EventSystem");
        if (tempObj == null)
        {
            eventSystem = new GameObject("EventSystem");
            eventSystem.AddComponent<EventSystem>();
            eventSystem.AddComponent<StandaloneInputModule>();
        }
        else
        {
            if ((tempObj.GetComponent<EventSystem>()) == null)
            {
                tempObj.AddComponent<EventSystem>();
            }

            if ((tempObj.GetComponent<StandaloneInputModule>()) == null)
            {
                tempObj.AddComponent<StandaloneInputModule>();
            }
        }
    }

}

编辑:

如果这是 3D GameObject/Mesh,那么您需要为其添加一个简单的碰撞器。如果它只是 Sprite 那么你必须给 sprite 添加一个 2D collider。

另一种更简单的方法是只添加一个 BoxCollider2D 组件,然后将以下方法添加到一个新组件,例如 UIButton,您将在其中执行按钮操作:

  1. void OnMouseOver()
  2. void OnMouseDown()
  3. void OnMouseUp()

这避免了使用 EventSystem、StandaloneInputModule 和 Physics2DRaycaster。

示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class UIButton : MonoBehaviour {

    public Sprite regular;
    public Sprite mouseOver;
    public Sprite mouseClicked;
    public TextMeshPro buttonText;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    private void OnMouseDown()
    {

    }

    private void OnMouseEnter()
    {

    }

    private void OnMouseExit()
    {

    }

    private void OnMouseUpAsButton()
    {

    }
}

在 unity 2018.1 中测试。我最初注意到此方法与上述方法的一个区别是在此模型中未检测到鼠标右键单击,但在 EventSystemModel 中检测到。