坊主、ルーレットは終了し、チキンレースアプリを分解しています。
//tips
//Invokeでの未対応のオーブ生成の処理
private int numOfOrb;
まだ生成されていない溜まっているオーブの数を宣言。
numOfOrbの数だけオーブ生成の処理を実行する。
void Update()
{
while(numOfOrb>0)
{
Invoke(“CreateNewOrb”,0.1f*numOfOrb);
numOfOrb—;
}
}
Invoke(“実行するメソッド名”,生成秒数);
一度に生成するのではなく、タイミングをずらして生成する。
生成秒数を0.1*オーブ数分ずらして生成。
一つ生成が終わったらnumOfOrbの数を一つ減らし、whileでoになるまで繰り返し処理を行う。
//OnApplicationPauseメソッドでアプリへの復帰を判定する
OnApplicationPauseメソッドは他のアプリに切り替えられた場合や復帰した場合、起動時にUnityから自動的に呼び出される。
他のアプリに切り替えられたのか、復帰したのかはbool型引数で表される。
bool型は true、falseで表される。
void onApplicationPause(bool pauseStatus)
{
if(pauseStatus)
{pauseStatusがtrueなのでアプリがバックグラウンド}
else
{pauseStatusがfalseなのでアプリに復帰}
}
Unity公式ページを確認すると、
Normally, false is the value returned by the OnApplicationPause message. This means the game is running normally in the editor. If an editor window such as the Inspector is chosen the game is paused and OnApplicationPause returns true. When the game window is selected and active OnApplicationPause again returns false. True means that the game is not active.
https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnApplicationPause.html
なので、アクティブでない時(バックグラウンドでポーズ状態の時)にtrue,アプリがアクティブになった時がfalseとなる。
理解補助のため下記にコードを記載する。
public class AppPaused : MonoBehaviour
{
bool isPaused = false;
void OnGUI()
{
if (isPaused)
GUI.Label(new Rect(100, 100, 50, 30), "Game paused");
}
void OnApplicationFocus(bool hasFocus)
{
isPaused = !hasFocus;
}
void OnApplicationPause(bool pauseStatus)
{
isPaused = pauseStatus;
}
}
これはポーズ状態の時の反応をOnGUI(),OnApplicationFocus,OnApplicationPauseで比較しているもの。フォーカスとポーズのアクションが反対であることがわかる。
//transform.Rotateのx,y,z軸ごとの回転方向を理解する
2Dのオブジェクトを画面上で回転させるのには一般的に
transform.Rotate(0,0,this.rotSpeed);
などのようにz値を動かすことで時計回り(z値マイナスの場合)または反時計回り(z値プラスの場合)に回転させる。
ちなみにRotateは、現在の角度から引数に与えられた量だけ回転させる機能を持つ。
x軸は横軸なので、横軸を中心にオブジェクトは回転し、画像が後ろに倒れる、または前に倒れる運動をする。
Y軸は縦軸なので、縦軸を中心にオブジェクトが回転し、画像が自分の尻尾を追い回すように運動する。
時々こんがらがってしまうので、オブジェクトの目を中心に考え、x回転は目が空を向いたり、地面を向いたりする、y軸はオブジェクトの前後左右を向く、z軸は前しか向かないと覚えておけば、わかりやすい。
//Input.GetMouseButtonDownを再度確認
以前にもGetMouseButtonのコード集について説明したが、これはアプリにとって非常に重要な操作なので何度も記載する。
Input.GetMouseButtonDownは、マウスがクリックされた瞬間に一度だけ「true」を返す。
()に入れる引数が、(0)の際は左クリック、(1)の際は右クリック、(2)の際は中央ホイールボタンクリックとなる。
If(Input.GetMouseButtonDown(0))
{
this.rotSpeed=10;
}
左クリックを押した瞬間、ルーレットオブジェクトの変数rotSpeedに10の値が入力される。
GetMouseButtonを分類すると、
押した瞬間:GetMouseButtonDown()
押している間:GetMouseButton()
ボタンを離した瞬間:GetMouseButtonUp()
となる。
//void Update()のフレーム更新の利用
スクリプトはvoid Start()で始まった後は、void Update()の処理をフレームごとに繰り返す。
その特性を利用して、ルーレットの速度を緩やかに減速させることができる。
void Update()
{
If(Input.GetMouseButtonDown(0))
{
this.rotSpeed=10;
}
transform.Rotate(0, 0, this.rotSpeed);
this.rotSpeed *= 0.96f;
}
this.rotSpeed *= 0.96f;はthis.rotSpeed = this.rotSpeed *0.96f;と表され、次のフレームのthis.rotSpeedに0.96をかけ続けるものになっている。
//マウスのドラッグ距離を抜き出す
まず最初にスタート地点の変数を宣言する。
Vector2 startPos;
マウスを押した瞬間の座標をstartPosとし、その座標mousePositionをInputを使うことでstartPosに代入する。
その後、マウスが離されたタイミングをInput.GetMouseButtonUP(0)で察知し、その時の位置であるmousePositionをInputでendPosに代入する。
endPosができたタイミングでstartPosとのベクトル差分を計算しドラッグした長さとする。
ドラッグした長さを速度に変換するため、丁度いい速度になるように500で割っている。
void Update()
{
if(Input.GetMouseButtonDown(0))
{
this.startPos = Input.mousePosition;
}
else if(Input.GetMouseButtonUP(0))
{
Vector2 endPos = Input.mousePosition;
float swipeLength = endPos.x - this.startPos.x;
this.speed = swipeLength/500.0f;
}
}
//抜き出した距離または数値を移動させる力に変える
上記に
transform.Translate(this.speed,0,0);
を追加することでswipeLengthで取得したドラッグ距離をオブジェクトx方向へ移動させる力に変換している。
1フレームごとにthis.speed分の座標変化が加えられる。
transform.Translate(x,y,z);
で移動させたい(x,y,z)分の力を加える。
その(x,y,z)座標に移動するというわけではないので注意が必要。
Translateメソッドでは本当は2つの引数をとれ、
一つ目の引数が座標、二つ目の引数が基準座標となるが、二つ目の座標を入力しなければ自動的にローカル座標としてその座標分移動させてくれるので心配ない。
//オブジェクト間の変動する距離をUIで表示させる。
変動する距離をテキストで表示させるためには、オブジェクトの位置情報にアクセスでき、かつ、その情報を計算し、計算結果をUIテキストとして表示させる必要がある。
そのため、最初に
GameObject car;
GameObject flag;
GameObject distance;
void Start()
{
this.car=GameObject.Find(“car”);
this.flag=GameObject.Find(“flag”);
this.distance=GameObject.Find(“Distance”); //UIテキスト
}
オブジェクトの位置にアクセスするため最初にFindを使用し、各オブジェクトにアクセスできる変数を作成する。
その後、
void Update()
{
float length=this.flag.transform.position.x - this.car.transform.position.x;
this.distance.GetComponent<Text>().text=“ゴールまで”+length.ToString(“F2”)+”m”;
}
オブジェクト間のx座標の距離を計算してfloat型に入れた後、それをUIテキスト表示の項目にアクセスして表示させている。
text内容を“ゴールまで”+length.ToString(“F2”)+”m”としている。
ToStringでfloat型をテキスト表示するためにstring型に変換し、小数点下二桁まで表示させている。
ToString(“F2”)のFと数字は小数点以下を何桁まで記載するかを示す。
整数の場合はToString(“D5”)などとし、指定した桁数に満たない場合は左側にゼロが挿入される。
(456).ToString(“D5”)は00456となる。