Skip to content

Latest commit

 

History

History
441 lines (283 loc) · 15.9 KB

File metadata and controls

441 lines (283 loc) · 15.9 KB

リファレンス

起動シーン

Assets/Scenes/Game.unityを開いてゲームを実行してください。
実行後は、スペースキーでゲームを進行できます。

ゲームパッド操作

操作したい戦車の、ComPlayerBaseを継承したクラスのUpdate関数内に
SXG_TestPlayByGamepad();と記述すると、ゲームパッドでゲームをプレイできます。
操作方法は、 『ゲームパッド操作方法』 を確認してください。

戦わせる戦車の変更

ゲーム実行時、Assets/GameAssets/Data/ParticipantList.assetのリストの、上から4つの戦車が戦います。
戦わせる戦車を変更したい場合は、リストの順番を並べ替えてください。

image

サンプルAI解説

弊社が用意したサンプルAIの情報を記載しています。

使用できる関数

コーディング時に使用できる関数の一覧です。

戦車のカスタマイズ方法

Prefabの編集モードで、自身の戦車に砲塔や装甲を着けてカスタマイズできます。
カスタマイズ方法については、戦車のカスタマイズ方法をご確認ください。

砲塔や装甲の装着には「コスト」がかかり、それらの合計が1台の戦車を出撃させるのに必要なコスト「出撃コスト」となります。
各プレイヤーは1試合 1000コスト分 までの戦車を出撃できます。
つまり、出撃コストが200の場合、1試合の出撃可能回数は5回となります。
また、何もつけていない初期状態の場合の出撃コストは100です。

ゲームルール

1試合の所要時間は最大2分。
2分が経過するか、最後の1台になったとき試合終了。
 

戦車カスタマイズで砲塔をつけると砲弾を発射できる。
砲弾の発射には0.5秒のクールタイムがある。
 

シールドが表示されている2秒間は無敵状態。
自身の砲弾の発射も不可。

image

 

砲弾が戦車のコア部分(緑色のコリジョン部分)に当たると戦車は撃破される。
撃破されても残機が残っていれば復帰。

image

 

戦車を撃破すると、撃破した戦車の出撃コスト分のポイントを獲得。

image

 

戦車に装甲をつけていれば砲弾が当たっても耐えられる。
装甲の耐久値が無くなると、その装甲は戦車から剥がれ落ちる。
装甲の耐久値は、装甲の体積(コスト)に比例する。

image

 

ステージ中央付近の障害物(岩)に砲弾を当てると、障害物が少しずつ沈んでいく。

image

 

ステージ外に落下した戦車は大破する。
大破しても残機が残っていれば復帰。
 

リザルトで、試合終了時の残機×出撃コスト分の残機ボーナスを獲得。

image

 

リザルトで総得点が高かった戦車の勝利!

image

   


 

サンプルAI解説

ルッカちゃん(Assets/Participant/Sample01)

Sample01

  • 出撃コスト :254 pts
  • 出撃可能回数:3回
  • 砲塔数   :2基
  • 回転部位  :0基
  • 装甲数   :5基
  • 戦車質量  :1520 kg

左右と後ろにシールドを設置、かつ、後ろは反動を抑えるための形状で設置。
ステージをグルグルと周回することを目指して全速力で移動。
攻撃対象は生存していて自分から最も近い敵を1つ。
発射はランダムの時間間隔を開けて左右交互に発射。


Xアーマー(Assets/Participant/Sample02)

Sample01

  • 出撃コスト :295 pts
  • 出撃可能回数:3回
  • 砲塔数   :1基
  • 回転部位  :0基
  • 装甲数   :3基
  • 戦車質量  :1725 kg

左右に厚めのシールドを設置。
ステージ中央を除くランダムな位置を目指して全速力で移動。
移動できなくなったら(何かに引っかかってるなら)射撃することで反動を得て移動できる状態にすることを目指す。
攻撃対象はランダムで選択。
ランダムな時間間隔を開けて発射。


やったるぞ!(Assets/Participant/Sample03)

Sample01

  • 出撃コスト :336 pts
  • 出撃可能回数:2回
  • 砲塔数   :2基
  • 回転部位  :0基
  • 装甲数   :8基
  • 戦車質量  :1930 kg

前後左右にシールドを設置。左右には剣のモデルを配置、後ろは盾をあしらう。
ステージをグルグルと周回することを目指して全速力で移動。
攻撃対象はランダムで選択。
移動できなくなったら(何かに引っかかってるなら)射撃することで反動を得て移動できる状態にすることを目指す。
発射はクールタイムが明けたらすぐに発射。
とにかく、撃てるだけ撃つ。


アナグマ(Assets/Participant/Sample04)

Sample01

  • 出撃コスト :385 pts
  • 出撃可能回数:2回
  • 砲塔数   :1基
  • 回転部位  :0基
  • 戦車質量  :2175 kg

周囲6方向に薄めを3枚重ねたシールドを設置して全方向からの攻撃を防御することを目指す。
行動は、ルッカちゃん(Sample01)と同じ。


コスト500君(Assets/Participant/Sample05)

Sample01

  • 出撃コスト :500 pts
  • 出撃可能回数:2回
  • 砲塔数   :2基
  • 回転部位  :0基
  • 装甲数   :16基
  • 戦車質量  :2750 kg

前、左右に4枚重ねのシールを設置して防御を厚く、上面にも盾を配置、後ろは反動を抑える形でシールドを設置。
行動は、ルッカちゃん(Sample01)と同じ。


アメンボ(Assets/Participant/Sample06)

Sample01

  • 出撃コスト :327 pts
  • 出撃可能回数:3回
  • 砲塔数   :2基
  • 回転部位  :8基
  • 装甲数   :9基
  • 戦車質量  :1885 kg

回転パーツを使って長ーい4つの足を再現。
試合が始まったら立ち上がり、上空から他の戦車を狙う。
4つの足で立ち上がっているので、キャタピラを使った移動はしない。
攻撃対象は一番近い戦車。
2つの砲塔からは常に同時に発射することで、姿勢を崩しにくく、かつ、反動で少し浮きがることもできることがある。


阿修羅(Assets/Participant/Sample07)

Sample01

  • 出撃コスト :411 pts
  • 出撃可能回数:2回
  • 砲塔数   :1基
  • 回転部位  :4基
  • 装甲数   :10基
  • 戦車質量  :2305 kg

回転パーツを使って3つの盾と1つのバランサーを操る。
移動先は、他の戦車からなるべく離れたところを目指して移動。
3つの盾は、生存している敵のそれぞれの方向に常に向けることで、シールドを効果的に機能させる。
バランサーは本体の姿勢が崩れているときにそれを正す方向に回転させて、本体が倒れてしまうことを回避することを目指す。
攻撃対象は自分から最も近い敵で、クールタイムがあけたら可能な限り発射する。


たこねこ(Assets/Participant/Sample08)

Sample01

  • 出撃コスト :166 pts
  • 出撃可能回数:6回
  • 砲塔数   :1基
  • 回転部位  :0基
  • 装甲数   :16基
  • 戦車質量  :1080 kg

コストを最小限に抑え、装甲パーツはコリジョンを囲うように配置して即死を免れる。
特に目的地はなく、左右にくねくねと移動。
砲塔は常に一番近くにいるプレイヤーを狙い、撃てるタイミングで撃つ。


Sample01

  • 出撃コスト :316 pts
  • 出撃可能回数:3回
  • 砲塔数   :4基
  • 回転部位  :0基
  • 装甲数   :4基
  • 戦車質量  :1830 kg

ステージ中心をうろつきながら4方向に向かって大砲を発射する、固定砲台風戦車AI。


使用できる関数

SXG_GetCountOfMyTurrets

int SXG_GetCountOfMyTurrets();

自分の戦車の砲台の数を取得します。


SXG_GetCountOfMyRotJoints

int SXG_GetCountOfMyRotJoints();

自分の戦車の回転ジョイントの数を取得します。


SXG_GetHitObstacles

Vector3[] SXG_GetHitObstacles(float searchLength);

  • searchLength : 探索距離(半径)

自分の戦車を中心に、周囲の障害物(岩)の座標を取得します。
ステージ中央の大きな岩に加え、ステージ外周の岩も1メッシュずつ取得します。

image


SXG_SetCaterpillarPower

void SXG_SetCaterpillarPower(float left, float right);

左右のキャタピラを回転させます。
それぞれ -1 ~ 1 で、マイナスは後進、プラスは前進です。
範囲外の数値を入れるとクランプされます。


SXG_Shoot

void SXG_Shoot(int turretNo);

砲塔番号を指定して砲弾を発射します。
範囲外の番号を指定するとアサーションが発生します。


SXG_CanShoot

bool SXG_CanShoot(int turretNo);

砲塔番号を指定して、砲弾を発射可能かどうかのフラグを返します。
範囲外の番号を指定するとアサーションが発生します。
クールタイムが考慮されます。
戻り値がtrueだと発射可能です。


SXG_RotateTurretToDirection

void SXG_RotateTurretToDirection(int turretId, float yawDir, float pitchDir);

  • yawDir : 左右の旋回:-1 ~ +1:右方向がプラス、左方向がマイナス
  • pitchDir : 上下の旋回:-1 ~ +1:下方向がプラス、上方向がマイナス

砲塔番号を指定して、ヨー、ピッチの回転方法を指定して砲塔を旋回させます。
範囲外の番号を指定するとアサーションが発生します。
砲塔の回転速度には上限があるため、大きな値を指定すると即座に反映はされません。


SXG_RotateTurretToAngle

void SXG_RotateTurretToDirection(int turretId, float yawDir, float pitchDir);

  • yawAngle : 左右の旋回:戦車の正面が0度:右方向がプラス、左方向がマイナス
  • pitchAngle : 上下の旋回:戦車の正面が0度:下方向がプラス、上方向がマイナス

砲塔番号を指定して、ローカル角度(ヨー、ピッチ)を指定して砲塔を旋回させます。
範囲外の番号を指定するとアサーションが発生します。
砲塔の回転速度には上限があるため、大きな値を指定すると即座に反映はされません。


SXG_RotateTurretToImpactPoint

void SXG_RotateTurretToImpactPoint(int turretId, Vector3 impactPoint);

砲塔番号を指定して、着弾予定座標を指定して砲塔を旋回させます。 範囲外の番号を指定するとアサーションが発生します。


SXG_RotateJointToDirection

void SXG_RotateJointToDirection(int jointId, float yawDir);

  • yarDir : 左右の旋回:-1 ~ +1:右方向がプラス、左方向がマイナス

ジョイント番号を指定して、ジョイント関節の回転方法を指定して砲塔を旋回させます。   範囲外の番号を指定するとアサーションが発生します。


SXG_RotateJointToAngle

void SXG_RotateJointToAngle(int jointId, float yawAngle);

  • yarAngle : 左右の旋回:戦車の正面が0度:右方向がプラス、左方向がマイナス

ジョイント番号を指定して、ローカル角度(ヨー、ピッチ)を指定してジョイントを旋回させます。
範囲外の番号を指定するとアサーションが発生します。


SXG_GetPositionAndRotation

SXG_GetPositionAndRotation(out Vector3 position, out Quaternion rotation);

自身の戦車のワールド座標と角度を取得します。
transform.position や transform.rotation は使用せず、こちらの関数を使用してください。


SXG_GetAllTanksInfo

TankInfo[] SXG_GetAllTanksInfo();

自身を含む、全戦車(4台)の情報のリストを取得します。
戻り値の0番目の要素には自身の戦車の情報が入っています。

    // 戦車の情報 構造体
    public struct TankInfo
    {
        public Vector3 Position;    // 戦車の座標 
        public Quaternion Rotation; // 戦車の向き
        public int Energy;          // チームの残りエナジー 
        public int CostOfOneTank;   // 戦車1台分のコスト 
        public bool IsDefeated;     // 敗退済みフラグ
        public bool IsInvincible;   // 無敵フラグ
    }