ユニティ物理光線(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°の検出角度を回転させながら。