デッキ構築型カードゲームの作り方5 カードを配る・デッキからドローする処理の実装 | Unity入門の森 ゲームの作り方

デッキ構築型カードゲームの作り方5 カードを配る・デッキからドローする処理の実装

Unity 本格カードゲームの作り方 ハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」を作る


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

この記事はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第5回です。

前回では、戦闘に使うカードを手札やフィールド間でドラッグ&ドロップしたり、変な場所で手を離した場合にカードを手札の元の位置に戻すカード操作の実装を行いました。

前回の記事:

Unity カードゲームの作り方4 手札カードを実装&タップして場にカードを出す
この記事はデッキ構築型ハクスラローグライクカードバトルゲーム「呪術迷宮」の作り方講座の第4回です。 前回はカードオブジェクトのUIを作成しました。今回はカードをタップして移動させたり、手札からフィールドにカードを出すための機能を開発します。...

カードバトルの戦闘システムを開発する前にまだまだ準備しておかなければならないことがあります。

今回はターン開始時の処理として、プレイヤーが決まった枚数だけ手札を補充するという山札からのカードドローシステムを作っていきます。


【Line登録者限定のプレゼントもあるよ!】

UIを整列させるLayout Groupの設定

UIオブジェクトを規則的に整列させたいという場合、エディター上で座標を手入力したりスクリプトで座標を計算して反映させる等といった方法もあるのですが、今回はUnityで用意されているLayout Group系のコンポーネントを使用してみましょう。

Layout Groupと名の付く整列用コンポーネントは3種類あります。いずれも子のUIオブジェクト全てに対して影響を与えます。

Horizontal Layout Group X軸上のUIを整列させる
Vertical Layout Group Y軸上のUIを整列させる
Grid Layout Group 四角いマスの並びにUIを整列させる

今回、手札のカードは横方向に並ばせたいのでHorizontal Layout Groupを使用します。Handsオブジェクト内に新規コンポーネントとして追加しましょう。

まだ子オブジェクトが存在しないため何の変化もありませんが、試しにCardプレハブをHandsオブジェクト以下に複数配置してみると…

1つ1つオブジェクトの座標設定をしなくても自動的に位置を揃えてくれていることが確認できます。

 

しかしこの確認で分かる通り、左側に寄せるような整列の仕方になってしまっているためHorizontal Layout Groupの設定を変更して中央に寄せる形にしましょう。主に変更することが多い設定項目は以下です。

Padding 領域の端からの(各方向ごとの)距離を離す
Spacing 子UIのそれぞれの距離
Child Alignment 整列の位置(始点)。Upper Leftなら左上が始点になりMiddle Centerなら中央が始点になる。
Child Force Expand 領域内に隙間がある時、子UIを隙間なく始点から詰めるか領域いっぱいに等間隔に分散させるかの設定

今回はUIを中央揃えにしたいので、Child Alignmentの設定をMiddle Centerに変更します。

中央を始点にUIが整列されていることが確認できたら、確認用の子オブジェクトは全て削除しましょう。

ダミー手札オブジェクトを作成 カードをはみ出さないように重ねて持つ

手札カードを整列する仕組みは出来上がりましたが、実際にプレイヤーがドローするカードをHandsオブジェクトの子に入れると以下の問題が発生します。

  1. カードが移動するアニメーションを表示できない(Layout Groupによって座標が固定されるため)
  2. 手札が多くなった時に領域の右側にはみ出てしまう(Layout GroupではUIの重なりが苦手なため)

これを解決するためにHandsオブジェクトの子には実体のない「ダミー手札オブジェクト」を手札枚数と同じだけ用意し、実際に作成する手札オブジェクトはそれぞれダミー手札オブジェクトと同じ位置に移動させるという実装を行います。

ダミー手札オブジェクトをカードよりも小さい大きさで作ればカード同士の重なりも実現できるため一石二鳥です。

 

それでは空のUIオブジェクトとしてDammyHandを作成しましょう。場所はどこでも大丈夫です。大きさ(Width・Height)も適当に小さめの値を入力しました。

このオブジェクトはゲーム中に生成・削除されるオブジェクトなのでプレハブ化します。

プレハブ化したらヒエラルキーからは削除します。

ダミー手札を制御するスクリプトを作成

ダミー手札オブジェクトを必要な数になるまで生成、あるいは削除しそれぞれの座標を取得する処理を担うクラスを作成します。Scripts > Battleの中にC#スクリプトを作成し、名前はDammyHandUIとします。

ターン開始時、あるいはカードを移動させたり合成させた時など、手札の枚数が増減する度にSetHandNumを呼び出すことになります。

これによってダミー手札オブジェクトが増減するので、GetHandPosメソッドでその位置を取得しそこへ手札カードのオブジェクトを移動させます。

 

スクリプトによってオブジェクトの作成を行った直後はLayout Groupの整列機能がまだ働いていないので、強制的にその機能を呼び出すApplyLayoutメソッドも用意しています。

 

このスクリプトはHandsオブジェクトへアタッチして使用します。パラメータの指定も忘れずに行いましょう。dammyHandPrefabには先ほど作成したダミー手札のプレハブを指定します。

カードのゾーン(領域)を設定する

手札処理を実装する上でもう一つやっておくべき準備として、いまプレイヤーカードが置かれている場所という情報を「カードゾーン」として管理するシステムの作成です。

手札に配られたカードはその後プレイボードに置かれたりトラッシュゾーンに送られることもあります。この3種類のゾーンをスクリプト内で定義しておきましょう。

まずはスクリプトから作成します。クラス名はCardZoneとしました。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

ゲームを実行すると、開始から1秒後に5枚のカードが山札からドローされている動きが確認できます。

カードを別のゾーンに移動する処理を作成する

仕上げとして、プレイヤーのドラッグ操作によってカードを別のゾーンに設置するという機能を作成しておきましょう。

FieldManager.cs

  • OnGUIメソッドはUpdateと同様に標準の機能であり、ほぼ1フレームごとに実行されます。Updateでなくこちらを選んだ理由として、Layout Groupの仕様との兼ね合いがありUpdate側では正常に動作しなかったためです。

先ほどカードゾーンごとに設定した当たり判定を利用してドラッグ先地点にあるゾーン情報を取得しています。

判定にはRaycastを使用しています。今回は指先が触れている地点から画面の奥方向に向かって光線を飛ばすようなイメージで、その光線に触れた(当たり判定を持った)オブジェクト全ての情報を取得し、foreachによってそれぞれの情報を確認しています。

現在はカードに対して当たり判定を設けていないのでゾーンのオブジェクトにのみヒットしています。

カードをドラッグ&ドロップして離した場所の情報を取得し、場合分けして処理を実行しています。細かい内容はコメントを参照してください。

実装が完了したらカードを移動・設置させる動作を確認してみましょう。今回はInspector側の操作は不要です。

まとめ

DOTweenのSequenceや遅延実行処理などを活かしてデッキからカードをドローする演出を作成しました。Tweenを含めたこれら3つの機能は非常によく使いますので少しずつ使い方を覚えていきましょう。

そしてカードゾーンのシステムを設計し、当たり判定をとって別のゾーンに移動させる処理も作りました。GUIベースのゲーム設計でもスプライト用の当たり判定が使用可能ですのでこちらも覚えておくと良いでしょう。

 

次の記事:

ローグライクデッキ構築ゲームの作り方講座6 Unityでカードの効果・種類を定義する
この記事はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第6回です。 前回はカードをプレイするためのゾーンの構築を行い、さらに山札からプレイヤーの手札にカードを配る処理を開発しました。 前回の記事: 現状では...

Unity ハクスラローグライク×デッキ構築型カードゲーム「呪術迷宮」の作り方講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

  1. 匿名 より:

    執筆ご苦労様です。誤記のご報告です。

    最後のFieldManager.csの6行目と85行目(もしかしたらまだあるかもしれません)から、黄色のライン表示が抜けています。

    大変勉強になる記事を公開していただきありがとうございます。これからも頑張ってください。

    • Unity入門の森 より:

      講座を読んでいただきありがとうございます。
      こちら、アプリ版でのみ利用しており、講座版では不要な処理の消し忘れでした。
      この後も使わない部分となりますのでスクリプトから削除していただいて大丈夫です。
      講座からも該当箇所の処理を削除して修正を行いました。
      ご報告ありがとうございます。

タイトルとURLをコピーしました