2016-06-19 16 views
1

UIレイヤーを使用せずに単純な2Dボタンを作成する方法はありますか?私はたくさんのボタンがあるゲームを持っているので、UIの中にアプリ全体を作りたくありません。スイッチ、スライダーなど、いくつかのコントロールも大歓迎です。UIを使用しないUnityのボタン?

PS。私はNGUIを見ましたが、私はそれを今のところ好きではありません。他に何か?

+0

2DToolkitはこれを完全に実行します。これはすべての機能を内蔵しています。 (2DTKはいまだに多くの点で信じられないほど便利です。私たちは2Dプロジェクトを一切実行しません。)nguiは解決策ではありません。プログラマが完全に以下のように説明しているように**あなた自身で作成することもできます。私は疑問に思う必要があります - なぜUnityのUIを使用しないのですか?問題は何ですか? – Fattie

+0

私も同じことを思い出します。あなたは完全なUnityのuGUIを持っていますが、彼はNGUIを使ったり、すべてのコントロールを一から作り直したりすることを話しています... – Programmer

+0

私は間違っているかもしれませんが、2DのUnity UIボタンを使用すると、私はオブジェクトの階層に入れられません。スプライトとはスケールが違うので、特定のソートレイヤなどに貼り付けることができません。少し失われてしまいました。 –

答えて

2

Button 1次回は、ゲームオブジェクトを作成し、へEventSystemStandaloneInputModuleを添付してあなたがSprite/Sprite Renderを使用することができます UI層

を使用することなく、簡単な2Dのボタンを作成するためのユニティで方法はありますそれ。カメラにPhysics2DRaycasterを添付し、IPointerClickHandlerを実装し、OnPointerClick機能をオーバーライドします。 GameObject - >2Dオブジェクト - >スプライトにスプライトを添付して2Dスプライトを作成します。ここではそれを行うための完全なコードは次のとおりです。

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:これは、3Dゲームオブジェクト/メッシュである場合

、その後、あなたはそれに簡単なコライダーを追加する必要があります。それがSpriteの場合は、2Dコライダーをスプライトに追加する必要があります。

+0

偉大な答え、ありがとうございます!スプライトにコライダーを追加する必要があるよりも、言及するのを忘れてしまっただけです。 –

+1

Raycastは、衝突者のないgameobjectsを検出しません。私はあなたがすでにそれを知っていると思った。 – Programmer

+0

私のような初心者のためにすべてが新しいです。私はRaycastが何であるか知りません:)私にとっては今のところただの魔法です。私は他の初心者のためにそれを答えに加える方が良いと信じています。 –

関連する問題