カメラの前に(ゲーム中に)テキスト通知を表示して、プレーヤーが動いている間にカメラにたどり着ける簡単な方法はありますか?3Dテキスト通知/トーストを表示する方法
プレイヤーが音声でコマンドを与えることができるゲームを作成しています。コマンドが認識されたら、Androidのトースト通知のようなテキスト通知を表示する必要があります。
私はテキストメッシュについて知っており、それをカメラの前に置いて表示/非表示にすることができますが、プログラムで行う必要があります。
カメラの前に(ゲーム中に)テキスト通知を表示して、プレーヤーが動いている間にカメラにたどり着ける簡単な方法はありますか?3Dテキスト通知/トーストを表示する方法
プレイヤーが音声でコマンドを与えることができるゲームを作成しています。コマンドが認識されたら、Androidのトースト通知のようなテキスト通知を表示する必要があります。
私はテキストメッシュについて知っており、それをカメラの前に置いて表示/非表示にすることができますが、プログラムで行う必要があります。
飛行機でトーストを生成するクラスを作成することになりました。
コードは、このようなものである(初期バージョン、小さな再因数分解を必要とします):
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);
これまでにこのコードを更新しましたか? – uacaman
いいえ、これは単なるバージョンです。その後、ハードコードされた部分と静的な部分を削除して(コードを一度に複数のポップアップを表示できるようにする) –
何か試しましたか?少なくともテキストメッシュの文書をチェックしましたか? (私はあなた自身の質問に答えました、それは素晴らしいですが、質問自体は研究面では少し貧弱でした) – Kroltan
@Kroltan私は研究に数時間を費やしました。私は最高のソリューションを与えたかどうかは確かではありませんが、少なくともそれは私が望むように働いていました:) –