プログラムコンテンツへスキップはじめてプログラムプログラミング初心者向けチュートリアルやUnity5やC#の記事を書いています。attacks)」でUnityのナビゲーションの使い方がわかりましたが、いくつか計算方法が理解できなかったので、今回も小さなプロジェクトを作成して、再学習しました。敵がプレイヤーに移動する方法これはUnityのナビゲーションを使えば簡単です。GetComponent<NavMeshAgent>();で変数に保持して、agent.SetDestination(座標);で、敵が障害物を交わしながら移動するようになります。Colliderを無効にした場合には、プレイヤーの中心座標が、ナビゲーションの到達位置なので、プレイヤーに埋まってしまいます。Colliderが無効なため、敵が埋まってしまう例もちろんColliderを有効にしている場合は正しく衝突します。ゲームでは、体当たりする敵もいますが、プレイヤーの至近距離まで来て、武器や魔法を振り回すような敵もいます。このような場合、何らかの方法で一定の距離を保つ計算が必要になります。一定の距離を保つ方法C#agent.SetDestination(targetPosition);1agent.SetDestination(targetPosition);先ほどのソースコードでは、ターゲットの中心位置なので、ターゲットに埋まってしまいました。衝突判定の半径を考慮すればよいです。(自分の半径+ターゲットの半径)で、自分とターゲットの半径の長さ分の向きベクトルが求められる。元々のターゲット座標から、この長さのベクトルを引けば、ターゲットに重ならない。マージンとしてattackDistanceThresholdを用意している。(自分の半径+ターゲットの半径)で、自分とターゲットの半径の長さ分の向きベクトルが求められる。元々のターゲット座標から、この長さのベクトルを引けば、ターゲットに重ならない。マージンとしてattackDistanceThresholdを用意している。WaitForSeconds(.5f);}}紫の敵が、赤のプレイヤーに接触せずにとどまるこの仕組みは、Unityに限らずシューティングゲームやもっと単純なゲームでもオフセット計算などでよく使われます。ターゲット座標-offsetをしているだけです。先ほどやりかたで敵が一定距離まで近づくようにできました。敵が攻撃する方法も同様で、さらに手前の範囲で攻撃を繰り出すようにします。成り立ったら攻撃を開始するようにします。平方根を回避してパフォーマンスをよくする数学では、二点ABの長さを求めるには、三平方の定理によりA*A+B*B=C*Cの平方根を求めます。先ほどの「距離A<距離B」のように2つの長さを求めて比較する場合は、2回平方根の処理をしなければなりません。小数点の平方根を求める処理は重たい処理なため出来れば避けたいです。距離B*距離B」として、二乗のままで計算します。攻撃開始の距離の二乗このテクニックを使うためにUnityではsqrMagnitudeが用意されていて、ベクトル型(Vector3)から二乗の値が簡単に取得できます。現在のターゲットと自身の距離の二乗。現在のターゲットと自身の距離の二乗。transform.position).sqrMagnitude;この二乗のまま計算するテクニックを知っていないと、.sqrMagnitudeが出てきたり、Mathf.Pow(長さ、2)が出てくる意味が理解できません。これはパフォーマンスのためであって、本来は2つの長さの比較をしたいだけです。Time.timeはゲーム開始からの秒。距離を比較するときは、平方根(Mathf.Sqrt)のコストが高いので、距離の二乗通しを計算することで、パフォーマンスをあげる。現在のターゲットと自身の距離の二乗。Time.timeはゲーム開始からの秒。距離を比較するときは、平方根(Mathf.Sqrt)のコストが高いので、距離の二乗通しを計算することで、パフォーマンスをあげる。現在のターゲットと自身の距離の二乗。Lagueさんの仕組みは、Unityだけではなくいろんなゲームで使える方法です。Unityの場合ゲームオブジェクトの子要素を用意し、そこにColliderを持たせ、IsTriggerにより、トリガーイベントで、衝突判定が可能になります。この方法はUnityに依存しますが、これで攻撃判定をすると簡単にできそうな気がします。まとめ計算方法はわかってしまえば大したことはありませんが、以下のようなコードが出てきたときに方向を求めているのが分からず、なぜ.normalizedがあるのかなどをきにしていました。transform.position).normalized;またソースコードでいろいろ試す際に、衝突の半径で変数を使わず数字をハードコーディングしたり、半径の変数を削除したりすることで、理解を深めることができました。over)をやってみました。generator)をやってみました。navigation)をやってみました。Unity5でJointを使ってみます。effects)をやってみました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。brush)を作成するミニゲーム「どうぶつバスケット」を作りました。UnityのFlappyBirdStyleチュートリアルをやってみた感想。over)をやってみました。generator)をやってみました。navigation)をやってみました。Unity5でJointを使ってみます。effects)をやってみました。最近の投稿CocosCreator2.0で廃止(Deprecated)されたもの。60行でタイピングゲームを作ろう!Python3+Tkinterでタイピングゲームを作ってみました。PythonでSetIntervalとSetTimeoutと同じようなことがしたい。