今回は、ブログのコメントからリクエストを頂いた内容の記事になります。
Unityのスクリプトから、UIテキストの内容を変更したい時にどうすればいいか?という内容になります。
実はこの内容、わたくしもUIを扱い始めの頃に、JavaScriptでC#で書かれたスクリプトと同じような事をしようとして出来なかったものでした。
C#とJavaScriptで微妙に記述の仕方が変わるんです。
記述の仕方については、実際にスクリプトを見てもらった方が早いと思います。
まずはヒエラルキー上にUIを作成します。
上のように階層を作成します。
Canvasに、MessageTestC(C#で作成)とMessageTestJ(JavaScriptで作成)を作成し、取りつけておきます。
テストする時にどちらかをアクティブ、どちらかを非アクティブにしてテストします。
C#でUIを使用する時のスクリプト
MessageTestCは以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using UnityEngine; using System.Collections; using UnityEngine.UI;//この宣言が必要 public class MessageTestC : MonoBehaviour { Text myText; // Use this for initialization void Start () { myText = GetComponentInChildren<Text>();//UIのテキストの取得の仕方 myText.text = "代替テキストC";//テキストの変更 } // Update is called once per frame void Update () { if(Input.GetButtonDown("Fire1")) { myText.text = "代替テキストC2"; } if(Input.GetKeyDown("space")) { myText.text = "代替テキストC3"; } } } |
C#の場合は、MonoDevelopのインテリジェンス機能?が有効であればUIであるTextを使うと宣言が勝手に付く(付かない場合もある)と思いますが、
1 2 3 | using UnityEngine.UI; |
上の宣言が必要になります。
C#の場合はusingの宣言が付いていない時に、Textと書いたらTextの上にマウスカーソルを移動し、
MonoDevelopでは右クリックしてresolveからusing宣言を加える事が出来ます。
visual studioでは右クリックしてクイックアクションとリファクタリングからusing宣言を加える事が出来ます。
Monodevelopを日本語化しているので、デフォルトのMonodevelopを使っている方は少し違うかもしれません。
また、JavaScriptではUIのテキストはUI.TextとUIから始めなければいけませんが、C#の場合はTextとなります。
スクリプトの内容は
マウスの左クリックをした時に 代替テキストC2 というテキストの表示
SPACEキーを押した時に 代替テキストC3 というテキストの表示
を行っています。
JavaScriptでUIを使用する時のスクリプト
JavaScriptで記述したMessageTextJの方は、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private var myText : UI.Text;//型を指定して宣言 function Start () { myText = GetComponentInChildren.<UI.Text>();//このやり方で型指定で取得 myText.text = "代替テキストJ";//テキストの変更 } function Update () { if(Input.GetButtonDown("Fire1")) { myText.text = "代替テキストJ2"; } if(Input.GetKeyDown("space")) { myText.text = "代替テキストJ3"; } } |
JavaScriptの場合はUI.Textを取得します。
ブログの前半に投稿した記事では、GetComponentInChildren(UI.Text)としてますが、
GetComponentInChildren.<UI.Text>()で取得した方がいいみたいです。
スクリプトの処理内容は、C#で作成したものとテキストの内容を変えただけで同じになります。
JavaScriptでもC#と同じようにUIのテキストを使いたい時
これまでに書いてきたように記述すればJavaScriptでもUIのテキストを扱えますが、C#と同じように使う事も出来ます。
1 2 3 4 5 6 7 8 9 | import UnityEngine.UI; // usingの代わりにimportを使う private var text : Text; // UI.の記述がいらなくなる function Start () { text = GetComponentInChildren.<Text>(); // Textの取得時もUI.がいらなくなる } |
usingの代わりにimportを使って明示的に名前空間を指定すれば、UI.TextではなくTextで使用する事が出来ます。
いやぁ・・・JavaScriptというよりJavaですね。
これで、UnityのスクリプトからUIのテキストを操作する事が出来るようになりました。
ブログにコメントを頂いた方に返答した内容に多少付け加えて記事にしました。
簡易ではありますが、C#とJavaScriptでのUIの取り扱いの違いがわかるかと思います。