はじめに
この記事は一つ前の初期設定を済ましていることを前提としています。それから、そこそこのプログラミング経験がある方でなければ分かり辛い表現が多いと思います。
ご注意ください。
Unityを初めてたったの二日目ですがUnityの仕様がだんだん掴めてきた現状です。
備忘録として記事を書いている形ではありますが、あまりに基礎的なことなので自分でも見返すかはよく分かりません。まぁ誰かの役に立ったらいいや程度の認識で進めましょう。
一日目に「一日あったら簡単なゲームくらい作れるやろwww」という甘い見通しが残念ながら達成されなかったのに続いて二日目も無事終わりそうですが、全容が掴めてきましたのでその先駆けとしてプログラミングについて書き留めておきたいことを書いていきます。
特にTMPを使用していた場合、古いTextに関するプログラムは軒並み使えなかったので、TMPを使用していてボタンやテキストのUIのスクリプトアタッチが出来ないよ~!という方に参考にしていただければ幸いです。
環境
2022/08/13
Unity2021.3.8f1
・開発プラットフォーム Android
・画面サイズ 1920×1080の縦
・TMP適用(日本語化済み)
ボタンとテキストの配置
まずボタンとテキストを配置します。
Hierarchyタブを右クリックするか+ボタンを押して、TextとButtonを押します。
するとボタンとテキストが配置されますが、ゲーム画面で見るとあまりに小さいので画面中央に移動させて適当な大きなに調節します。
適当に配置します。
Textに入れる文字もこの後に設計するプログラムのことを考えてScore:0と書いときましょう。
これはこの記事の最後に置いてある動画を参考にしてますので詳しく知りたい方はそちらの方を参照してください。この記事はあくまでプログラミング重視です。
スクリプトの作成
プロジェクトタブでスクリプトを作成するため、プロジェクトタブのすぐ下にある+マークを左クリックでも、プロジェクトウィンドウ内を右クリックでもいいですので、C#スクリプトを作成してください。
名前は参考元に倣って、「ClickManager」とします。
ここでは分かりやすくスクショするためにプロジェクトタブを大きくしていますがあまりお気になさらず
プロジェクトにある作成したファイルをダブルクリックして開きます。
エディターは自由です。僕はAtomが好きなのでAtomで開いてます。
プログラム
今回のプログラムは次のようになります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro; //[1]
public class ClickManager : MonoBehaviour//[2]
{
private int count = 0; //[3]
public TextMeshProUGUI countText; //[4]
public void pushButton(){ //[5]
count++;
countText.text = "Score:" + count;
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
[1]
これはTMPのテキストオブジェクトを扱うのに必要な名前空間らしです。
今回テキストの変更するプログラムを作ろうとした際に一番躓いた部分です。
TMPのテキストとUnityの通常テキストは異なるらしく、TMPのテキストはUnityの通常テキストと同じ方法で変更させることが出来ません。
using TMPro; //[1]
[2]
このスクリプトのクラスで、MonoBehaviourというクラスから継承されてきている。ClickManagerという命名は、スクリプトのファイル名と同じでないといけないらしい。
public class ClickManager : MonoBehaviour//[2]
[3]&[4]
Unity独自のプログラミング方式なのでしょうか。それとも最新のものでは結構一般的なプログラミング方式なのでしょうか。Unityではしばしばアタッチという方法で、プログラム中の変数とオブジェクトとの結びつけを行います。
それの使用の方法として、C#にあるスコープを動的に変更するpublicやprivateなどでアタッチ出来るか出来ないかの区別を行っているようです。
次の例ではcountはアタッチ出来ず、countTextはアタッチ出来ます。
命名はわりと何でもよいみたいで、アタッチする予定のオブジェクトと同名にしなくてもよいみたいだ。ここに関して命名規則はないのかな?
private int count = 0; //[3]
public TextMeshProUGUI countText; //[4]
TextMeshProUGUIというのは、TMPro名前空間のユーザー定義型のようですね。
[5]
pushButton関数で、Buttonに割り当てる予定の関数だ。
名前は被らなければなんでも良いが、スコープはpublicでなければアタッチするときに参照できない問題が出てくるためpublicでなくてはいけない。
countをインクリメントで加算して、
TMPテキストのcountTextの内容を加算されたcountに対応した増やしている。
public void pushButton(){ //[5]
count++;
countText.text = "Score:" + count;
}
スクリプトのアタッチ
あまり類を見ない方法だったためこの部分に慣れるのが一番苦労しましたね。未だに知らない部分も多いのだと思います。
空の要素の生成
Hierarchyに右クリックからCreat Emplty。
スクリプトのファイル名と同じ、ClickManagerと命名。
同じ名前じゃないとエラーが出るっぽい。
空の要素にアタッチ
HierarchyにあるClickManagerか、ClickManagerのInspectorに先ほど作成したスクリプトをドラッグ&ドロップする。
するとClickManagerのインスペクターにスクリプトが割り当てられる。
テキストのアタッチ
インスペクターに追加されたスクリプトに、一つアクティブの項目がある。
CountTextだ。
その部分に最初にゲーム画面に配置したTextオブジェクト、Hierarchyにあるやつをドラッグ&ドロップする。そうするとプログラム内のcountText変数から、アタッチしたTextオブジェクトを変更することが可能となる。
ボタンへのアタッチ
HierarchyにあるボタンをクリックしてInspectorを表示。
下の方に行くとOn Click()があるので、そこの右下にある+ボタンを押して欄を一つ追加する。
欄に追加されたNoneと書いてあるやつに、先ほどスクリプトのアタッチを行ったClickManagerをドラッグ&ドロップする。するとNoneの代わりにClickManagerが現れる。
次にNo Functionと書かれているところをクリック、ClickManagerにカーソルを合わせてから、プログラムに書き加えたpushButton関数を選択する。
実行
上にある実行▷をクリックして試そう。
▷を押せばGameウィンドウがアクティブになるので、Gameウィンドウ内に配置されているButtonをクリックしてみる。そうするとプログラムで設定した通り、Scoreの値が増えていくはずだ。
終わりに
プログラミングという一点においてのみ注視すれば、Unityの分かり辛いところはアタッチのみだと思う。新しい要素というのは、新しいというだけで分かり辛く感じるものだし、その通りUnityの場合はプログラミング的な思考の余地がなかった故に難解に思えてしまった。まぁ、一度受け入れてしまえば、難しいとも思わないんだけど。
他はc#を多少触ったことがある人なら容易く出来るだろうという内容だったため、シーンチェンジだとか、多少のアニメーションプログラムなんかも、多少はミスをするだろうが調べれば何とかなりそうかな。
今回も僕がUnityを初めてまだ経験が浅い(というか浅すぎる)ためどこか間違っていたり、ここはこうした方が良いなど改善点があれば、Twitterでもこの記事のコメントでも良いので残していただけると幸いです。
Twitter:
https://twitter.com/dog_king_fun
参考