チャプター4SwipeCar

ゲームを作る流れは次のよう。

  1. プロジェクトの作成
  2. オブジェクトの配置
  3. 車を動かす
  4. UIの作成
  5. 監督の作成

 

プロジェクトの作成

 

GameウィンドウのVSyncにチェックを入れるのは前回と同様。

File>Build Settingからスマホセッティングに変更。

Switch Platformを押す。

するとFree Aspectで画面の比率などをスマホサイズに指定できる。

 

File>Save as からシーンをセーブ。

プロジェクトのセーブとシーンのセーブの違いが微妙にわからない。

オブジェクトの配置

 

 

車を動かす

スワイプして車が移動するスクリプトを描きます。

C#Scriptを作成するのでした。

projectウィンドウ上で右クリックをして・・・

作ったファイルに名前をつけます。

この名前が、重要なのでした。

実はCarControllerはダウンロードしたサンプルの中に入っています。

そのまま、carオブジェクトにドロドら。

 

スクリプトの中身を見てみます。

Vector2 startPos;  変数starPosのデータ型をVector2にする

C# 基礎 第10回 変数定義 | TECH PROjin

Input.mousePosition はマウスの座標を取得するメソッド

入力を取得するInputクラスについて
ここでは入力を取得できる「Inputクラス」について説明します。 ※この記事で使用しているUnityのバージョン:Unity2019.1 Inputクラスとは InputクラスはUnityで最初から用意されているクラスで、キーボード・マウス

 

前回のInput.GetmouseButtonはunityのreferenceによると、

押されたマウスのボタンに対応する数字を取得するようです。

Input-GetMouseButton - Unity スクリプトリファレンス
マウスボタンが押されているかどうかを返します

 

調べたいことがあったら、unityのリファレンスが便利!

 

endPos.xで Vector3の型を持つendPosのx成分を取得する。

 

謎の数字の後のfは、その数字がfloat型の数字であることを明示するために使うということらしい。

【Unity】Vector3を完全攻略!加算・比較もできるって知ってた? | 侍エンジニアブログ
この記事では「 【Unity】Vector3を完全攻略!加算・比較もできるって知ってた? 」といった内容について、誰でも理解できるように解説します。この記事を読めば、あなたの悩みが解決するだけじゃなく、新たな気付きも発見できることでしょう。...

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のリファレンスはこちら。

GameObject-Find - Unity スクリプトリファレンス
name で GameObject を検索し返します。

気になったものはどんどんググろう。

 

旗を過ぎたらゲームオーバーになるようにしてみました。

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 = "ゲームオーバー";
}

実行してみよう!と思ったら。

左下にエラーが

よくみてみると、追加したコードの{ }が足りていませんでした。

書き直したらできました。

エラーは何故か残ります。

ゲームコンポーネントが必要なのか、という話はこちら。

【Unity初心者】 GetComponentの使い方をテキスト変更を例に解説 おまけ:GetComponentの省略 - Qiita
#環境Unity 2019.3.7f1#対象の方なんらかのUnityチュートリアルを終えて制作の雰囲気がわかっている方#基本文とりあえず知っておきたい基本文コンポーネントを入れたい変数=…

 

コンポーネントってそもそも何?だっけ?

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という書き方は、例外!)

 

スクリプトは

  1. Findメソッドでオブジェクトを指定する。
  2. GetComponentでコンポーネントを指定する。
  3. コンポーネント内のどの情報にアクセスするか指定する。

このように成り立っているようです。

 

音を出すコンポーネントをアタッチする。

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()内にあるため、、、

マウスを離す(クリックする)たびに、音がなる?

やってみよう。

 

できましたか?

できましたね。

ちなみに、ドラッグして動かした後にクリックすると車が止まります。逆走もできます。

スマホで動かしてみよう

 

 

 

 

監督

コメント