Unity玉転がしチュートリアル 3-3.スコアとテキストの表示

# この記事の対象者
* Unity入門したい人
* 最初の一歩が踏み出せない人

# OSとか環境とか

* Windows 10 Pro
* macOS Mojave
* Unity 2019.2.8f1
* Rider 2019.2.2

# 補足
* 公式動画にて利用しているのはMacなので、Windowsユーザーはある程度脳内変換して見る事
* 筆者はWindows、Macの両方の環境で確認。Ubuntuとかでは検証してない。
* 基本Unityは英語メニューで利用
* 間違いがあったらツッコミ大歓迎


# 公式
https://learn.unity.com/tutorial/collecting-scoring-and-building-the-game#5c7f8529edbc2a002053b78a

## アイテムのカウント

PlayerControllerスクリプトにアイテムのカウント機能を追加

単純にスクリプトにint型のcount変数を準備するだけ
ただしこのままでは内部的に数値が増加するだけでプレイヤーに伝わらない

## Unityでのテキスト表示

UnityのUIツールセットを利用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/7ff103fe-8732-079b-6d85-865adf7b2b3d.png)


UI>Textを追加
追加するとTextの親としてCanvas、EventSystemが追加されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/436b4d83-774c-1483-1608-652eb9466ede.png)


これはUnityの仕様で、全てのUI要素はCanvasの子要素として機能させなければならないという鉄の掟がある（多分）

Textを「Count Text」とリネーム

追加されたが、色が黒くて地味で見ずらいので、白に変更
Textオブジェクトには他のオブジェクトと違いRect Transformが存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/24db7a67-4c0e-3e12-c54e-6a0f1f95adb2.png)


## スコア表示の位置調整

Anchor Presetsを表示して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/03c972ab-495f-074a-9292-6d87864dcf1a.png)


Shift + Altキーを押しながら、一番左上のアイコンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/3e05259f-caab-86c8-a212-6c032ef93c12.png)


画面の左上にテキストが配置されるが、このままだとテキストがギリギリ過ぎてめり込んで見えてしまう
なのでPosX,PosYを調整して空白をもたせるとそれっぽくなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/401fe61c-2593-6896-559f-b7c384db7218.png)


## count値の反映

PlayerControllerスクリプトの中でUnityEngine.UIのTextを用いて紐付ける

これでPlayerController側にフィールドが増えるので、そこにCountTextをドラッグして紐付ける
※最終的なソースは最後に書きますので動きはそちらを参考にする事

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/48bc71ff-1c37-bd49-64af-47b215643bd5.png)


↓紐付けるとこの様になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/73ba1ddb-d604-5651-46e9-84b25f3d3e16.png)



## ゲームの終了

UI>Textで終了用のテキストオブジェクトを追加
自動的にCanvasの下に追加されるので、下記のように調整

|要素|値|
|---|---|
|Pos Y|75|
|Font Size|24|
|色|白|
|Text|Win Text|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/999651f6-fd7f-80d3-5500-80c60e63e379.png)

これで下記の状態になるので、実際に終了条件を満たした際に「Win Text」が更新されるスクリプトを実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/26c2632e-29ae-4282-68c8-e08ec226ea23.png)

スクリプトを実装したら、PlayerオブジェクトのWin Textフィールドにドラッグして紐付ければ完成

最終的なPlayerController.cs

```cs:PlayerController.cs

using System;
using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
    public float speed;
    public Text countText;
    public Text winText;
    
    private Rigidbody rb;
    private int count;

    // See also:https://docs.unity3d.com/ja/2019.1/Manual/ExecutionOrder.html
    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
        winText.text = "";
    }
    
    private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        
        Vector3 movement = new Vector3(moveHorizontal,0.0f,moveVertical);
        rb.AddForce(movement * speed);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count++;
            SetCountText();
        }
    }

    private void SetCountText()
    {
        countText.text = "Count :" + count.ToString();
        if (count >= 12)
        {
            winText.text = "You Win!";
        }
    }
}
```