3 D物体を使ったGUIインタフェース

7491 ワード

通常、Unityが持っているOnGUIは使いにくく、コードで完成し、シーンで直接編集することはできません.だから、一般的なプロジェクトはNGUIプラグインを使ってインタフェースを作りますが、今回はNGUIもOnGUIも使わず、NGUIのような原理を使ってPlaneという3 D物体を使ってインタフェースを作ります.
ボタンが必要な場合はPlaneを作成し、対応する画像でマテリアルを作成して貼り付けると簡単です.これで1枚の画像が表示されるだけで、クリック効果を実現するには、Update関数でユーザー入力をキャプチャします.ここで入力を検出するときは、ScreenToWorldPoint関数を使用して入力を変換し、Raycast線検出法を使用して衝突した物体にButtonDownメッセージを送信します.これに対応して、他の必要なメッセージも送信されます.
 1     void Update ()  2  {  3         if(Input.GetMouseButtonDown(0))  4  {  5  RaycastHit hit;  6             Vector2 t_pos = Input.mousePosition;  7             t_pos = camera2d.ScreenToWorldPoint(t_pos);  8             if(Physics.Raycast(t_pos, Vector3.forward, out hit) && hit.collider.tag == "Button")  9  { 10  PlaySoundOneShot(ds_pressbutton); 11                 holding_button = hit.collider.gameObject; 12                 holding_button.SendMessage("ButtonDown"); 13  } 14  } 15         else if (Input.GetMouseButtonUp(0)) 16  { 17  RaycastHit hit; 18             Vector2 t_pos = Input.mousePosition; 19             t_pos = camera2d.ScreenToWorldPoint(t_pos); 20             if (Physics.Raycast(t_pos, Vector3.forward, out hit)) 21  { 22                 if (hit.collider.gameObject == holding_button) 23  { 24                     holding_button.SendMessage("ButtonUp"); 25  } 26  } 27 

28             if (holding_button) 29  { 30                 holding_button.SendMessage("ButtonReset"); 31                 holding_button = null; 32  } 33  } 34     }

次はボタンに掛けられたコードです
    public Texture2D tex_pressed_button; public Texture2D tex_released_button; private float delay_time; // Use this for initialization

    void Start () { delay_time = 0; } // Update is called once per frame

    void Update () { if (delay_time > 0) { delay_time -= Time.deltaTime; if (delay_time <= 0) { ButtonActive(); } } } public void ButtonDown() { renderer.material.mainTexture = tex_pressed_button; } public void ButtonUp () { delay_time = 0.2f; } public void ButtonReset() { renderer.material.mainTexture = tex_released_button; } public void ButtonActive() { }

このようにすれば、基本的には通常のボタンや画像表示などが実現できるが、NGUIは使いにくい.プログラム文字が必要な場合は、GUI TextとGUI Textureを使用しないでください.いずれもOnGUIで実現されるので、常に最上位に配置されます.どちらかを隠すために2つのCameraを使用しても、カバーマスク効果は実現されません.しかし、3 D Textを使って、scaleを小さくして、font sizeを大きくして文字をはっきりさせることができます.どうやって血条を実現したの?1つの実行可能な方法は、Planeを使用するか、スクリプトを追加し、数値の変化に応じてplane幅を調整し、planeを適切な位置に移動するかです.しかし、この方法は面倒で、血筋については3 D Textを使って実現することができ、材質を変えたり、anchorやaligmentを調整したりして、Textに文字を入力すればいいので、ここでは「w」を使ったほうがいいです.