
13. Raycast の使い方
10-1. Raycast とは
カメラブロックには Raycast という機能があります。Raycast は、カメラから指定した方向と距離、または座標までの直線上にどのような物体 (Entity) が存在するかをスキャンする機能です。この機能を使えば、遠くにある物体が何であるかを知ることができます。ちなみにこの Raycast はプログラム中からしか使用することができない機能です。
10-2. 使い方
Raycast はスキャンする距離に比例した電力を必要とし、カメラにチャージした電力を消費します。カメラはアイドル状態で自動的に電力をチャージしてくれますが、このチャージ速度は 1 秒間のチャージで 2 km の距離を 1 回スキャンする量に相当します。ですので、10 km の距離を 10 回スキャンしたい場合には、50 秒分のチャージが必要となります。スキャン結果は、下に示す MyDetectedEntityInfo 型の構造体に格納され、これからスキャンした方向に何か物体は存在するのか、するならどのような物体であるかの様々な情報が得られます。
public struct MyDetectedEntityInfo
{
public readonly long EntityId; //物体の EntityId
public readonly string Name; //物体の属性が Friendly の場合は表示名、そうでない場合は一般的な識別子
public readonly MyDetectedEntityType Type; //物体の種類を表す列挙型
public readonly Vector3D HitPosition; //レイキャストが物体にヒットした座標
public readonly MatrixD Orientation; //検出された時の物体の向き
public readonly Vector3 Velocity; //検出された時の物体の絶対速度
public readonly MyRelationsBetweenPlayerAndBlock Relationship; //カメラのオーナーと物体の関係
public readonly BoundingBoxD BoundingBox; //物体のバウンディングボックス
public readonly long TimeStamp; //物体が検出された時刻 (msec)
public Vector3D Position //物体の座標(バウンディングボックスの中心)
public bool IsEmpty() //この構造体が空(意味のあるデータを含まない)であるかを判定
}
public enum MyDetectedEntityType
{
None = 0,
Unknown = 1,
SmallGrid = 2,
LargeGrid = 3,
CharacterHuman = 4,
CharacterOther = 5,
FloatingObject = 6,
Asteroid = 7,
Planet = 8,
Meteor = 9,
Missile = 10
}
public enum MyRelationsBetweenPlayerAndBlock
{
NoOwnership,
Owner,
FactionShare,
Neutral,
Enemies
}
次にカメラブロックがもつ Raycast 関連のプロパティ・メソッドを以下に紹介します。
bool EnableRaycast { get; set; }
このプロパティが true の時、スキャン可能距離がカウントアップされ、電力使用量が増加します。
double AvailableScanRange { get; }
最後にスキャンしてからの時間を元に、カメラがスキャンできる最大距離を返します。
float RaycastConeLimit { get; }
指定可能な pitch と yaw の最大角度を返します。
double RaycastDistanceLimit { get; }
指定できるスキャン最大距離を返します。-1 は無限を表します。
bool CanScan(double distance);
与えられた距離 distance をカメラがスキャン可能かどうかをチェックします。
int TimeUntilScan(double distance);
与えられた距離をスキャンできるようになるまでの時間 (msec) を返します。
MyDetectedEntityInfo Raycast(double distance, float pitch = 0, float yaw = 0);
pitch と yaw で指定した方向、distance の距離スキャンします。pitch と yaw は度数法(°)
MyDetectedEntityInfo Raycast(Vector3D targetPos);
与えられた座標 targetPos までスキャンします。
MyDetectedEntityInfo Raycast(double distance, Vector3D targetDirection);
与えられた方向へ、距離 distance スキャンします。
実際に Raycast を使うときのおおまかな流れは
-
EnableRaycast を true に設定し、チャージを開始
-
CanScan や AvailableScanRange などで目的とするスキャンが可能かチェック
-
可能であれば 3 種類ある Raycast メソッドのいずれかを使ってスキャンを実行
-
スキャンが成功したら、MyDetectedEntityInfo 構造体に格納されたデータを参照
といった感じです。Keen Software House の フォーラムに掲載されているサンプルコードを参考にしてみてはいかがでしょうか。