Unityに関連する記事です

 ステージシーンにターン機能を実装します。
 この機能を実装することにより、プレイヤーの手番とエネミー側の手番が交互に入れ替わるようになります。
入れ替わるタイミングは移動後です。プレイヤーが1マス移動すると、エネミー側の手番になり、各エネミーが1マスだけ移動するようになります。
すべてのエネミーの移動が終了すると、プレイヤーの手番に戻ります。これをサイクル化して、ゲーム内で繰り返し処理が行えるようなロジックを考えて実装します。


<実装動画>
動画ファイルへのリンク



設計


 複数のクラスに処理がまたがっているので、呼び出すメソッドや変数が用意していないと、その部分にエラーがでます。
そのため、4つのスクリプトを全部書き終わると消えます。
SymbolBase の修正をしてから、SymbolManager → Stage → MapMoveController の順番が一番エラーがでないと思います。


 処理のロジックは、
1.Stage の Start メソッドから処理が始まるように設定し、そこから、StageGenerator や SymbolManager 、MapMoveController にそれぞれ命令がいって
ステージのタイルを作り、シンボルを配置し、シンボルやプレイヤーの初期設定をします。

 Stage クラスには、ターン管理用の enum を新しく作成します。

    public enum TurnState {
        None,
        Player,
        Enemy,
        Boss
    }

    private TurnState currentTurnState = TurnState.None;

 currentTurnState 変数が、現在のターンの進行状態を表します。



2.その後、ターンのステートがプレイヤーになって、キー入力が許可されます。

 いままで移動は自由にできていましたが、それは、IsMoveing 変数によって制御されていました。
そのため、この変数が許可を出さない限りは、プレイヤーのキー入力は受け付けなくなるようになっていますので、
それを利用して、ターンを作ります。

 プレイヤーが1マス移動すると、移動後に以前はすぐに IsMoveing 変数が false になり、次のキー入力を受け付けていたので、
まず、これをすぐに false にしないようにします。
 この制御により、プレイヤーは、キー入力1回につき移動1回という制限がかかります
これをプレイヤーのターンとして考えます。

3.MapMoveControoler クラスの DOMove メソッドの OnComplete メソッド内で、いままで IsMoving 変数を false にしていた部分で、代わりに、Stage クラスの ObserveEemyTurnState メソッドを実行します。
  これがエネミーのターンの開始です。 

 この ObserveEemyTurnState メソッドはコルーチンメソッドなので、メソッド内において、処理の中断が行えます。
これを利用して、SymbolManager クラスの EnemisMove メソッドを実行する際、すべてのエネミーの移動が終了するまで、次の処理を中断する処理を実装しています。

4.SymbolManager クラスの EnemisMove メソッドを yiled return 付の StartCoroutine メソッドで実行し、エネミーの移動を1体ずつ行います。
  この処理により、すべて移動が終わるまで、下の処理にはいかないようにしています。

 こうすることで、エネミーの移動中に他の処理が動きだすことを制御しています。



 エネミーの移動完了後、エネミーのシンボルに接触していた場合には、このタイミングでバトルへの遷移を行います。
ここもいままでと違う部分です。以前は、シンボルに侵入した瞬間にバトルに遷移していました。

 エネミー以外のシンボルは、シンボルに侵入した際にすぐに TriggerSymbol メソッドを実行します。これは今まで通りです。
エネミーの場合は、すぐにバトルへの遷移を行ってしまうと、他のエネミーのシンボルの移動が完了しなかったり、
複数のエネミーのシンボルとエンカウントしてしまったりという不具合を生じさせます

 これを防ぐために、エネミーのシンボルの処理のみ、エネミーの移動が完了してから、バトルへの遷移処理を実行します。
この機能は、UnityEvent という機能を利用しています。

  MapMoveController 200行目
  
  // シンボルのイベントを登録して予約し、すべてのエネミーの移動が終了してから実行
  enemySymbolTriggerEvent = new UnityEvent<MapMoveController>();
  enemySymbolTriggerEvent.AddListener(symbolBase.TriggerSymbol);

 この UnityEvent の機能を使うことで、事前に実行したいメソッドを変数に登録しておいて、
エネミーの移動後に、登録されているメソッドがある場合のみ、エネミーとのバトルを発生させるようにしています。

 そのため、SymbolBase クラスで TriggerSymbol メソッドを実行した際、最後にシンボルを破壊する DestroySymbol メソッドを実行していましたが
エネミーと、エネミー以外のシンボルとで TriggerSymbol メソッドが実行されるタイミングが異なるため、
TriggerSymbol メソッドで強制的に DestroySymbol メソッドは実行しないように処理を変更しています。



 上記の4つのクラスが完成したら、エネミー用のシンボルの処理を修正します。
ここには新しく、エネミーを移動させる処理などが追加されています。

 SymbolManager クラスには上記の変数を追加して、Grid_Collsion ゲームオブジェクトの子オブジェクトの TileMap ゲームオブジェクトをアサインしてあります。
これは、エネミーが移動する際に、コライダーのついているタイルには侵入できないように判定するために利用するからです。
Ray が判定できるように、エネミーのシンボルには新しく Symbol レイヤーを作成して、設定しておきます。





5.エネミーとのバトルがない場合は、Stage クラス内の CheckTurn メソッドを実行して、ターンを切り替えます。
  移動回数がのこっていなければ、ボスとのバトルに強制的になります。
  移動回数がのこっている場合には、再度、プレイヤーのターンになります。
  エネミーとのバトルがあった場合には、OnEnable メソッド内で、CheckTurn メソッドを実行し、ターンの切り替えを行います。 

 以上が、今回導入するターンの機能の処理の流れになります。


SymbolBase



SymbolBase.cs

<= クリックすると開きます



SymbolManager



SymbolManager.cs

<= クリックすると開きます




 spriteMAskTran 変数には CM vcam ゲームオブジェクトの子オブジェクトの SpriteMask をアサインします。


インスペクター画像




 tilemapCollider 変数には Grid_Collison の Tilemap をアサインします。


インスペクター画像





Stage





Stage.cs

<= クリックすると開きます


 スクリプトを記述したらセーブします。


MapMoveController



MapMoveController.cs

<= クリックすると開きます





EnemySymbol



EnemySymbol.cs

<= クリックすると開きます

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます