バーチャル3Dクリエイターの神部まゆみです(*^-^*)
今日は昨日の続きでボタンを追加したり、クリックされたらテキストを変えたり、インスペクターとかをクリック検知でオンオフするところまでやるよ。
スクリプト組むの初めてだから時間かかるかもしれないけど、探り探りやります( ̄▽ ̄;)
前回の記事はこちら。
UnityのuGUIでテキストを表示してギャルゲーっぽいのを作ろう
ボタンを追加してみる
今回もこちらの先輩の記事を参考にしてやっていくよ。

キャンバスの上で右クリック → UI → ボタン を選択すればOK。
「Xボタン」と「Button – TextMeshPro」っていうのがあるけど、どっちにしてもあまり変わらなかった。
とりあえずXボタンにしておこう。
こんな感じで追加された。
imageとbuttonっていうコンポーネントで構成されてるみたい。
imageのソース画像を変えればボタンの画像も変えられるみたいだから、ちょっと適当な画像に変えておこうかな。
今のところ、押しても何も起きないね( ̄▽ ̄;)
押したらスクリプトが起動するテストをやってみる
でもこれでonclickでスクリプトを呼び出したりできると思うから、スクリプトを書けばテキストを変えたりできると思う。
こちらの先輩のページの簡単なスクリプトを書いてみよう。

メモ帳で書いたけど、こんな感じかな。
publicにしておけば外部のオブジェクトやスクリプトからも呼び出せるらしい。
Debug.Logは以前本屋で立ち読みした時に見た気がするけど、コンソール画面のことかな。
あとはこのスクリプトを適当な画面にアタッチして、Buttonのところで読み出せばいいみたい。
最初TestClick.csってファイル名にしたら、「クラスとファイル名を一致させてください」ってエラーが出た。
だからクラス名の NewBehaviourScript にしたらOK。
とりあえずキューブ作ってアタッチしたけど、なんか黄色い線が出てるのはちょっと気になる。
クリック時 のところにスクリプトを追加する
英語だとonClick。
+を押したら追加したキューブをD&Dして、さっき書いたスクリプトからTestClickを指定すればOK。
これでゲーム画面を実行してみると…いけた!
ボタンを押すという条件は作れたわけだから、あとは Debug.Log(“”); のところさえ書き換えれば何でもボタン制御できそう。
というかキー入力や左クリック検知でもいいのでは…?
やっておいてなんだけど、私の用途ならボタンよりもキー入力やクリックのほうがいいかも( ̄▽ ̄;)
ボタンは選択する時とかは有効だけど、ざっくりと切り替えだけしたい場合はキー入力とかクリックのほうがいいね。
キーを押されたらテキストを変えるようにしてみる
こちらの頭のいい先輩のページを参考にしたよ。

スクリプトアタッチしてテキストを指定しただけなんだけど、もうできた!
これはZキーを押したらテキストがENDに切り替わるって言うスクリプト。
なんかゲームオーバーになったみたいな感じだけど(笑)、これならキーの部分だけ書き換えれば簡単に制御できそう。
キーを押して行って、次々とテキストを切り替えていく感じにできるか?
これ、サウンドノベルとかこういう紙芝居系のギャルゲーっぽいゲームとか、内部的にどう処理してるのが多いんだろう?
方式としては、
- 変数を作り、キーが押されたら+1して、ifかcase文みたいに書く
- 長いテキストファイルを作って、 。 とか 」 があったら区切って配列か何かに格納して、forかwhileで回して出力する。
- 配布されてるライブラリを使う
とか?
そんなにテキスト表示しないような気がするから、単純に1でもいけそうだけども。
コードは長くなるけど単純ではある。
2は、ファイル読み取り系の関数とかでそういう機能なかったっけな?わかんないけど。
単純なif文で切り替えていくことに成功!
上の先輩のコードを改変したやつだけど、改変したから引用で載せてもいいよね。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SetText : MonoBehaviour { public Text title; public int page = 0; // Use this for initialization void Start () { } // Update is called once per frame void Update () { // z キーが押された時 if (Input.GetKeyDown(KeyCode.Z)) { if(page==0)title.text = "0"; if(page==1)title.text = "1"; if(page==2)title.text = "2"; page++; } } }
あれ、ワードプレスだとプラグインか何か入れないとスペースは削除されちゃうみたい?
これは改変だからアレだけど、あんまり自分でコード書いていくようならGithubで公開するようにしていこうかな。
これでこんな感じに、zキーを押して行ったらint変数pageが+1されていって、pageの値によってテキストを変えられるようになった。
せっかくだからギャルゲーっぽく書き換えてみよう( *´艸`)
はみでちゃったからテキストオブジェクトのサイズ自体を変えたけど、どうだろ。
なんか微妙にサイズが変わってるように見えなくもないような…?気のせいかな。
ちなみにこれ静止しているアニメーションを適用してるだけだから、ちゃんと動かすこともできるんだからね。勘違いしないでよね(///)
一応「私3Dだし当然動けますけど?アピール」もしておく(笑)。
あとはテキストだけじゃなく、アニメーターを切り替えたり、オブジェクトのパラメーターを書き換えたりすれば、動画作るには十分だと思う。
流石に全部アニメーションで作ってやるってのはきついしね( ̄▽ ̄;)
Zキー以外のキー入力をしたい場合はどうする?
単純に、 Input.GetKeyDown(KeyCode.Z) のZを他のキーに変えればいい感じかな。
Unityの公式ページにKeyCodeの一覧が載ってるから、Zの部分をここに載ってるキーに切り替えればなんでも使えそう。
……試しにA、Home、Spaceに変えてみたら、問題なく動作した。
キー入力はこれで問題なさそうだな。
マウスのクリック検知は?
この前ObiFluid使ってた時使った、左クリックで液体発射するサンプル作ってくれた先輩のスクリプトだと、 if( Input.GetMouseButton(0) ) って書いてあったけど。
キーだと Input.GetKeyDown(KeyCode.Z) でカッコ内にKeyCode指定してたけど、マウスボタンは左と右と中央の3つが標準だから、番号で管理してるのかな?
ゲーミングマウスとかの多ボタンマウスは、専用のソフトやドライバでボタンを割り当てることが多いし。
unity公式サイトによると、
- 0 : 左クリック
- 1 : 右クリック
- 2 : 中央ボタン
みたい。
じゃあコードを左クリック検知に書き換えてみる。
これでも問題なく動作したよ(*^-^*)
anyKeyで何かしらのキーかクリックがされた時だけ動かすのもアリかな
とりあえず画面を進めたいとか、ざっくり1か0かで判断すればいいならこれでもいいかも。
やってみたらちゃんと動作した!
どのキー押してもいいから、個別指定や選択する必要が無ければこれでも十分。
とりあえずこれでキーとマウス入力インプット関係は完璧かな。
あとはホイールとかマウス移動とかもあるけど、視点変更とかしないなら必要ないかな。
動画撮影中に手動で視点変更とかは、FirstPersonControllerでやってみたけど流石にきつかったし( ̄▽ ̄;)
とりあえずキーとマウスクリック入力さえ拾えれば十分だと思う。
キー入力などに応じて、インスペクターオンオフやパラメーター変更とかもできるか?
キーとマウス入力は拾えるようになったけど、問題は何を切り替えるか?だよね。
やりたいのは…
- インスペクターオンオフ
- コンポーネントオンオフ
- ターゲットディスプレイ変更
- LookAnimatorの視線追従先変更
- アニメーター切り替え
- ObiFluid起動
- その他パラメーター切り替え
このくらいかな。
そうすれば揺れをその場で変えたりできるから、手軽に動きに変化を作れて単調さをなくせるしね。
インスペクターオンオフ SetActiveでいける
こちらの頭のいい先輩のページによると、 SetActive(false); でオフにできるみたい。

……キャンバスのテキストのところにsetactiveのコードだけ組み込んで服の一部を消そうとしたけど、オブジェクトが宣言されていないからエラーで動かなかった。
これは別にスクリプトごと組み込んだほうがいいね。
先輩のコードのオブジェクト部分だけ書き換えてみた。
まゆみのprefabにスクリプトをアタッチして、リボンを消したり表示したりさせることに成功!
これはえっちな使い方ができそうだね( *´艸`)
このスクリプトはpublicでオブジェクトをD&Dで設定できる方式だから、他の関係ないオブジェクトにアタッチしてもいけるかも。まぁ管理しにくいからやらないけど。
ただ、テキスト表示のほうをanykeyにしたままでやったら、非表示はできたけど表示されずに詰んだ( ̄▽ ̄;)
入力処理がダブると不具合の原因になりそうだから、キーやマウス入力によって動かす部分は細かく分けたほうがいいかも。
コンポーネントオンオフ
GetComponentを使えばいけるっぽい。
ただ、クラスとか型?がよくわからず、LookAnimatorをオフにしようとしたけどできない(-_-;)
Rigidbodyとかの、デフォルトでunityにあるようなコンポーネントは制御できた。
別のオブジェクトにアタッチしておいて、オブジェクトごと消す…とかはインスペクターオンオフで行けると思うけど。
私の知識ではまだちょっと難しいかな。
ターゲットディスプレイ変更
これは普通にできそう。
こちらの先輩のページが詳しいと思う。

サンプル通りやったら普通に動いた!
カメラ増やして、setactiveでオンオフを切り替えてるだけみたい。
視点変更は単純な割に動画にメリハリを作れるから、積極的に使っていきたいね。
追記:これはターゲットディスプレイを変えているのではなく、全てディスプレイ1に表示してカメラをオンオフして切り替えているだけ
みたい。
↑の先輩のコードを参考にして、自分で切り替えのスクリプトを書いてみて気付いた( ̄▽ ̄;)

まぁカメラは切り替わるから、今のところ機能は果たせているんだけども。
ターゲットディスプレイを指定して何かする機能を使っていた場合、不具合が出る可能性があることは頭に入れておいた方がいいかも。
LookAnimatorの視線追従先変更
LookAnimatorのコンポーネントへのアクセスすらできてないのでちょっと無理っぽい( ̄▽ ̄;)
ゲーム実行中に手動でやるか、適当なオブジェクトに追従させてアニメーションさせるのが無難かな。
というかそっちのほうが手軽だからいいかな?
アニメーター切り替え
これはゲーム作成に普通に使う機能だろうから、サンプルは豊富そう。
アクションゲームとかは、キーによって攻撃とかジャンプとかアニメーションを切り替えてるわけだし。
この先輩のページあたりが詳しいかな。

ただ、ここについては簡単に書ける感じじゃないかも( ̄▽ ̄;)
長くなりそうだし、別記事で書こうかな。
追記:キー入力でアニメーションを切り替えられるようにした!でもどう動かすか?が重要かも

Anystateならどのアニメーション遷移中でも発動させられるみたい。
だけどどう動かすか?を決めておくほうが重要かも。
キーはたくさんあるから、いい感じに切り替えていけばなかなか良い映像になるとは思うんだけど。
もう少しアニメーションを作って切り替えて見ないとなんとも言えないけどね。
おわりに
ここまでできれば表示を動的に切り替えられるから、かなり表現の幅が広がるかな。
個人なら原則無料でこんな凄いソフトが使えるなんて凄い時代だね。
ただ、まだやり方が分かっただけだから、使いこなすには慣れが必要かも。
次回はアニメーターコントローラーでアニメーション遷移させるやつをやろうかな。
いい感じにアニメーションを条件分岐で繋げられれば、短いアニメーションをたくさん作っていい感じに長い動きが作れると思うんだよね。
まぁ頑張ってみるよ。