この記事では、Unityを使って青鬼風のゲームを作る方法を解説します。
プログラムや素材は記事内で紹介しますので、ぜひ参考にしてください。

📺 動画はこちら



↓↓続きを読む↓↓ をご覧ください 
 
にほんブログ村 IT技術ブログ ゲーム開発へ

1. スプライトフュージョンとアセットの準備

1.1 スプライトフュージョン

スプライトフュージョンは、マップチップを使った2Dタイルマップを作成できるサイトです
https://www.spritefusion.com/editor
gd_0422


Unityの2Dタイルマップは
パレットの作成・保存や編集などがちょっと使いづらかったので試してみました。

オートタイルの設定もできてすごく使いやすい!
今回はこちらを使ってマップを作っていきます。

スプライトフュージョンの使い方は動画の00:17から

マップの素材は「ドット絵世界」で配布されているのを使いました。

とくに解説の必要がないくらい、直感的に使えます。
gd_0425

左のタイルパレットから、タイルを選び
右のマップエリアに、タイルを配置していきます。

gd_0424

マップが完成したら、右上の「Export」ボタンを押すと
いろんなゲームの形式で書き出しすることができます。

Unityをクリックして、ユニティパッケージをダウンロードしましょう。
これでマップは完成です!

1.2 キャラのドット絵と追跡アセットのダウンロード

  • ドット絵の準備: 
今回使ったキャラクターの歩行グラはこちらを使用しました
UNK教団の野望

2. パッケージのインポートとマップの作成

2.1 プロジェクトの作成とパッケージのインポート

プロジェクトの作成は動画の3:39から

UnityHubを起動して、新しいプロジェクトを作成しましょう。

gd_0426


2Dゲームを作りたいので、Universal 2Dを選びました。
プロジェクトの名前や保存場所は自由に決めましょう。
ここではaooniという名前にしました。

gd_0427




プロジェクトが立ち上がったら、さっそくマップを表示しましょう。
上のメニューの
「アセット」→「パッケージをインポート」→「カスタムパッケージ」を選びます。

gd_0428


さきほどスプライトフュージョンからダウンロードしておいた
「map.unitypackage」を選択しましょう
gd_0429

インポートすると
「Assets」→「SpriteFusion」→「Maps」の中に
マップのプレハブが入っています。

これをシーンにドラッグして、マップを配置しましょう。

gd_0430


2.2 マップの表示

    マップの位置は小数点が出ないように、transformから調節しましょう。
    (ここではx-9・y6としましたが、マップによって座標はかわります)

    gd_0431

    2.3 レイヤーの設定

    ヒエラルキーの 「map」 の▼をクリックすると
    障害物(Obstacles)と地面(Ground)にわかれています。

    レイヤーを設定して、障害物だとわかるようにしましょう。

    Obstaclesを選択します

    gd_0432


    インスペクターの「レイヤー」をクリックして「レイヤーを追加」を選びましょう。

    gd_0433


    レイヤーの名前をつける画面が開きます。
    Obstacllesレイヤーを追加しましょう。

    gd_0434

    もういちど、ヒエラルキーから「Obstacles」を選択し
    レイヤーを「Obstacles」に設定しましょう。

    gd_0435

    これで、レイヤーの設定ができました。
    (動画ではGroundレイヤーも作ってましたが、使わなかったです)

    2.4 コライダーコンポーネントの取り付け

    キャラクターと壁が衝突するためには、コライダーが必要です
    Obstaclesのインスペクターから
    「コンポーネントを追加」をクリックし
    「Tilemap Collider 2D」を選びましょう。

    gd_0436

    これでマップの準備は完了です。


    3. プレイヤーの作成


    キャラクターの追加は動画の5:01から

    3.1 キャラクターのスプライトをスライス

    使いたいキャラクターのスプライトシートを
    Assetsフォルダにドラッグします。

    gd_0437

    Assetsフォルダに保存できたら、プレイヤーに使う画像をクリックし
    インスペクターを開きましょう。

    今回使うキャラクターは32*32ピクセルの画像なので
    1マスに32ピクセルで表示したいです。

    「単位毎のピクセル数」を32に設定しましょう。

    「スプライトエディターを開く」ボタンをクリックします。

    gd_0438

    スプライトエディターで、32ピクセルごとにキャラチップを分割しましょう
    「スライス」をクリックし
    タイプを「Grid By Cell Size」
    ピクセルサイズを「32*32」に設定します。

    「スライス」ボタンをクリックし、プレビューできれいに分割されていることを確認しましょう。

    gd_0439

    スプライトエディターの右上の「適用」ボタンをクリックすると、分割が適用されます。

    3.2 アニメーターコントローラーの作成

    アニメーションの切り替えを管理するコントローラーを作成しましょう。

    さきほど分割したキャラクターの画像をみてみましょう(ここではreimuの画像)
    ▶矢印ボタンをクリックすると、スプライトを分割した画像の一覧が表示されます。

    Ctrlキーを押しながら、前向きの歩行アニメーションのマップチップを選択し
    シーンにドラッグしましょう。

    gd_0440


    シーンにドラッグすると、アニメーションの名前を決めて保存する画面が現れます。
    このアニメーションは前向きのアニメーションなので、frontという名前にしました。

    gd_0441


    Assetsフォルダを確認すると
    frontというアニメーションと
    reimu_0というコントローラーが作成されました。

    コントローラーはわかりやすい名前に変更します。
    ここでは「walk」という名前にしました。

    gd_0442

    3.3 ソートレイヤーの設定

    マップの後ろにキャラクターが隠れてしまうので
    手前に表示するようにしましょう。

    ヒエラルキーからプレイヤーのキャラクターをクリックし
    インスペクターから
    Sprite Rendererの中の
    「「「ソートレイヤー」をクリックし「 Add Sorting Layer 」を選びましょう。

    gd_0443



    ソートレイヤーを設定する画面が開きました。
    「+」ボタンをクリックして新しいレイヤーを作成し
    Layer1 に Charという名前をつけましょう。

    gd_0444

    ヒエラルキーからもういちどプレイヤーのオブジェクトを選択し
    SpriteRendererのソートレイヤーを「Char」に変更しましょう。

    gd_0445

    インスペクターのTransformから
    グリッドにぴったりに表示されるように、座標を決めましょう。
    (ここではX0.5 Y-0.5にしましたが、マップによってかわります)

    gd_0446


    3.4 アニメーションの編集

    再生してみると、アニメーションが少し速すぎるようだったので調整します。
    Assetsから「walk」のアニメーターコントローラーをダブルクリックして開きましょう。

    gd_0447

    Assetsフォルダが表示されていたウィンドウに
    「アニメーター」タブが表示されました。

    frontのアニメーションをクリックしてインスペクターを開きましょう。

    gd_0448

    インスペクターから、アニメーションの速度を変更しましょう。
    ここでは速度を0.5にしました。
    (使用している画像によって速度はかわるので、自分の好きな速度にします)

    gd_0449


    3.5 他の向きのアニメーション

    前向きだけではなく、左向き・右向き・後ろ向きのアニメーションも作りましょう。

    前向きアニメーションと同じように、アニメーションに使用する画像を
    Ctrlキーで複数選択し、シーンにドラッグして名前をつけます。

    gd_0450


    アニメーションがほしいだけなので
    ヒエラルキーにできたオブジェクトは削除します。

    gd_0451

    同じように、アニメーターコントローラーも
    たくさんできてしまうので削除します。

    gd_0452


    次に、walkのアニメーターコントローラーを開き
    ほかのアニメーションクリップを登録しましょう。

    frontのアニメーションクリップをクリックし
    Ctrl+C Ctrl+Vでコピーします。

    gd_0453


    コピーすると、front 0 という名前のアニメーションができます。
    これをクリックして、インスペクターを開きましょう。

    名前を「Back」に変更
    Motionをクリックして、backのアニメーションを選択しましょう。

    これで、プログラムからPlay("Back")と命令すれば
    backのアニメーションを再生することができます。

    gd_0454


    同じようにアニメーションをコピーして
    Left ・ Right のアニメーションも登録しましょう。

    gd_0455


    これでアニメーターコントローラーは完成です。


    3.5 プレイヤーの当たり判定

    プレイヤーの当たり判定追加は動画の8:33から

    ヒエラルキーからプレイヤーを選択して、コンポーネントを追加しましょう。

    壁と衝突させるには
    Rigidbody2D(物理エンジン)とCollider2D(当たり判定)が必要です。


    インスペクターから「コンポーネントの追加」をクリックして
    Rigidbody 2Dを追加します。
    gd_0457

    見下ろし型の2Dマップなので、下に落ちないように重力を0にしておきましょう。
    重力スケールを0にします。
    gd_0460

    また、移動中に回転してしまうのをふせぐために
    Constraintsを開いて
    回転を固定 Z にチェックを入れましょう。

    gd_0464


    同じように、コンポーネントの追加から
    「Box Collider 2D」を追加します。

    gd_0458


    大きさ1のオブジェクトが、1のスキマを通るのはむずかしいので
    当たり判定をすこし小さくしておきます。
    今回はサイズを0.8にしました

    gd_0459


    これで、プレイヤーが壁に衝突するようになりました。


    3.7 プレイヤーの移動プログラム

    プレイヤーの移動プログラムは動画の9:15から


    プレイヤーにスクリプトを追加しましょう。
    コンポーネントの追加をクリックし、検索窓に「Player」と入力します。

    「New script」をクリックしましょう。
    gd_0461

    「作成して追加」ボタンをクリックすると
    Playerという空のスクリプトが追加されます。

    gd_0462

    インスペクターにスクリプトが追加されました。
    「Player」をダブルクリックしてエディタを開きましょう。

    gd_0463


    プレイヤーのプログラムはこんなかんじにしてみました

    これでプレイヤーの移動ができました。

    4. 追いかけてくる敵を作ろう

    4.1 プレイヤーをコピーして敵を作成

    敵キャラクターの作成波動がの12:23から


    ヒエラルキーでプレイヤーを選択して Ctrl+Dを押してオブジェクトを複製しましょう。
    複製したオブジェクトに好きな名前をつけます(ここではmarisaにしました)
    gd_0466


    Assetsの中の、敵キャラとして使用する画像をスライスしましょう。

    gd_0468

    インスペクターから
    単位毎のピクセル数を32に変更し
    スプライトエディターをひらきます。

    gd_0467

    スプライトエディターの「スライス」をクリックし
    タイプを Grid By Cell Sizeに
    ピクセルサイズを32*32にして「スライス」します
    gd_0469

    最後に「適用する」をクリックして、スプライトエディターを閉じましょう。

    4.2 テクスチャの差し替え

    敵キャラは、プレイヤーのオブジェクトをコピーしているので
    コンポーネントもコピーされています。

    敵きゃらのインスペクターを開きます。

    Playerのスクリプトはいらないので
    「・・・」から「コンポーネントの削除」を選びましょう

    gd_0470

    アニメーションをキャラごとに作るのは大変なので
    アニメーションはプレイヤーのものを流用し、テクスチャだけを変更する方法でアニメーションさせましょう。

    テラシュールブログに紹介されていましたので、このプログラムをそのまま使います。
    以下のリンクから、プログラムを保存しましょう。



    Assetsフォルダに、OverrideSpriteAnimationsTexture.cs
    のプログラムをドラッグします
    gd_0471

    Assetsに保存したプログラムを
    敵キャラクターのインスペクターにドラッグしましょう。

    gd_0472

    スクリプトに、テクスチャを設定する変数があります。
    ここに、敵キャラのテクスチャをドラッグして代入しましょう。

    gd_0473

    これで、敵キャラクターがアニメーションするようになりました。


    4.3 A*Pathfinding Projectを使おう

    アセットの使い方は動画の13:39から

    まず、上のメニューの
    アセット → パッケージをインポート → カスタムパッケージ
    を順にクリックし
    gd_0428


    ダウンロードしておいた、astarpathfindingprojectのユニティーパッケージをえらびましょう。
    全部インポートします。

    gd_0475


    つぎに、マップをサーチするためのオブジェクトを作成します。
    ヒエラルキーを右クリックして「空のオブジェクトを作成」をえらびます。

    gd_0476

    オブジェクト名はなんでもいいですが、ここでは「A*」という名前にしました
    gd_0477


    A*のインスペクターをひらき
    「コンポーネントの追加」から
    「Pathfinder」を追加しましょう。

    gd_0478


    Pathfinderから「Graphs」をクリックし
    Add New Graphから「Grid Graph」をえらびます。

    これでグリッドマップ(タイルマップ)のサーチができるようになります
    gd_0479

    Grid Graphの設定を行います。

    今回は2Dマップなので、2Dにチェックを入れましょう。
    Widthを18
    Depthを14にしました
    これはマップによって大きさがかわるので、自分のマップにあわせて大きさを変えて下さい

    gd_0480


    マップの大きさを入力すると
    シーンに赤いドットが現れるので、どこまでサーチしてくれるかがわかりやすくなっています。

    gd_0481


    キャラクターの移動を上下左右だけにしたいときは
    ConnectionsをFourにしておきましょう。(Eightだと8方向に移動できる)

    gd_0482

    下の方に行くと、コライダーの設定があります。

    Use 2D Physicsにチェックを入れ
    Diameterを0.8に設定します。
    Obstacle Layer Maskには壁のレイヤー(ここではObstacles)を設定しましょう。

    1のスキマに、1のキャラは通れないので
    プレイヤーと同じく0.8くらいのサイズにしましたが
    これは自分のゲームにあわせて設定してください

    gd_0484


    最後に、一番したの「スキャン」をクリックすると

    gd_0485


    シーンのマップが、通れるところと通れないところにわかれました。
    青いエリアが通れるところ、赤いドットが障害物です

    gd_0486


    4.4 追いかけてくるキャラの設定

    敵キャラクターが追いかけてくるスクリプトを追加しましょう。
    ヒエラルキーから敵キャラクターを選択し、インスペクターを開きます。

    コンポーネントの追加から
    「Seeker」のスクリプトを選びます。
    おいかけルートをきめるスクリプトです

    gd_0487

    作成したルートを、かっちりと移動してほしいときは
    Seekerの「Start End Modifier」をクリックし

    Start Point Snapping を Node Connectionに
    End Pint Snapping を Node Center(Snap To Node)

    に設定しましょう。
    gd_0493



    つぎに
    「AI Distination Setter」も追加します。
    これはターゲットを決めるためのスクリプトです

    gd_0488

    AI Distination Setterの
    「Target」に追いかけてほしいキャラクター(ここではReimu)を設定しましょう

    gd_0489

    次に、キャラクターの移動方法をきめるスクリプトを追加します。
    コンポーネントの追加から「AILerp」を選びましょう。

    gd_0490


    同じ移動プログラムで、AIPathというスクリプトもあります。
    AIPathは、物理演算をつかって自然なカンジに
    AILerpは、Lerp(線形補間)を使ってパスに沿って移動
    みたいなイメージです。かっちり移動してほしいのでLerpを選びました


    AILerpの設定で
    Speedで、追いかけるスピードを設定しましょう。(好きなスピードにしてね)
    Enable Rotationのチェックを外すと、敵キャラが回転しなくなります。

    gd_0492


    再生して、シーンを見てみると
    どんなルートで追いかけてくるかを見ることができます。
    ちゃんとマス目に沿って移動してくれていますね。
    gd_0494


    4.5 敵キャラのアニメーション


    敵キャラのアニメーションは動画の16:44から


    最後に、敵キャラが進行方向にあわせてアニメーションするようにしましょう。

    敵キャラのコンポーネントの追加から
    「Enemy」という名前で新しいスクリプトを追加しました。

    gd_0495

    追加されたEnemyのスクリプトをダブルクリックして
    エディタで開きましょう。
    gd_0496


    こんなスクリプトにしました


    これで、キャラクターが進行方向を向くようになりました
    gd_0497


    5. 一定時間後に敵が出現

    敵キャラを非アクティブにしておき
    コルーチンで一定時間まったあとに、アクティブにすることにしました。

    シーンに、空のオブジェクトを用意して
    gd_0498

    スクリプトを追加します。
    Spawnerという名前にしました
    gd_0499

    めっちゃカンタンなプログラム


    プログラムができたら
    インスペクターからEnemyを設定しましょう。
    (ここではMarisaを設定)

    gd_0500


    これで、5秒後に敵キャラがでてくるようになりました。

    6. さいごに

    これで敵キャラ追跡プログラムは完成です
    A*PathFindingは高性能で、設定項目があって大変ですが
    なれると使いやすいみたいなので
    興味がある人は使ってみて下さいね!

    A*PathFinding Projectのドキュメントはこちら

    3Dもほとんど同じオペレーションで追いかけてくる敵が作れます!