プレイヤー周辺にばら撒くビームを実装する

更新内容に関して今回はばらまきビームに関してみていきたいと思います

ばら撒きビームの実物

こちらが実装したものとなります

かなり大味な技ですね

次はこれの仕様について見ていきたいと思います

挙動の仕様

実際挙動としては

  • 対象に向けてビームを放つ
  • ビームは高速連射
  • ただし発射方向は対象から一定距離ずれる
  • 一定距離はランダム
  • プレイヤーが動くと対象にめがけてビームを放つようになる

という感じです

要は動くと当たる系の攻撃ですね

実装方法

実装としてはこちらの応用となります

今回は 動く点P がなくなかった代わりに

シンプルに 点S を求めるだけになっています

ただし、今回は 点T を中心とした円となっているため、

点S は 点Tを中心として回転するものと考えます

点S を回転させるには以下の手順を踏めば実現できます。

  • 発射者B と ターゲットT のベクトルBT
  • ベクトルBTに垂直なベクトルU
  • このベクトルUをベクトルBTを軸にθ°回転させる

あとは前回と同じように 点S を求めるために外積を用います。

外積は以下の通りです。

外積とは2つのベクトルの双方に直角に交わるベクトルを求めることができる

数学の公式で

UnityのVecto3の関数に標準搭載されています

今回は詳しい式は省きます

それと今回はもう一つクォータニオンを用います。

クォータニオンとは回転を表現する方法の一つで、ベクトルを回転軸に回転させる手法です。

こちらも数学の概念ですが

Unityの回転表現として標準搭載されています

今回は詳細を省きます。

これらの材料をもとに実際に求めていきます。

今回の条件としては

  • 前回と同じように発射者B と ターゲットT のベクトルBT

 Unity上で表すとこのようなものになりますね

var dir = T.transform.postion - B.transform.postion;
  • rは 最小値r1と最大値r2で範囲指定されており。関係は以下のようになる

 r1 ≦ r ≦ r2

var r = (float)(new Random()(r1, r2));

最小値r1と最大値r2 はインスペクターで設定できるようにしておきます

  • ベクトルUは x°回転する

 xは 0 ≦ r ≦ 180 である

  • ベクトルBTに垂直でx°回転するベクトルU
// 対象に向ける
T.transform.LookAt(target.transform, Vector3.up);
var rot = (float)(new Random()(0, 180));
T.transform.rotation  = Quaternion.AngleAxis(rot, T.transform.forward);
var u = T.transform.up;

これで必要な材料は全て揃いました

これをもとに前回と同じように計算してみましょう

var s   = Vector3.Cross(T.transform.forward, T.transform.up).normalized * r

これで 点S が求められました。

あとはこの方向にビームを発射すればばら撒きビームの挙動が実装されます。

ここにアクセントとして、プレイヤーが動いた場合、rを縮める処理を入れれば、動いたときに

プレイヤーをそれとなく狙うようになります

まとめ

今回はばら撒きビームの挙動について紹介しました

なかなか、ボスによっては決死の判断を求められる良い挙動となりました

前回と同じようにUnityの標準機能で物理演算や数学の公式が用意されていますが

3Dの自作ゲームを作る場合には知識が必須なのでしっかり知識は蓄えていきましょう

あとは公開中ですのでぜひプレイしてみてください


コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
vuniformity誰でもない人
トレンドの行く末を見守っている
仮名を名乗るエンジニア

ゲーム開発は仕事であり趣味である
プログラムだけでなく多種多様なスキルを数多く持つ

ゲーム開発は
ソーシャルゲームを開発運用の経験アリ
ゲーム以外にも経験アリ
Webサービス保守開発等に携わる

ゲームプレイの主な戦場は
FGO
FEH
MTGA
マビノギ
ここでは主にunityroomで公開しているゲーム作り直しの軌跡を綴っていきます