2016-12-08 10 views
0

カメラの前に(ゲーム中に)テキスト通知を表示して、プレーヤーが動いている間にカメラにたどり着ける簡単な方法はありますか?3Dテキスト通知/トーストを表示する方法

プレイヤーが音声でコマンドを与えることができるゲームを作成しています。コマンドが認識されたら、Androidのトースト通知のようなテキスト通知を表示する必要があります。

私はテキストメッシュについて知っており、それをカメラの前に置いて表示/非表示にすることができますが、プログラムで行う必要があります。

+0

何か試しましたか?少なくともテキストメッシュの文書をチェックしましたか? (私はあなた自身の質問に答えました、それは素晴らしいですが、質問自体は研究面では少し貧弱でした) – Kroltan

+0

@Kroltan私は研究に数時間を費やしました。私は最高のソリューションを与えたかどうかは確かではありませんが、少なくともそれは私が望むように働いていました:) –

答えて

1

飛行機でトーストを生成するクラスを作成することになりました。
コードは、このようなものである(初期バージョン、小さな再因数分解を必要とします):

using UnityEngine; 

public class ToastText3D : MonoBehaviour 
{ 
    public static ToastText3D Instance { get; private set; } 

    private static bool isShowingTextMessage; 
    private static GameObject textMeshGameObject; 

    // Preventing instantiation of class by making constructor protoected (or private) 
    protected ToastText3D() { } 

    private void Awake() 
    { 
     // Check if instance already exists 
     if (Instance == null) 
      // if not, set instance to this 
      Instance = this; 
     else if (Instance != this) 
      // Then destroy this. This enforces our singleton pattern, meaning there can only ever be one instance of a GameManager. 
      Destroy(gameObject); 

     // Sets this to not be destroyed when reloading scene 
     DontDestroyOnLoad(gameObject); 
    } 

    private void Update() 
    { 
     if (!isShowingTextMessage) 
      return; 

     var headPosition = Camera.main.transform.position; 
     var gazeDirection = Camera.main.transform.forward; 

     float distanceFromCamera = 2; // TODO: Move this to const 

     Vector3 desiredPosition = headPosition + gazeDirection * distanceFromCamera; 
     textMeshGameObject.transform.position = desiredPosition; 

     // Rotate the object to face the user. 
     Quaternion toQuat = Camera.main.transform.localRotation; 
     toQuat.x = 0; 
     toQuat.z = 0; 
     textMeshGameObject.transform.rotation = toQuat; 
    } 

    // Returns current text mesh or creates new one if there is no 
    private TextMesh getCurrentTextMesh() 
    { 
     if (!textMeshGameObject) 
      textMeshGameObject = new GameObject(); 

     TextMesh curTextMesh = textMeshGameObject.GetComponent(typeof(TextMesh)) as TextMesh; 
     if (!curTextMesh) 
     { 
      // TODO: Make constants 
      curTextMesh = textMeshGameObject.AddComponent(typeof(TextMesh)) as TextMesh; 
      MeshRenderer meshRenderer = textMeshGameObject.GetComponent(typeof(MeshRenderer)) as MeshRenderer; 
      meshRenderer.enabled = true; 
      curTextMesh.anchor = TextAnchor.MiddleCenter; 
      curTextMesh.alignment = TextAlignment.Center; 
      curTextMesh.fontStyle = FontStyle.Bold; 
      curTextMesh.fontSize = 20; 

      curTextMesh.transform.localScale = new Vector3(0.02f, 0.02f, 0.02f); 
     } 

     return curTextMesh; 
    } 

    public void Show3DTextToast(string textToShow, int timeout = 5) 
    { 
     if (timeout < 0 || textToShow == "") 
      return; 

     TextMesh curTextMesh = getCurrentTextMesh(); 

     curTextMesh.text = textToShow; 

     textMeshGameObject.SetActive(true); 
     isShowingTextMessage = true; 

     // Canceling message hiding invokation if there was any 
     CancelInvoke("Hide3DTextToast"); // TODO: Move function name to const 
     // Hiding text if there is any timeout 
     if (timeout != 0) 
      Invoke("Hide3DTextToast", timeout); 
    } 

    public void Hide3DTextToast() 
    { 
     textMeshGameObject.SetActive(false); 
     isShowingTextMessage = false; 
    } 
} 

は、今、私たちが必要とするすべては彼に、テキストとの間隔を渡すことによって機能Show3DTextToastを呼び出すことです。
例:

ToastText3D.Instance.Show3DTextToast("Text Message", 10); 
+0

これまでにこのコードを更新しましたか? – uacaman

+0

いいえ、これは単なるバージョンです。その後、ハードコードされた部分と静的な部分を削除して(コードを一度に複数のポップアップを表示できるようにする) –

関連する問題