3 D物体を使ったGUIインタフェース
7491 ワード
通常、Unityが持っているOnGUIは使いにくく、コードで完成し、シーンで直接編集することはできません.だから、一般的なプロジェクトはNGUIプラグインを使ってインタフェースを作りますが、今回はNGUIもOnGUIも使わず、NGUIのような原理を使ってPlaneという3 D物体を使ってインタフェースを作ります.
ボタンが必要な場合はPlaneを作成し、対応する画像でマテリアルを作成して貼り付けると簡単です.これで1枚の画像が表示されるだけで、クリック効果を実現するには、Update関数でユーザー入力をキャプチャします.ここで入力を検出するときは、ScreenToWorldPoint関数を使用して入力を変換し、Raycast線検出法を使用して衝突した物体にButtonDownメッセージを送信します.これに対応して、他の必要なメッセージも送信されます.
次はボタンに掛けられたコードです
このようにすれば、基本的には通常のボタンや画像表示などが実現できるが、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」を使ったほうがいいです.
ボタンが必要な場合は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」を使ったほうがいいです.