ActionStreetMapを使って自分の住んでいる街で戦う

ActionStreetMapのデモを改造して、好きな街で戦えるようにした。

改造の手順を簡単にまとめておく。

環境は以下の通り。

マップ

好きな街の3Dモデルを生成する。手順は以下のエントリーで書いた通り。

ActionStreetMapを使って自分の住んでいる街をUnityで再現する

プレイヤーと弾

デモのプロジェクトはサードパーソンビューで戦車が操作できるようになっている。ここでは、ファーストパーソンビューで移動や攻撃ができるように変えていく。

プロジェクトにはすでにFirst Person Controllerが読み込まれているので、プレイヤーをあらわすオブジェクトとしてシーンに配置する。

シーンにあるPlayerTankを参考に、プレイヤーオブジェクトに必要なコンポーネントを追加する。具体的には、ActionStreetMapのデモのエントリポイントとしてActionStreetMapBehaviorを追加する。

次に、攻撃の仕組みを実装する。デモのプロジェクトはマウスクリックで戦車から弾が撃てるようになっているので、これを再利用する。射撃のコードはPlayerTankControllerを参考にする。弾はPrefabのBulletを使う。プレイヤーオブジェクトには弾の発生起点としてSpawnPointオブジェクトを追加する。

何もない空間から弾が発生するのは味気ないので、プレイヤーオブジェクトには銃の3Dモデルを追加する。以下のアセットを使った。

Asset Store - Modern Weapons Pack

敵とAI

敵の3Dモデルを用意し、アニメーションとAIを設定する。

3Dモデルは以下のアセットを使った。アニメーションも付属している。

Asset Store - FT_CaveWorm

Mecanimでアニメーションの設定をする。デフォルトではアニメーションタイプがLegacyになっているため、Mecanimで使えない。Mecanimで使えるように、Assets\FT_CaveWorm\FBX\CaveWorm_animを選択し、RigメニューのAnimation TypeをGenericに変えてApplyする。

Mecanimで使う場合、FT_CaveWormに付属しているIdleWalkはそのままではループしない。ループ用のモーションを作るためそれぞれをDuplicateし、Loop Timeにチェックを入れる。

Animator Controllerを作成してモーションと遷移条件を設定し、敵オブジェクトに追加する。元からついているAnimationは削除する。

AIにはUnitySteerを使う。UnitySteerは追跡や群れによる行動を簡単に実装できるライブラリ。ドキュメントが少ないが、サンプルプロジェクトが参考になる。Raderを使う場合には、Layers Checkedが適切に設定されていることを確認する。

敵オブジェクトにアニメーションとAIが設定できたらPrefab化し、スポーン用のオブジェクトを作成する。

建物の破壊

デモのプロジェクトには建物を破壊するためのスクリプトDestroyableObjectが含まれている。DestroyableObjectは街の3Dモデルが生成されるとき建物オブジェクトに対して自動的に追加されるが、建物のMesh Colliderとの階層がずれていてうまく動かない。

場当たり的ではあるが、デモのソースコードに手を入れて修正する。

--- a/Assets/Scripts/Character/DemoBootstrapper.cs
+++ b/Assets/Scripts/Character/DemoBootstrapper.cs
@@ -26,7 +26,7 @@ namespace Assets.Scripts.Character
             // TODO add ability to register object without this trick
             _solidModelBehavior = new CompositeModelBehaviour("solid", new Type[]
             {
-                typeof (DestroyableObject),
+                typeof (MyCityBuilding),
                 typeof (LocationInfoHolder),
             });
using UnityEngine;
using System.Collections;
using Assets.Scripts.Map;

public class MyCityBuilding : MonoBehaviour
{

    void Start()
    {
        foreach (Transform child in transform)
        {
            child.gameObject.AddComponent<DestroyableObject>();
        }
    }

}

雰囲気を出すため、SkyboxとAmbient Light, Fogを設定する。Skyboxには以下のアセットを使った。

Asset Store - Skybox Volume 2 (Nebula)

実行

東京スカイツリーをバックにモンスターと戦えるようになった。