デッキ構築型カードバトルゲームの作り方7 カード効果のUI反映・日英翻訳でローカライズ機能をUnityで実現 | Unity入門の森 ゲームの作り方

デッキ構築型カードバトルゲームの作り方7 カード効果のUI反映・日英翻訳でローカライズ機能をUnityで実現

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


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

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

前回で一通りのカードデータとカード効果の設定を行いました。Unityで実践的なカードバトルゲームのカード効果の開発を経験できたかと思います。

前回の記事:

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

ですが、現在はまだScriptableObjectがカードのデータを持っているだけです。

これからゲーム中に生成されるカードオブジェクトのUIにそれらのデータを適用させていきましょう。

また、最後にシングルトンを用いたカードデータの保存システムを作成し、日英翻訳機能を実装。ローカライズ対策にも備えたゲームシステムを構築していきます。


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

カードオブジェクト側のカードデータ管理

現在カードオブジェクトにアタッチされているスクリプト(Card.cs)が保持しているデータは位置情報のみですので、「どのデータ(ScriptableObject)が対応しているか」そして「どの効果を今持っているか」などを管理する機能を追加します。

このゲームでは合成によってカードの効果が増える事がありますので、あくまでScriptableObject側のデータは参照のみで扱い、効果データは別の変数で管理しておく必要があります。

Card.cs (一部省略)

  • 今後、スクリプト内で変化の無い箇所はここでの記載を省略する場合があります。

新しくカードオブジェクトを生成する時、Initメソッド呼び出しの後にSetInitialCardDataメソッドも呼び出すことによってカード情報のセッティングを行えるようになりました。

ただしUIを変更していないのでFieldManager側の処理を追加しても画面に変化はありません。このままCardクラスを拡張してUI表示にまで対応していっても良いのですが、スクリプトが長くなりすぎるのでUI処理だけを担当する別クラスを用意しましょう。

Scripts/Battle以下に新クラスCardUIを作成し、以下のような表示処理を組み込みます。

合成によって効果が後から増えたり、効果量が変化した時にも対応できるような実装にしました。また、カードの使用者(自分もしくは敵)ごとに使用する背景画像も変更するようにします。

文章の表示については今は日本語にのみ対応しています。

これらの処理をCardクラス側から呼び出すようにしていきましょう。

Card.cs (一部省略)

そしてのちほど動作確認を行うためにFieldManagerを拡張しておきます。

FieldManager.cs (一部省略)

  • constやstatic、enumなどで定義された定数は「(クラス名).(定数名)」で他クラスからそのまま取得する事が可能です。
Unity C#での列挙型と定数の使い方
今回の記事では列挙型と定数について解説していきます。 列挙型を使うとスクリプト上で定数をテキストとして表現でき、より読みやすく設定しやすいコードを書くことができます。 前回の記事: 列挙型(enum)とは 列挙型は値型になり、System....

効果名・アイコン表示用プレハブを作成

まだ効果名Textおよびアイコン表示用Imageについては、入れ物である親オブジェクトしか用意してません(EffectsとIcons)。

複数の効果名・アイコン表示に対応できるように、それぞれ1個当たりのパーツをプレハブで用意しておく必要があります。

Cardプレハブの編集画面にて設定を開始しましょう。

アイコン表示用オブジェクト

アイコン画像はCard/Iconsオブジェクト以下に横並びで表示される為、まずはIconsオブジェクトに対してHorizontal Layout Groupをアタッチします。

中央揃え設定(Middle Center)で、Child Force Expandはオフにします。

ここにプレハブ化を行うベースとなる画像UIとしてCardIconオブジェクトを作成します。

UI>ImageオブジェクトをIconsの子に作成し、CardIconと命名。transformの値を以下の画像のように調整。

Source Imageはスクリプト内においてScriptableObjectの設定をもとに行いますのでここでは変更不要です。

ここまで設定できたらCardIconをプレハブ化し、元となったオブジェクトはCardプレハブ内から取り除きます。

効果名表示用オブジェクト

効果名TextはCard/Effects以下に縦並びで表示されるため、Effectsオブジェクトに対してVertical Layout Groupをアタッチします。

中央揃え設定(Middle Center)にし、他は変更しなくてもOKです。

同様にプレハブ化のためのベースオブジェクトとしてCardEffectというTextUIオブジェクトをここに作成します(UI > Legacy > Textで作成)。

効果の表示が5個並んでもギリギリ読めるくらいの大きさに設定すると良いでしょう。

文字が少しでも読みやすくなるようにShadowコンポーネントでの修飾も行っています。これは各種UIコンポーネントと組み合わせる事で文字や画像に影を設定する事ができるものです。似たような機能としてOutlineコンポーネントもあり、こちらは縁取りに対応しています。

設定が完了したらこのCardEffectオブジェクトもプレハブ化し、元となったオブジェクトは削除します。

CardUIクラスをアタッチ

残りの操作として、先ほどスクリプトを作成したCardUIのアタッチや他コンポーネントへの参照設定が必要です。

まずはCardプレハブに対してCardUIのアタッチから行います。量が多いですが1つずつドラッグ&ドロップで指定しましょう。

  • 各UIオブジェクトはHilightFrameを除いて全てアクティブにしておきます。
  • cardBackSprite_Player(プレイヤー側カード背景画像)とcardBackSprite_Enemy(敵側背景画像)の素材はTextures/GUIs/Cards以下に存在します。

 

プレハブ側の設定を終えたら先ほど用意した動作確認を実行する為に、シーン内のManagersオブジェクトのField Managerコンポーネント、[Test Card Data]パラメータに任意のカードデータ(ScriptableObjectファイル)を指定します。

これでテストプレイを行えば手札のカードに対して全て指定したカードのデータが反映されつつ表示されていることが確認できます。色々なカードデータで表示テストを行い、効果が2種類あるカードでも問題なく表示できているか確かめておくと良いでしょう。

なおFieldManager.csの89行目で使用者キャラクターIDを敵のものに変更すればカード背景が変更される事も確認できます。

シングルトンのデータ管理クラスを作成 日英翻訳機能の実装

現状では固定のカードデータのみをドロー時に反映させているので全てのカードが同じ種類になっています。そして文章表示も日本語でしか行っていません。

 

まずは言語設定に対応していきますが、この言語設定というのは複数のシーン(画面)をまたいでも同じ設定になるようにしなければいけません。

今はプロジェクト内には1つシーン(SampleScene.unity)しか存在しておらず、その中でオブジェクトの作成や配置を行っていますが将来的に別のシーンとしてタイトル画面を作成予定です。

ゲーム中にシーンを切り替えると基本的に前のシーンに存在した全てのオブジェクトは破棄されます。なのでBattleManagerクラスに言語設定を保存させても、シーン切り替えでManagersオブジェクト自体が消滅するのでタイトル画面シーンにその設定を引き継げません。

これを解決するために保存したいデータを持つクラス(がアタッチされているオブジェクト)にはシーンをまたいでも破壊されない設定を付与する必要があります。

注意点としてただ非破壊設定を付与してもそのオブジェクトがシーン内に初期から配置されている限り、そのシーンに切り替えるたびに同じオブジェクトがずっと増え続けてしまいます(オブジェクトが引き継がれて破棄されないので)。

データ管理用オブジェクトは1つしか必要ないので、2個目以上に生成されたものは生成された直後に削除される機能も必要になります。

これらの要点を踏まえて「ゲーム実行中に常に1つだけ存在するクラス(オブジェクト)」を作成します。このような特性をシングルトンと言います。シングルトンなオブジェクトにアタッチされた他のクラスも同様な特性を持つようになります。

 

シーン内にデータ管理用の空オブジェクトDataManagerを作成します。子オブジェクトである必要はなく、座標も設定不要です。

これにアタッチするスクリプト、Dataも作成します。フォルダ分けはおまかせします(ここではScripts以下にCommonフォルダを作成してここに格納しています。)

続きを読む

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

まとめ

カードの処理システムを拡張し、前回の記事で作成したカードデータをオブジェクトに反映させ、カードのUIを整えました。

また、シングルトンのデータ保存クラスを作成してシーン間での情報の受け渡しが可能になりました。今後タイトル画面を作成した時にこのシステムが活きてきます。シングルトンの機能を1つ作っておくと他のゲーム制作でも流用可能なのでぜひ覚えておきましょう。

次回もこのデータ保存クラスの特性を活かしてプレイヤーの初期デッキを設定できるようにしていきます。

次の記事:

Unity カードバトルゲームの作り方8 プレイヤー初期デッキの設定&CPUカードデータの設定
この講座はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第8回です。 前回の記事ではカード効果のUI反映、そしてシングルトンを用いたカードデータ管理のためのマネージャーシステムと日英ローカライズ機能を実装しま...

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



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

コメント

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