原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】ロックオンした敵を捉える、ロックオンを解除する

2019年上半期終了

早いもので2019年の上半期が終了し、今年も残り半年となってしまいました。

 

振り返ってみるとインディゲーム界隈では「World for two」がアプリランク1位となり、Bitsummitの盛況ぶりがマスコミで話題になるなど、インディゲームという分野の盛り上がりを感じた半年でしたが、個人的な振り返りをすれば、ゲームアプリをリリースするも特に市場にインパクトを残すことなくストアの山に埋もれてしまい、加えてAdmobのアカウントが停止されたり、GooglePlayからアプリがBanされるなど、散々な出来事しかなかった半年でした。

 

ヨルシカが「所詮、売れないなら全部が無駄だ」という歌詞を歌っていますが、まさにその通りであることを現在、実感しています。ゲームアプリの制作には苦労が多く、色々な努力を必要としますが、結果が出ないならそれらは全部無駄です。

 

とりあえず主機をつくる

とはいえ他にやることもないので、前回の記事でお知らせしたように、次回作は3D(2.5D)シューティングゲームの方向で試行版を作成しています。

 

そして最近の作業は、Playerの操る主機どうするか、ということに頭を痛めていました。

 

シューティングゲームということで、オーソドックスに戦闘機型のスペースシップを探してUnityのアセットストアを眺めていましたが、ローポリのものからハイエンドなものまで数多くの3Dモデルアセットが揃っており、色々と目移りして中々決められませんでした。

 

そうこうして時間ばかりが過ぎていくうちに頭が沸騰してきたのか、「格好いい戦闘機が主役のシューティングはストアに溢れている=同じことをしても目立たない=逆にシンプルなデザインの方がウケるかも」みたいなトチ狂った考えが湧き上がってきて、「とにかくシンプルに!無駄な装飾は全部削除!必要最小限の要素で最大公約数の機能を!」という仕事の出来ないSEが叫んでいそうな号令が頭の中で響く中、プリミティブなオブジェクトを組み上げて出来上がったのがこんな感じ。

 

ドン!!

f:id:Karvan:20190702205738p:plain

 

中抜きし過ぎたミニ四駆みたいですが、エリマキみたいなウィングもあるし戦闘機に見えなくもない。


名前は決めていないんですがとりあえず「ジラース」と呼んでいます。
(ジラースを知らない良い子はお父さんに聞いてみよう)

 

 ロックオンした敵を捉える

シューティングゲームということで、敵をロックオンして攻撃する、なんて機能を実現したいです。
その為には当然ながらロックオンした敵の方向へ弾丸を発射する必要があるので、自機を移動させながらもロックオンした敵の方向へ自機を向ける処理を実装しました。

 

オブジェクトを特定のオブジェクトの方向へ向けるメジャーな方法としてtransformコンポーネントのLookAtを使う手法があります。

 

this.transform.LookAt(targetObject.transform,Vector3.up);

 

こんな感じで指定すると、オブジェクトのZ軸方向(forward)をtargetObjectの方向へ向けることできます。


第二引数には上方ベクトルを指定しますがデフォルト引数がVector3.upとなっているので省略可能です。
もし、Z軸方向以外の方向へ向けたい場合は、この第二引数を変更する必要があります。

 

ロックオンを解除する

上記のようにロックオンした敵の方向に向く処理の実装は簡単なのですが、とはいえ、ずっとロックしておく訳にもいきません。
敵が画面の範囲外に移動してしまったり、敵と自機との距離があまりに離れてしまった場合には自動でロックを解除する必要があります。

 

今回の場合は、自機の進行方向と自機の向きとの角度を求めて、それが閾値以上になった場合にはロック解除する、とします。

 

図解するとこんな感じ、点線のベクトル(自機の向き)と実線のベクトル(進行方向)の角度を求めます。

f:id:Karvan:20190702211440p:plain

 

2つのベクトルの角度を求めるにはVector3.Angleを使います
自機の進行方向は常にZ方向なので、敵方向を向いた自機の向きベクトルを計算すればベクトルの角度が計算できます。

  

void Update()
{
	// ロック中の場合
	if(isLockOn)
	{
		// 敵方向を向くベクトル
		Vector3 diff = targetObject.transform.position - this.transform.position;

		// ロックターゲットとの角度計算
		var axisAngle = Vector3.Angle(new Vector3(0.0f, 0.0f, 1.0f), diff);

		 // 閾値以上の場合
		if (axisAngle > ThresholdAngle)
		{
			// ロックを解除する
			isLockOn = false;
		}
		else
		{
			// 敵の方向を向く
			this.transform.forward = diff;
		}
	}
}

 

敵の方向を向く処理には、先ほどはLookAtを使って説明しましたが、上のコードでは敵方向に向くベクトルを求めているで、それを利用してtransform.forwardに直接指定しています。

 

これらを使って実際に動作せるとこんな感じなりました。
敵をロックオンした後、敵との角度が急角度になると自動的にロックを解除しています。

f:id:Karvan:20190702211640g:plain

 

後は弾を打つだけなんですがねぇ。。。。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。