ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

No.002 進捗状況16[ゲーム画面のUIの実装]

f:id:covory10101101276:20190517111503j:plain
コルコバード -ブラジル-

みなさんこんにちは🌚

では今回もやっていきましょう!!

これまでゲーム中のオブジェクトやスクリプトなど、ゲーム全体の中枢をなす舞台を主に作ってきました。今回は実際にユーザーが触れるための境界、媒体となるUIを実装していきます。

MobileSingleStickControlの改良
といっても実は以前導入部分だけは触っているんですよね。ただ一番初めに触るべき場所はここじゃないと思ってそのまま放置してしまいました。過去の記事はこちら
dreameaters5239.hatenablog.com
キャラクター移動のスティックは作ってあるので今回はこのCanvasに加速のボタンとライフを実装しようと思います。
加速ボタン(CrossPlatformInput)
以前作った時計っぽいアイコンはデザイン変更しました。

f:id:covory10101101276:20190517194213p:plain
左上の白丸が加速のためのスイッチ。
会話ウィンドウも後ろに写っていますが開始時に消えるので気にしないでください😇
さて、このMobileSingleStickControlもといCrossPlatformInputは仮想ジョイスティックおよびボタンをInputManagerに割り当てたボタンに対応させることができる機能です。
f:id:covory10101101276:20190517195458p:plain
ButtonについているEventTriggerでどのタイミングで動作するかを設定し、ButtonHandlerで作動させるInputManagerのボタンを指定します。今回はTimeQuickerという名前を指定しました。なおこの指定する名前はInputManagerに登録してないと使えないので注意
f:id:covory10101101276:20190517195915p:plainf:id:covory10101101276:20190517195931p:plain
そして名前空間でUnityStandardAssets.CrossPlatformInputを指定して、InputManager.で呼び出しましょう
下のスクリプトを同じくボタンにコンポーネントとしてつけます。
f:id:covory10101101276:20190517200147p:plainf:id:covory10101101276:20190517200206p:plain
4行目でCrossPlatformInputを指定して、InputManagerを使えるようにしています。そしてこの長いスクリプトを要約すると
・内蔵しているChargeTimerをボタンを押している間増やしていく。
・タイマーが基準値を超えている時にボタンを離すと加速する。
このたった2つに落ち着きます笑
さて、このスクリプトをわざわざButtonに作ったのには実は理由があります。知り合いから教えてもらった小技で、画像を円形に表示できる機能を使って円の満ち欠けを使って時計盤っぽく表現しようと思います。
その方法が下の通り。ImageコンポーネントのImage Typeを[Filled]に、Fill MethodをRadial 360にします。
f:id:covory10101101276:20190517204451p:plain
そしてその下のスライダーを左右させると...
f:id:covory10101101276:20190517204716p:plain
画像が円形に満ち欠けする!!
そして先ほどのスクリプトにこのFill Amountにアクセスする記述をします。
f:id:covory10101101276:20190519122642p:plain
ハイライトしてある部分がその部分ですね。36~39行目に書いてある通りImageコンポーネントを取得、さらにそもそも最初にUnityEngine.UIにアクセスできるよう名前空間を指定するのも忘れないように
そしていろいろリデザインした時計でこれを起動すると!!
f:id:covory10101101276:20190519123013p:plain
動かない!
なんででしょう!どうやら原因はいろいろリデザインにあるらしいです...
いろいろImageを重ねたり子にして階層を配置してしまうとその画像に当たり判定が阻まれてしまい正常に動作しないようです。原因を探っているときよく目にしたCanvasコンポーネントをアタッチしてOverride Sortingという機能を使う対処法もなぜかうまく動作しなかったんですよね。
f:id:covory10101101276:20190520142138p:plain
全ての階層の画像にこのコンポーネントをつけて順番を変えられるはずが...?
なのでまた別の方法を見つけました。Graphic RayCasterという方法です。
f:id:covory10101101276:20190520142406p:plain
これはCanvasにアタッチするタイプのコンポーネントで、これをつけているとこの階層のImageすべてにタッチ情報が送られます。しかし、もちろんImageコンポーネントにRayCast Targetがチェックされていない場合は反応しません。これで....
f:id:covory10101101276:20190520142642p:plain
ようやく成功!!!
やっとできました!!長かったですね。。。

ライフUI
では今回はさらにもう一つゲームにはおきまりのライフゲージを今更ですが実装していこうと思います!!
UIに先ほどと同じ要領でImageたちを配置...
f:id:covory10101101276:20190520155845p:plain
彼らはタッチする必要がないので先ほどのような行程はいりません
f:id:covory10101101276:20190520160013p:plainf:id:covory10101101276:20190520160024p:plain
そしてプレイヤーのスクリプトにライフのint値および敵にあたった時の処理を記述する。この時LifePointはPublicにして他からアクセスできるようにしておきましょう。
f:id:covory10101101276:20190520160233p:plain
そしてこちらの新たに作ったLifePointScriptを先ほどのライフのUIにアタッチします。このスクリプト
・プレイヤーのライフにアクセス
・自身のImageコンポーネントにアクセスし、ライフに応じて画像の満ち欠けを3等分
という風になっています。
さあ起動してみると....

f:id:covory10101101276:20190520160549p:plain
ライフが減ってそれに応じた欠け方になった!
うまくいきましたね。イーサンがいないように見えるのはさっきプレイヤースクリプトに足したコルーチンでイーサンの姿を点滅させているからです。今回はここまでにしておきます。
まだ料理でいうと材料揃える段階から進んでいない....