Unity全方位2Dシューティングチュートリアル3回目。自機へ機能追加

前回の記事ではプレイヤーを移動させるためのスクリプトとプレイヤーの移動を制限するためのスクリプトを作っています。
Unity全方位2Dシューティングのチュートリアルをやってみる【第2回】

5.マウスカーソルのほうにプレイヤーを向ける

UtilsScriptに関数を追加する

前回つくったUtilsScriptに関数を追加します

public static float GetAngle(Vector2 from, Vector2 to){
	var dx = to.x - from.x;
	var dy = to.y - from.y;
	var rad = Mathf.Atan2(dy, dx);
	return * Mathf.Rad2Deg;
}

staticで定義しているので静的メソッドになります。GetAngle()は自分で定義した関数です。ここではじめてみるMathf.Atan2()やMathf.Rad2Degなどがあります。はっきりいうとよくわからないですが、GetAngle()全体がオブジェクトとオブジェクトの2点間の角度を求める処理になっているようです。もはや決まり文句みたいな感じなのでこういうもんだとおもっておくことにしました。

定義したGetAngle関数をPlayer側で使う

PlayerScriptのUpdateメソッドに下記のコードを追加します。

// プレイヤーのスクリーン座標を計算する
var screenPos = Camera.main.WorldToScreenPoint( transform.position );

// プレイヤーから見たマウスカーソルの方向を計算する
var direction = Input.mousePosition - screenPos;

// マウスカーソルが存在する方向の角度を取得する
var angle = UtilsScript.GetAngle( Vector3.zero, direction );

// プレイヤーがマウスカーソルの方向を見るようにする
var angles = transform.localEulerAngles;
angles.z = angle - 90;
transform.localEulerAngles = angles;

Vector3.zeroはVector3(0, 0, 0)と同じ意味になるようです。transform.localEulerAnglesに関しては回転を制御するためのプロパティのようです。angle.zとあるのでz軸回転させているようです。

ここでの学び

ここでの学びははっきりいってしまうとないです。なぜならUnityのリファレンスを見て関数やプロパティの役割を調べても意味が理解できないからです。そのため「自機をマウスカーソルがある方向に向けるための<<おまじない>>がある」と思うしかないです。

ここまでの状態

「自機をマウスカーソルがある方向に向けるための<<おまじない>>を実装したので、とりあえずそのとおり動作するようになっています。
screenshot 20181209 2020

背景をスクロールする

背景に関してはとりあえずSceneビューに配置しているだけなので、スクロールさせるようにしてみます。

ここでやること

  • Background用のスクリプトを作成
  • Backgroundオブジェクトに作ったスクリプトをアタッチする
  • Transform型の変数を定義しているので、プレイヤーオブジェクトをアタッチする
  • limit(背景の移動範囲)の値を変更する。

背景をスクロールさせるスクリプトを作成

背景用のスクリプトをBackgroundScriptという名前で作成することにしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackgroundScript : MonoBehaviour {
	public Transform m_player; //プレイヤー
	public Vector2 m_limit; //背景の移動範囲

	void Update () {
		//プレイヤーの現在位置を取得する
		var pos = m_player.localPosition;

		//画面端の位置を取得する
		var limit = UtilsScript.m_moveLimit;

		//プレイヤーが画面のどの位置に存在するのかを
		//0から1の値に置きかえる
		var tx = 1 - Mathf.InverseLerp(-limit.x, limit.x, pos.x);
		var ty = 1 - Mathf.InverseLerp(-limit.y, limit.y, pos.y);

		//プレイヤーの現在地から背景の表示位置を算出する
		var x = Mathf.Lerp(-m_limit.x, m_limit.x, tx);
		var y = Mathf.Lerp(-m_limit.y, m_limit.y, tx);

		//背景の表示位置を更新する
		transform.localPosition = new Vector3(x, y, 0);
	}
}

ネットで調べてもさっぱりわかりませんでした。わかるのはざっくりとプレイヤーの位置に対して画像表示位置の更新処理を行っているということだけでした。考えても仕方がないのでおまた、おまじないを唱えているのだと思うしかありませんでした。

ここまでの学び

まったく意味がわかりませんでした。なんの学びもありません。もはやこのブログを読む価値はないかもしれません。

ここまでの状態

まったくわからないのですが、コピペすれば動きはします。
screenshot-20181208-2111

次の記事

次の記事はPrefabをつかって弾を作成してきます。
Unity全方位2Dシューティングチュートリアル4回目。弾の作成


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78