Unity 中有没有一种方法可以在不使用 UI 层的情况下创建一个简单的 2D 按钮。我有一个有很多按钮的游戏,我不想在 UI 中制作整个应用程序。也欢迎使用更多控件:开关、滑块等。
PS。我看到了 NGUI,到目前为止我不喜欢它。还要别的吗?
Unity 中有没有一种方法可以在不使用 UI 层的情况下创建一个简单的 2D 按钮。我有一个有很多按钮的游戏,我不想在 UI 中制作整个应用程序。也欢迎使用更多控件:开关、滑块等。
PS。我看到了 NGUI,到目前为止我不喜欢它。还要别的吗?
Unity 中有没有一种方法可以在不使用 UI 层的情况下创建一个简单的 2D 按钮
您可以使用Sprite
/Sprite Render
作为.First 创建一个GameObjectButton
并附加到它。附加到相机,实现和覆盖功能。通过转到GameObject -> 2D Object -> Sprite创建一个 2D Sprite,然后将您的脚本附加到 Sprite。这是一个完整的代码:EventSystem
StandaloneInputModule
Physics2DRaycaster
IPointerClickHandler
OnPointerClick
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,那么您必须将 2D 碰撞器添加到 sprite。
另一种更简单的方法是添加一个 BoxCollider2D 组件,然后将以下方法添加到一个新组件中,比如 UIButton,您将在其中执行按钮操作:
这避免了使用 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()
{
}
}
在统一 2018.1 中测试。我最初注意到这一点和上述方法的一个区别是,在此模型中未检测到鼠标右键单击,但在 EventSystemModel 中检测到。