Unity全方位2Dシューティングチュートリアル10回目。宝石の当たり判定

コガネブログさんの「【Unity 入門】全方位シューティングを作る」というサイトのチュートリアルをやってみるシリーズの10回目です。前回は宝石アイテムの作成と敵を倒したら宝石アイテムをおとすように、調整しました。
Unity全方位2Dシューティングチュートリアル9回目。宝石アイテムをつくる

今回は宝石アイテムの当たり判定が出るように調整していきます。いろいろよくわからない状態でやっていますので、あまり参考にならないかもしれません。

15.宝石に当たり判定をつける

ここでやること

  • 宝石スクリプト(GemScript)に当たり判定用のコード追加
  • PlayerScriptにもコードを追加
  • 宝石Prefabにcolliderとrigidbodyを追加する

コードはともかくcolliderとridigbodyの追加は当たり判定を実装する上で必ず必要になります。以前の記事で敵とプレイヤーの当たり判定を実装する際にもこの作業はやっています。

宝石スクリプトに当たり判定用のコードを追加

GemScriptにコードを追加してきます。宝石をプレイヤーの追尾モードにするコードとそのパラメーター。あとは衝突判定用のコードを追加しています。

/
*
略
*
/
public float m_followAccel = 0.01f;//プレイヤーを追尾するときの加速度
private bool m_isFollow;//プレイヤーを追尾するモードに入った場合true
private float m_followSpeed;//速さ
/
*
略
*
/
void Update () {
/
*
略
*
/ 
	//プレイヤーの現在地を取得
	var playerPos = PlayerScript.m_instance.transform.localPosition;

	//プレイヤーと宝石の距離を計算
	var disatance = Vector3.Distance(playerPos, transform.localPosition);

	//プレイヤーと宝石の距離が近づいた場合
	// if(distance < Player.m_instance.m_magnetDistance){
	// 	m_isFollow = true;
	// }
	m_isFollow = true;

	//プレイヤーを追尾するモードに入っている場合かつ、プレイヤーがまだ死亡してない場合
	if(m_isFollow && PlayerScript.m_instance.gameObject.activeSelf){
		//プレや-の現在地へ向かうベクトルを作成する
		var direction = playerPos - transform.localPosition;
		direction.Normalize();

		//プレイヤーの存在する方向に移動する
		transform.localPosition += direction * m_followSpeed;

		//加速しながら近づく
		m_followSpeed += m_followAccel;
		return;
	}
}
/
*
略
*
/
//プレイヤーとぶつかったときだけ宝石を消す
private void OnTriggerEnter2D(Collider2D collision){
	if(!collision.name.Contains("Player")) return;

	//宝石を削除する。
	Destroy(gameObject);
}

本家コガネブログさんの元コードはif文でisFollow(プレイヤーを追尾するモードに入るためのスイッチ)を切り替えるようにしているのですが、倒したらアイテムをすいとるように条件分岐なしでtrueにするようにしました。

プレイヤースクリプトにコード追加

プレイヤースクリプトには宝石をひきつけるための距離を設定するため変数を追加します。

/
*
略
*
/
public float m_magnetDistance; // 宝石を引きつける距離

宝石Prefabにcolliderとrigidbodyを追加する

宝石Prefabにcolliderとrigidbodyを追加します。箇条書きがわかりやすいかと思いますので箇条書きにします。

  • 宝石Prefabにcolliderを追加し「is Trigger」にチェックを入れる
  • 宝石Prefabにrigitbodyを追加しGravity Scaleを0にする

この作業はすべての宝石Prefabにやらないといけないのでめちゃくちゃめんどくさいです。そこで使えるのがCtrlキーで複数のオブジェクトを選択状態にするやり方。もしくはShiftキーで複数のオブジェクトを選択状態にするやり方があります。

複数選択状態にしてコンポーネントの追加を行うと、選択状態になっているオブジェクトすべてに反映されます。パラメーターの設定も同様で選択状態になっているオブジェクトすべてに値の変更が反映されます。

ちまちまとした作業なのでどんどんやっていきます。以下画像です。
screenshot 20181211 1640

ここまでの状態

Playerオブジェクトのm_magnetDistanceは宝石をひきつける距離なので適当に調整します。今回はめんどうなので、宝石を無条件で吸い取るようにしています。screenshot 20181211 1648

次の記事

つづきを書いてもよかったのですが、次は全く違うBGMの実装なんで次の記事にします。ほんとはその前にプレイヤーのレベルアップを実装する回があるのですがシューティングにレベルなんていらねえよということで次の記事はBGMと効果音の実装を書くことにします。
Unity全方位2Dシューティングチュートリアル11回目。BGMと効果音