top of page

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 を使うときのおおまかな流れは

 

  1. EnableRaycast を true に設定し、チャージを開始

  2. CanScan や AvailableScanRange などで目的とするスキャンが可能かチェック

  3. 可能であれば 3 種類ある Raycast メソッドのいずれかを使ってスキャンを実行

  4. スキャンが成功したら、MyDetectedEntityInfo 構造体に格納されたデータを参照

 

といった感じです。Keen Software House の フォーラムに掲載されているサンプルコードを参考にしてみてはいかがでしょうか。


 

bottom of page