クリアメモリ

プログラミングやモーショングラフィックス、便利なアプリケーションなど雑多に記録するブログ

【Unity】スクリプトからテキストを書き換える方法

f:id:clrmemory:20170422163939p:plain 

先日、Unityでタップ処理を追加する方法という記事の中で「タップされた回数をテキストで表示する」という方法をとりました。

 

Unityなら簡単にコードからテキストを書き換えることができるので紹介します。

 

 

はじめに

 

前回紹介した方法は以下の記事から確認してください。

 

https://clrmemory.com/unity/use-tap-function/

 

 

この記事で紹介している動画を見ていただけると「テキストをコードから書き換える」という動作がよりわかりやすくなると思います。

 

今回の動作はUnityを使って確認しています。では今回使うオブジェクトを作っていきましょう。

 

今回使うオブジェクトは:

  1. テキストのオブジェクト
  2. コード
  3. カメラ
  4. 当たり判定のオブジェクト
  5. その他、動作を見やすくするためのオブジェクト

です。

 

まず作っていきましょう。

 

オブジェクトを配置する

 

私は「カメラ」「TAPというテキスト」「回数を数えるテキスト」「当たり判定のボタン」を作りました。

テキストを書き換えるだけなら「回数を数えるテキスト」だけあれば十分です。

 

配置が完了したらいよいよコードを書いてみましょう。

今回のコードでは「ボタンをクリックした回数を数える」という処理にしてあります。

 

コードを書く

 

まず結論から申しますと、以下のようなコードを書けばテキストをコードから書き換えることができます。(コードの後に解説してあります)

 

using UnityEngine;
using System.Collections;

public class Count : MonoBehaviour {

    GameObject button;
    GameObject tapTex;
    GameObject CountTex;
    GameObject mainCamera;
    Camera main;

    int Count;
    // Use this for initialization
    void Start () {

        button = GameObject.Find ("Button");
        tapTex = GameObject.Find ("Tap");
        CountTex = GameObject.Find ("Count");
        mainCamera = GameObject.Find ("Main Camera");

    }

    // Update is called once per frame
    void Update () {
        main = mainCamera.GetComponent ();

        Vector3 mousePos = main.ScreenToWorldPoint (Input.mousePosition);
        Collider2D col = Physics2D.OverlapPoint (mousePos);

        if (Input.GetMouseButtonDown (0)) {
            if (col == button.GetComponent <Collider2D> ()) {
                tapTex.GetComponent <MeshRenderer> ().enabled = false;
                CountTex.GetComponent<MeshRenderer> ().enabled = true;
                Count = Count + 1;
            }
        } else if (Input.GetMouseButtonDown (1)) {
            Count = 0;
        }

        if (Count <= 9) {
            CountTex.GetComponent<TextMesh> ().text = string.Format ("0{0}", Count);
        } else {
            CountTex.GetComponent<TextMesh> ().text = string.Format ("{0}", Count);
        }
    }
}

 

このコードの中で「コードからテキストを書き換え」ている箇所は『CountTex.GetComponent<TextMesh>().text = string.Format(“{0}”, Count);』です。

他の部分はテキストの書き換えとは関係ないので、注意してください。

 

では解説していきます。(今回のコードは、かなり細かく分割しています。実際はもっとまとめることができるので試してみてください)

 

Start( ){}

 

まずStart( ) 内で、各オブジェクトを取得しています。

CountTexを取得していないと、テキストを取得できないので必須です。

 

mousePos

 

この部分でカメラ内のタップした位置を取得します。

より詳しい説明は「タップ処理を実行する方法」で説明しています。よければご覧ください。

 

col

 

タップした位置に当たり判定を発生させます。

こちらもより詳しい説明は「タップ処理を実行する方法」で説明してあります。

 

if(Input.GetMouseButtonDown(0)){}

 

マウスをクリックした位置が「ボタン」のコライダー内だった時の処理です。

TAPテキストを非表示にし、Countテキストを表示します。

 

スクリーンショット 2015-12-28 21.26.45

 

デフォルトではこのようになっていると思ってください。タップすると以下のように変わっていきます。

 

スクリーンショット 2015-12-28 21.27.42

 

5回クリックしたらこのようになります。

 

else if(Input.GetMouseButtonDown(1)){}

 

右クリックしたら数えた回数を0に戻します。

 

if(Count <= 9){}

 

カウントした回数が0〜9の間なら「0x」という表示にするようになっています。

string.Format(“{0}”, Count) は「Count」を「{0}」に入れるという意味なので、コードでテキストを書き換える時に使えます。

Countの値が変わったら、テキストも変わるので「クリックされたらCountを1増やす」という処理をすれば、テキストも1ずつ増えていきます。

 

 

他にも、例えば「TAP」と書かれたテキストを使わずに「Count」のテキストに「TAP」と書いておけば、無駄なオブジェクトを使わずに済みます。

その場合は if(Count <= 9){ を if(Count != 0 && Count <= 9){ というように「まだタップされていなければ」というように処理を変更してあげてください。

 

もし変更した時は「else{」の方も変更しなければなりません。

 

ちなみにstring.Format(“0{0}”) と string.Format(“{0}”)というように2つを分けているのは「初期設定だと、01と1では表示される位置が違う」からです。

設定を変更すれば問題なく表示できるようになります。

[Unity] テキストの中心点を変更する方法|桁が変わるとテキストがずれる

[超簡単!!] Unityでタップ処理を実装する|動画あり

まとめ

 

今回の方法は「回数を数える」時だけでなく、テキストを書き換える時にも使えます。

 

例えば:

「こんにちは」TAP

「私は○○○です」TAP

「よろしくお願いします」TAP

非表示

 

というように「タップすることで、会話が進む」というようなRPG要素を作ることもできます。チュートリアルなど簡単なテキスト表示に活用してみてください。

 

他にもいろいろな使い方があると思うので、ぜひいろいろ試してみてください。

ではまた。