ゲームを作る流れは次のよう。
- プロジェクトの作成
- オブジェクトの配置
- 車を動かす
- UIの作成
- 監督の作成
プロジェクトの作成
GameウィンドウのVSyncにチェックを入れるのは前回と同様。
File>Build Settingからスマホセッティングに変更。
Switch Platformを押す。
するとFree Aspectで画面の比率などをスマホサイズに指定できる。
File>Save as からシーンをセーブ。
プロジェクトのセーブとシーンのセーブの違いが微妙にわからない。
オブジェクトの配置
車を動かす
スワイプして車が移動するスクリプトを描きます。
C#Scriptを作成するのでした。
projectウィンドウ上で右クリックをして・・・
作ったファイルに名前をつけます。
この名前が、重要なのでした。
実はCarControllerはダウンロードしたサンプルの中に入っています。
そのまま、carオブジェクトにドロドら。
スクリプトの中身を見てみます。
Vector2 startPos; 変数starPosのデータ型をVector2にする
Input.mousePosition はマウスの座標を取得するメソッド

前回のInput.GetmouseButtonはunityのreferenceによると、
押されたマウスのボタンに対応する数字を取得するようです。
調べたいことがあったら、unityのリファレンスが便利!
endPos.xで Vector3の型を持つendPosのx成分を取得する。
謎の数字の後のfは、その数字がfloat型の数字であることを明示するために使うということらしい。

UIの作成
車からゴールまでの距離を表示します。
前回はCanvasを作ってからその子要素にtextオブジェクトを作りましたが、textオブジェクトを作ると勝手にCanvasが作られるようです。
ところでtext(Canvas?)がめちゃくちゃ大きいです。
はみ出ています。
Textオブジェクトの名前をDistanceにしました。
それからPositionを0,0,0にしました。すると、テキストが画面上に現れました。
やはり0、0、0は画面中央の場所を表すようです。
あと、InspetcorのTextのallignment、Fontsizeを変えます。
UIを書き換えるスクリプトを作って、スクリプトを実行させる専用オブジェクトを作る。
右クリック>create>C#scriptなのだが、サンプルでダウンロードしたデータを使う。
コードを見てみよう。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // UI部品を使うために必要! public class GameDirector : MonoBehaviour { //car,flag,distanceはゲームオブジェクトですよと明示する。 GameObject car; GameObject flag; GameObject distance; void Start() { //car,flag,distanceというゲームオブジェクトを探して!!(この指示が必要なのですね) this.car = GameObject.Find("car"); this.flag = GameObject.Find("flag"); this.distance = GameObject.Find("Distance"); } void Update() { float length = this.flag.transform.position.x - this.car.transform.position.x; this.distance.GetComponent<Text>().text = "ゴールまで" + length.ToString("F2") + "m"; } }
GameObject.Findのリファレンスはこちら。
気になったものはどんどんググろう。
旗を過ぎたらゲームオーバーになるようにしてみました。
Updateを書き直します。
void Update() { float length = this.flag.transform.position.x - this.car.transform.position.x; if (length >= 0) { this.distance.GetComponent<Text>().text = "ゴールまで" + length.ToString("F2") + "m"; } else{ this.distance.GetComponent<Text>().text = "ゲームオーバー"; }
実行してみよう!と思ったら。
左下にエラーが
よくみてみると、追加したコードの{ }が足りていませんでした。
書き直したらできました。
エラーは何故か残ります。
ゲームコンポーネントが必要なのか、という話はこちら。

コンポーネントってそもそも何?だっけ?
Inspectorウィンドウにぽこぽこくっついている、AddComponentで追加できるもの。
そもそも英語で「成分」の意味を持つcomponent .
オブジェクトの成分、という意味だろうか。
this.distance.GetComponent<Text>().text
は
distanceオブジェクトの
GameObject distance; で
「このスクリプトで使うdistanceはゲームオブジェクトのことですよ」といい。
this.distance = GameObject.Find(“Distance”); で
「distanceというオブジェクトはpriojectウィンドウにあるDistanceという名前を持っているオブジェクトのことですよ」という。
そして
this.distance.GetComponent<Text>().text = “ゲームオーバー”;
「distanceというオブジェクトのコンポーネントのうち、Textを”ゲームオーバー”にします。」
という。
別のスクリプトも見てみる。
this.flag.transform.position.x
flagというオブジェクトの中のtransformというコンポネント内のpositionのうちx座標
を表すようです。
ここで疑問が。
this.distance.GetComponent<Text>().text
と
this.flag.transform.position.x
はやっていることが違うように見える。
<Text>ってなによ。
実は
this.flag.transform.position.x
はもともと、
this.flag.GetComponent<Transform>().position.x
である。(this.flag.transform.position.xという書き方は、例外!)
スクリプトは
- Findメソッドでオブジェクトを指定する。
- GetComponentでコンポーネントを指定する。
- コンポーネント内のどの情報にアクセスするか指定する。
このように成り立っているようです。
音を出すコンポーネントをアタッチする。
objectウィンドウでcarを選択してAddComponent
次にサンプルフォルダのcar_seをAudio Sourceコンポーネント内のAudioClipにドラドロ。
Play On Awakeにチェックが入っていると、ゲームを始めた時に音がなる。
チェックを外す。
いつ音が鳴るのかをスクリプトで支持する。
projectウィンドウ内に置いているCarControllerスクリプトの中身に追加(サンプルのデータをコピーしている場合は元から書かれている)
else if(Input.GetMouseButtonUp(0)) { //マウスを離した座標 Vector2 endPos = Input.mousePosition; float swipeLength = endPos.x - this.startPos.x; // スワイプの長さを初速度に変換する this.speed = swipeLength / 500.0f; // 効果音再生 GetComponent<AudioSource>().Play(); }
とあるので、マウスボタンが離されると、Playするような指示。
void Update()内にあるため、、、
マウスを離す(クリックする)たびに、音がなる?
やってみよう。
できましたか?
できましたね。
ちなみに、ドラッグして動かした後にクリックすると車が止まります。逆走もできます。
スマホで動かしてみよう
監督
コメント