Search code examples
c#unity-game-engineunity3d-ui

Buttons in Unity, without using UI?


Is there a way in Unity to create a simple 2D button without using the UI layer. I have a game with a lot of buttons and I don't want to make the whole app in the UI. Some more controls are welcome too: switches, sliders etc.

PS. I saw NGUI and I don't like it so far. Anything else?


Solution

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

    You can use Sprite/Sprite Render as a Button.First Create a GameObject and attach EventSystem and StandaloneInputModule to it. Attach Physics2DRaycaster to the Camera, implement IPointerClickHandler and override OnPointerClick function. Create a 2D Sprite by going to GameObject->2D Object->Sprite then attach your script to the Sprite. Here is a complete code to do that:

    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>();
                }
            }
        }
    
    }
    

    EDIT:

    If this is a 3D GameObject/Mesh, then you need to add a simple collider to it. If it is just Sprite then you must add a 2D collider to the sprite.