Qiitaに初めて記事を投稿させていただきます。みこしと申します。
概要
プレイヤーがオブジェクトと衝突した回数を、オブジェクトの頭上に追従して表示させる方法を紹介します。
結果
最終的にこの動画のようになります。
デモ動画pic.twitter.com/6tvXLwtob6
— みこし (@Mikoshi_prog) September 20, 2019
方法
オブジェクトの構成は上の図のようにします。動かすプレイヤーは、UnityのアセットにあるThirdPersonControllerを用いることにします。緑色の球を動かし、プレイヤーが球と衝突した回数を赤いテキストで球の上に表示させます。
Sphereの子にCanvasを設定し、さらにその子にTextを設定します。(上の図のHierarchy内でTextのアイコンが水色になっているのは、すでにTextをプレハブにしているためです。)
CanvasはデフォルトではRender ModeがScreen Space - Overlayになっていますが、これをWorld Spaceに変更します。こうすることで、通常のオブジェクトと同じようにCanvasを3D空間中の好きな場所に配置できるようになります。
***CanvasをSphereの子にしているため、CanvasのInspectorに表示される座標は親のSphereを基準とした相対座標です。***したがって、Canvasの座標をPosX=0, PosY=0, PosZ=0にすればCanvasがSphereの中心に来ます。個人的に、CanvasがSphereの中心にある方が後でTextの位置調整をする際に楽です。
Textは球の少し上に配置したいため、Textの座標はPosX=0, PosY=0.7, PosZ=0くらいがよいと思われます。先ほどと同様にTextもCanvasの子なので、TextのInspectorに表示される座標はCanvasを基準とした相対座標です。そして、Textはプレイヤーと球が衝突するたびに生成されるため、プレハブにしておかなければなりません。
では次にコードを書いていきます。まずはSphereにアタッチするコードです。
using UnityEngine;
using UnityEngine.UI;
public class SphereController : MonoBehaviour
{
public Text countText;
private GameObject canvas;
private int count;
private bool positive;
private void Start()
{
canvas = transform.Find("Canvas").gameObject;
count = 0;
positive = true;
}
private void Update()
{
if (transform.position.x > 6f) positive = false;
else if (transform.position.x < -6f) positive = true;
if (positive) transform.position += new Vector3(0.1f, 0f, 0f);
else transform.position -= new Vector3(0.1f, 0f, 0f);
}
void OnCollisionEnter(Collision col)
{
count++;
Text text = Instantiate(countText);
text.transform.parent = canvas.transform;
text.GetComponent<Text>().text = count.ToString();
}
}
public Text countText;の部分でTextのプレハブを受け取ります。
Updateメソッド内でSphereの動きを制御しています。ポイントなのがOnCollisionEnterメソッド内で、Textのプレハブを一旦インスタンス化し、Canvasの子に設定し、最後に文字を衝突回数の数字にするという流れになっています。
次に、Textのプレハブにアタッチするコードです。
using UnityEngine;
public class TextController : MonoBehaviour
{
private void Start()
{
transform.localPosition = new Vector3(0f, 0.7f, 0f);
Destroy(gameObject, 2);
}
private void Update()
{
transform.position += new Vector3(0f, 0.03f, 0f);
}
}
Startメソッド内
1行目: Textの最初の出現位置を、親であるCanvasを基準とした相対座標で指定しています。
2行目: 出現してから2秒後に消滅させます。
Updateメソッド内で、Textが上に動き続けるように指定しています。
以上です。私のQiita初めての記事を読んでいただきありがとうございました!