ユニティ物理光線(Physics.Raycast)、衝突検出セクタ領域を達成するための3つの方法(参照神、音符のみ)

ユニティ物理光線(Physics.Raycast)は、ファン(扇形)衝突検出領域を達成します。
簡単なAIへの参照を行う前に:理解と簡単なプラグイン可能なユニティFSM(有限状態機械)が(プラグイン可能)AIのスクリプトオブジェクトです。
出典:GentleTank / PluggableAI /スクリプト/決定 / LookDecision.cs

この方法の一つ:

原則:(lookAngle / 2)/ lookAccurte

  非常に単純な、より多くのを撮影する光線の数平均角度。角度は、検出されたセクタ領域を調整するために、精度(光線の数)を設けてもよいです。各光線角度の合計夾角は2であり、その後精度で割りました。
  

1.放射線が0のデフォルト前方精度から出射されます。

 

 

2.より多くの二つの対向するフロント線45度となり、角度90、1の精度を設定します。

 

 

2の3セットの精度。

 

 

実装コード

//
// LookDecision
//


//放射線検出
プライベートBOOLルック(StateControllerコントローラ)
{
VARのdefaultStatsの=のcontroller.defaultStats。

//フォワード線
IF(前後参照(コントローラ、Quaternion.identity、Color.green))
真に戻ります。

//二つの平行線の複数の精度より、各光線の角度は、全精度で他の角度である
フロートsubAngle =(defaultStats.lookAngle / 2)/ defaultStats.lookAccurate;
I <defaultStats;(I = 0をint型のため.lookAccurate; Iは++)
{
IF(前後参照(コントローラ、Quaternion.Euler(0、-1 subAngle *(I + 1)、0)、Color.green)
||前後参照(コントローラ、Quaternion.Euler(0、subAngle * (I + 1)、0)、Color.green))
真に戻ります;
}

falseを返します。
}

//射出射线检测是否有プレーヤー
静的パブリックブール前後参照(StateControllerコントローラ、クォータニオンeulerAnger、カラーDebugColor)
{
Debug.DrawRay(controller.eyes.position、eulerAnger * controller.eyes.forward.normalized controller.defaultStats.lookRange、DebugColor );

RaycastHitがヒット。
(Physics.Raycast(controller.eyes.position、eulerAnger *のcontroller.eyes.forward、ヒットアウト、controller.defaultStats.lookRange)&& hit.collider.CompareTag( "プレーヤー"))の場合
{
controller.chaseTarget = hit.transform。
trueを返します。
}
falseを返します。
}

最終結果

90、精度:6、15キル角度精度2角度を探します。

 

 

  • 赤い敵タンクを探したときに放出された緑色の光線です。
  • 緑と赤の線はタンクが殺すことにあるときに放出されました。
  • 最初のデフォルトの線の青いタンクは敵を検出し、余分な光線の角度を追加する必要はありません。

     

     

    50精度殺すために:10の精度を探します。

  •  

     基本的にはファンが好きで、パフォーマンスが大幅に変更されませんでした。

  • 方法2:
      相対的な方法は、それは言った、州コード、だけでなく、メモリを節約することができます。欠点は、一方向にのみ各フレームのセグメント領域を検出することです。
      原理:つのみ光線、回転角度の各呼び出し有します。1秒が30に行く場合、それは、1秒に30回の角度を変更することができています。一般的には十分。実装するには非常に簡単です。角度がうまく取得するにはMathf.Repeatを使用してください。

    //
    // LookDecision
    //

    [範囲(0、360)]
    パブリック= 9OFフロート角; //フロント角度検出範囲
    [範囲(0、100)]
    公共距離= 25Fはフロートであり; //検出距離
    公共フロートrotatePerSecond = 90F; //第2の回転角

    //放射线检测
    プライベートBOOLルック(StateControllerコントローラ)
    {
    IF(前後参照(コントローラ、Quaternion.Euler(0、 -角/ 2 + Mathf.Repeat(rotatePerSecond * Time.time、角度)、0)、距離、debugColor))
    trueを返します。
    falseを返します。
    }

  •  

     実際に揺動され、上記X線画像。

  • 方法3:

      この方法は、最初の2つの利点と組み合わせることが、回転が同時に複数のラインを検出する、方法1及び2の組み合わせです。

      原理的には図2に示すように、すなわち同じフレーム検出複数のラインを、コードを変更する方法であって、循環追加の層、に基づいています。

  • [範囲(1、50)]
    公共フロート精度= 1F; //検出精度

    BOOLプライベート(StateControllerコントローラ)ルック
    {
    フロートsubAngle =角度/精度; //各光線角度の範囲を検出する必要がある
    (I ++は; I精度を<I 0 = INT)のために
    (前後参照(コントローラ、Quaternion.Euler(0、IF -角/ 2 + I + Mathf.Repeat subAngle *(* time.time rotatePerSecond、subAngle)、0)、距離、debugColor))
    trueに戻り、
    偽に戻ります;
    }

  •  

     

    説明:
    ブルータンク:赤い戦車の攻撃。タンクが同時に赤発光させることができる
    赤いタンクを:私はパトロールを再生するために誰かわからない、と4本の黄色線検出回転を解放し、各光線が検出された周囲エンド360°限り、90°回転します。
    グリーンタンク:(多くの場合のみ敵をキャッチするために、この1つの最初のフレームを攻撃する必要があるため)、毎回赤ラインの前に正の第1直接ゴールを敵を見つけ、他の一つは検出された放射線の回転です。
    イエロータンク:パトロール。三の緑、各光線30°の回転限り90°の検出角度を回転させながら。

おすすめ

転載: www.cnblogs.com/Damon-3707/p/11779192.html