Unityに関連する記事です

 この手順では、種類によるレアリティ(希少度)ごとの提供割合を登録するためのスクリプタブル・オブジェクト(データベース)を作成し、
それを元にレアリティに応じたアイテムのデータをランダムで抽出する機能を実装します。
 
 抽出結果とその過程については Debug.Log メソッドを活用して、お使いの難易度と、褒賞の提供割合を元に褒賞がランダムに抽選されるか、確認を行います



 新しい学習内容は、以下の通りです。

 ・スクリプタブル・オブジェクトをゲーム内で利用できるようにする方法
 ・Linqの機能の実装例 〜Where メソッド、ToList メソッド、Sum メソッド、Select メソッド、ToArray メソッド〜



1.抽選処理の流れ


 前提として、希少度の違うトレジャーボックスがあり、そのトレジャーボックスにはさらに、褒賞となるデータの希少度があります。

 そのためには、合計3回の異なる抽選処理が必要になります。

 1.どの種類のトレジャーボックスを利用するのか、抽選する。
     → トレジャーボックスの種類が「ブロンズ」「シルバー」「ゴールド」だとしたら、そのどれを使うのか決める。

 2.【1】で決まったトレジャーボックスに設定されている、褒賞の出やすさ(レアリティ)を抽選する。
     → トレジャーボックスには「コモン」「アンコモン」「レア」の設定値があり、そのどれを使うのか決める。

 3.褒賞データベースの中から、【2】で決まったレアリティに設定されている褒賞のデータのみを抽出する
     → 褒賞データベースには、すべての褒賞データが登録されているため、まず最初に【2】のレアリティに該当する褒賞データのみを拾い出す。
       例えば、【2】の抽選結果が「アンコモン」である場合、褒賞データベースの中にある、レアリティが「アンコモン」の褒賞データのみを抽出してリスト化する。

 4.【3】で抽出した、【2】の抽選結果のみで構成されている褒賞データのリストから、それぞれの褒賞データに設定されている排出率を合計した上で、
   最終的に排出する褒賞データを抽選し、確定する。


2.スクリプタブル・オブジェクトを作成するための準備を行う

1.設計


 実装する処理としては、デバッグ用のボタンを押すごとに、重み付けを利用したランダムな抽選処理を行います。
本番用には、この処理を動かす部分を別の処理と紐づけて利用することを検討してください。

 同種類内に異なる内容のデータがある場合、まずは種類を特定し、その後、特定された種類のみを抽選対象となるようにします。
最後に、重み付けを利用して、抽選対象として出やすいもの、出にくいものを加味した上で、結果を抽出します。

 活用方法として想定している内容としては、ガチャの抽選結果、放置系ゲームの報酬の抽選結果、などです。
ガチャのレアリティが複数あり、そのレアリティ内には異なるデータの情報が複数ある、というときに利用できます。
 


<種類 例>
 ・レアリティ(希少度)と出やすさ
   1.コモン     700
   2.アンコモン   200
   3.レア      100

<コモン枠 例>
 ・データと出やすさ
  1.ポーション  250
  2.巻物     100
  3.レイピア    30



 このようなデータがあった場合、まず、レアリティ内の出やすさの数値を合計して抽選を行い、レアリティを決定します。
例えば、コモンであれば、700 / 1000 の確率になります。この考え方が重み付けになります。

 その後、コモン内のデータの数値を合計して抽選を行い、どのデータが抽出されるかを決定します。
例えば、巻物であれば、100 / 380 の確率になります。

 重み付けを利用する場合、数値は 100 を合計値の基準とはしません。
合計値に対しての個々の値を割合として利用し、計算結果として 100 % になるようにします。


2.スクリプタブル・オブジェクトとは


 各種のデータは個別の変数で管理したのではデータベース化出来ません。
そのため今回は、トレジャーボックスの種類のデータベースと、褒賞データのデータベースの2つの情報を
スクリプタブル・オブジェクトとして作成し、それぞれのデータを登録して利用する方法を採用しています。



 スクリプタブル・オブジェクトは Unity に用意されている機能の1つであり、
任意のクラスの情報をまとめて、1つのデータベースとして管理するための機能です。

 スクリプタブル・オブジェクトは、専用のスクリプトを作成することで、アセットとして作成することが出来ます。
そのため、スクリプタブル・オブジェクト用のスクリプトは、ゲームオブジェクトにアタッチすることは出来ません。
代わりに、いずれかのスクリプト内にスクリプタブル・オブジェクトとして作成したデータ型の変数を宣言して、アセットをアサインして利用することになります。


<参考サイト>
Unity 公式マニュアル
ScriptableObject
Unity 公式サイト
SCRIPTABLEOBJECT を使用してゲームを構築する 3 つの方法
くろくまそふと 様
【Unity】ScriptableObjectの作り方・使い方



 インスペクターから任意の値を登録することができるため、登録と確認を行いやすいのが特徴です。
ただし、登録するデータの量が増える場合には、インスペクターから1つずつ手入力するのではなくて、
スプレッドシートやエクセルなどのシートと連携して、スプレッドシートの情報をそのままスクリプタブル・オブジェクトとして自動的に登録する手法もあります。


2.TreasureType スクリプトを作成する


 今回はトレジャーボックスの種類の分類としてレアリティを enum にて作成します。
実際に運用する際には、自分のプロジェクトに合わせて任意に作成してください。


TreasureType

TreasureType.cs

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


 スクリプトを作成したらセーブします。


3.TreasureBoxData スクリプトを作成する


 トレジャーボックスの情報をまとめたクラスを作成します。
このクラスの情報が、1つ分のトレジャーボックスの内容・詳細となります。


TreasureBoxData.cs

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


 スクリプトを作成したらセーブします。


4.TreasureBoxDataSO スクリプトを作成する


 【3】の手順で作成した TreasureBoxData クラスは、1つ分のトレジャーボックスの情報群です。
そのため、複数のトレジャーボックスの情報を扱うためには、List などを利用し、1つの変数内に複数の TreasureBoxData クラスを管理させる必要があります。

 今回は、スクリプタブル・オブジェクトを作成して、複数の TreasureBoxData を管理出来るようにしますので、
ここではスクリプタブル・オブジェクトを作成するために必要な TreasureBoxDataSO スクリプトを作成します。

 MonoBehaviour クラスの代わりに、スクリプタブル・オブジェクト専用の ScriptableObject クラスを継承し、
クラス上に [CreateAssetMenu] 属性を記述することで、このスクリプトから、スクリプタブル・オブジェクトをアセットとして作成可能になります。
 


 スクリプタブル・オブジェクトでは、List の機能を利用することで、指定したデータを複数のデータとしてまとめて管理することが出来ます。
そのため、データベースとしての役割を果たすことが可能になっています。

 今回指定して管理したいデータはトレジャーボックスの種類と、その種類による希少度ごとの出現率のデータです。
そのため、TreasureBoxData 型の List を作成して、管理を行える状態として作成を行います。



TreasureBoxDataSO.cs

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


 スクリプトを作成したらセーブします。


5.RarityType スクリプトを作成する


 トレジャーボックスのときと同じように、褒賞データの希少度の分類を行うための enum を作成します。
この情報を褒賞データに利用して、希少度の区別を作ります。


RarityType.cs

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


 スクリプトを作成したらセーブします。


6.RewardData スクリプトを作成する


 報酬情報をまとめたクラスを作成します。
例えば、キャラの情報であったり、アイテムの情報などを1つのデータの塊として管理できるようにします。


RewardData.cs

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


 スクリプトを作成したらセーブします。


7.RewardDataSO スクリプトを作成する


 作成した RewardData クラスを List でまとめ、スクリプタブル・オブジェクトとして管理します。
RewardData クラスには、1つ分の褒賞のデータ(1つ分のアイテムやキャラのデータ)がまとめられていますので、
それらの情報をまとめておく List を作ることで、データベースとして利用出来るようにします。


RewardDataSO.cs

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


 スクリプトを作成したらセーブします。


3.スクリプタブル・オブジェクトを作成し、データを登録する

1.TreasureBoxDataSO スクリプトを元に TreasureBoxDataSO スクリプタブル・オブジェクトを作成する


 TreasureBoxDataSO スクリプトを元に TreasureBoxDataSO スクリプタブル・オブジェクトを作成します。
TreasureBoxDataSO スクリプトに用意してある JobTypeRewardRatesData 型の List である treasureBoxDataList 変数がデータベースの役割を持っています。

 スクリプタブル・オブジェクトはフォルダ分けして管理しておくと便利ですので、新しく Project フォルダ内に Datas フォルダを作成しておきます。
他にも ScriptableObjects といったフォルダ名でも構いません。

 その Datas フォルダにて Unity の左上のメニューより、Assets => Create => Create TreasureBoxDataSO を選択します。
新しく TreasureBoxDataSO というファイルが作成されます。名前はそのままで構いません。
このメニューが表示されない場合、TreasureBoxDataSO スクリプトに CreateAssetMenu 属性の付与が抜けています。見直してみてください。

 このアイコンの形が違うファイルがスクリプタブル・オブジェクトになります。
このアイコンは、このファイルがアセットとして取り扱われるようになる、ということを示しています。


<フォルダ管理(この手順が終了したときの状態)>



2.TreasureBoxDataSO スクリプタブル・オブジェクトの内容の登録を行う


 作成された TreasureBoxDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
TreasureBoxDataSO スクリプトにて宣言した treasureBoxDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
これがスクリプタブル・オブジェクトの中身です。


インスペクター画像



 このとき、インスペクターに Size の部分が表示されない場合には、
TreasureBoxDataSO スクリプト内の treasureBoxDataList 変数を public 修飾子で宣言していない可能性があります。

 見直してみてください。



 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する TreasureBoxData クラスの情報群になります。

 このとき、Size の値を変更しても、Element の内容(TreasureBoxData クラスの内容)が表示されない場合があります。
その際には、TreasureBoxData スクリプト内に System.Serializeble 属性の書き漏れがありますので、見直してみてください。



 今回は、トレジャーボックスの希少度に合わせて、データを3つ分登録しておきたいと思います。
treasureBoxDataList 変数の Size を 3 に変更してください。Element 0 〜 2 が下に作成されます。

 Element とは List の要素(中身)のことです。
そのため、Element 1つが TreasureBoxData 1つになります。Element の番号は 0 から始まります。

 以上のことから、1つの Element には1つの TreasureBoxData クラスの内容を設定できるようになっています。
このとき、TreasureBoxData クラスの上に [Serializable] 属性を宣言しているので、TreasureBoxData クラスの内容がインスペクターに表示されています。



 下記の画像は参考画像です。Element の Size 以外の部分の各設定を行ってみてください。

 TreasureType 変数にはそれぞれ異なる種類を登録し、RewardRates 配列変数は Size を 3 に設定して、Element 0 〜 2 を追加します。
この配列には、褒賞データの希少度ごとの提供割合を登録します。
RewardRates 配列変数の Element 0 は Common、Element 1 は Uncommon、Element 2 は Rare の排出値になります。

 この rewardRates 配列変数の合計値は 100 や 1000 になるようにすることで確率として扱うことが出来ますが、
重み付けをして抽選を行うため、合計値にこだわる必要はありません。


インスペクター画像



 以上で登録完了です。


3.RewardDataSO スクリプトを元に RewardDataSO スクリプタブル・オブジェクトを作成し、内容の登録を行う


 上記の【1】、【2】の手順と同じようにして、RewardDataSO スクリプタブル・オブジェクトを作成し、の内容の登録を行ってください。

 下記は参考画像です。各レアリティにつき抽選を行うため、最低でも2種類ずつ登録してください。


インスペクター画像



 以上で登録完了です。


4.RewardManager スクリプトを作成し、2つのスクリプタブル・オブジェクトを運用して、褒賞データをランダムに抽出する機能を実装する

1.設計


 抽選処理は非常に複雑なロジック・処理になっているので、しっかりと読み解けるようにしましょう。
このページの最初に紹介している抽選処理の流れも見直しておくといいでしょう。



 まずはトレジャーボックスに設定されている TreasureType を元に、TreasureDataSO スクリプタブル・オブジェクトを参照して、
そのトレジャーボックスにおける希少度の提供割合を照合してデータを取得します。

 例えば、トレジャーボックスの TreasureType が Bronze である場合、TreasureDataSO スクリプタブル・オブジェクトの Element 0 が照合して該当しますので、
その Element 0 内にある RewardRates 配列の値を希少度として利用し、それぞれ、Common の提供割合、Normal の提供割合、Rare の提供割合として準備します。



 次にランダムな値を1つ取得し、上記の提供割合のどの部分に該当するかを照合します。
ランダムな値の最大値は提供割合の合計値とし、その範囲内で値を取得するので、これらの提供割合の値を上回ることはありません。

 ランダムな値によって希少度が決定したら、次は、その希少度に含まれる褒賞の種類と、その出現割合を準備します。
例えば、希少度が Common に決定した場合、Common の褒賞は3種類ありますので、この3種類のいずれか1つを提供するために、それらの出現割合を準備します。

 再度ランダムな値を1つ取得し、褒賞の出現割合から、どの褒賞に該当するのかを照合します。
こちらのランダムな値も出現割合の合計値とすることで、出現割りを上回ることがないようにします。

 この手順を1つのメソッド内に順番に記述していきます。
処理のイメージをつかんでから始めてください。また処理には Linq という機能を複数利用しています。
このページの下段に解説がありますので、そちらも参考に読み解いてください。

 ここで褒賞データを決定することまでが、今回の実装になります。
実際のゲームにおいては、この褒賞データを使った次の手順を用意しておくことで、抽選処理と次の処理を繋げて利用するようになります。


2.RewardManager スクリプトを作成する


 スクリプタブル・オブジェクトを登録して管理するための変数を RewardDataSO 型と TreasureBoxDataSO 型でそれぞれ宣言しておきます。
スクリプタブル・オブジェクトと同じ型にすることで代入が可能になります。

 このとき、SerializeField 属性付きで宣言しておくことによって、インスペクターよりスクリプタブル・オブジェクトの代入が可能になります。

 抽選処理については、専用のメソッドを定義し、戻り値を利用して抽選結果を提供します。

 この抽選時に利用するトレジャーボックスの希少度は、今回は SerializeField 属性付きの変数で宣言しています。
そうすることにより、インスペクター上でトレジャーボックスの希少度の値を変えるだけで、異なる希少度のデバッグを
スクリプト内の変更なしで行えるように効率化しています。

 抽選処理には Linq の機能を利用しますので、using にて宣言します。



RewardManager.cs

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


 スクリプトを作成したらセーブします。


5.RewardManager ゲームオブジェクトを作成し、RewardManager スクリプトをアタッチして設定を行う


 ヒエラルキーにて CreateEmpty を行い、新しいゲームオブジェクトを作成し、名前を RewardManager に変更します。
その RewardManager ゲームオブジェクトに、先ほど作成した RewardManager スクリプトをアタッチします。


<インスペクター画像>




 インスペクターを確認し、SerializeField 属性で定義されているメンバ変数が3つ表示されていますので、
こちらに、スクリプタブル・オブジェクトを2つ、アサインします。アサインするのは Datas フォルダ内にある、スクリプタブル・オブジェクトです。
(スクリプタブル・オブジェクトを作成するために作ったスクリプトではありません。)

 デバッグ用の debugTreasureType 変数には、任意の TreasureType を設定します。ここに設定した TreasureType の内容で、褒賞データの抽選を行います。


<インスペクター画像>



 以上で設定は完了です。


6.<Linq の機能の実装例  Where メソッド、ToList メソッド、Sum メソッド、Select メソッド、ToArray メソッド〜>


 Linq(リンク)とは、コレクション(Dictionary や List など)の要素を操作して、検索したり集計する処理を簡潔に記述することができるライブラリ(複数の機能をまとめたもの)です。

 Linqを使用するためにはusing の宣言が必要になります。今回作成したメソッド内に登場している処理ですので、復習して読み解けるようにしていきましょう。

using System.Linq;



 Linqを記述する際にはラムダ式の記述を用います。ラムダ式についてはこちらをご確認ください。
SamuraiBlog様
【C#入門】LINQの使い方総まとめ(Select、Where、GroupByなど)
https://www.sejuku.net/blog/56519

 Linqには多くの機能がありますが今回利用している機能についてまとめておきます。
そのほかの機能については記事がたくさんありますが、こちらのサイトも参考になります。
地平線に行く様
LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。
https://yujisoftware.hatenablog.com/entry/20111031...


1.Where メソッド


 配列や List などのコレクションに対してフィルタリング処理を行い、指定した条件を満たす要素のみを取得することができる機能です。
引数にはフィルタリングを行う条件式を指定します。

  // 今回対象となる希少度のデータだけのリストを作成
  List<RewardData> rewardDatas = new List<RewardData>(rewardDataSO.rewardDataList.Where(x => x.rarityType == rarityType).ToList());

 今回の実装例では Where メソッドの条件式に x.rarityType == rarityType を指定しています。
これは List 型のコレクションである rewardDatasList 変数の要素を1つずつフィルタリングし、上記の条件に合う要素のみを取得しています。
x には rewardDatasList 変数の要素である RewardData 型の情報が1つずつ順番に代入され、RewardData クラスの持つ rarityType と引数で届いている rarityType とを照合しています。

 この処理は IEnumerable<T> の戻り値を持つため、メソッドチェーンを行うことで、この処理の結果を次の処理につなげていくことが可能です。
今回であれば、フィルタリングして照合の条件を満たした複数の RewardData 型の情報を取得することが出来ます。


参考サイト
MicroSoft
Enumerable.Where メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
陰干し中のゲーム開発メモ
【C#,LINQ】Where〜配列やリストを指定した条件でフィルタリングしたいとき〜
https://www.urablog.xyz/entry/2018/06/27/070000
.NET Column 様
【LINQのメソッド紹介その3】Whereで条件に合うデータを取得する
https://www.fenet.jp/dotnet/column/language/1458/


2.ToList メソッド


 IEnumerable<T> から List<T> を作成します。

 IEnumerable<T> は Linq の処理を実行した際の戻り値の情報です。例えば、フィルタリングして算出された結果を List 型にして利用したい場合に利用します。

  // 今回対象となる希少度のデータだけのリストを作成
  List<RewardData> rewardDatas = new List<RewardData>(rewardDataSO.rewardDataList.Where(x => x.rarityType == rarityType).ToList());

 上記のケースの場合、Where メソッドによって条件に合う RewardData クラス(IEnumerable<T> の T の部分)の情報が戻り値として取得できますが、それは取得しただけで処理が終了してしまいます。
そのため、ToList メソッドを実行して実体化しておくことで、List 型として情報を取得して扱うことが可能になります。

 それを左辺に用意している変数へと代入処理しています。よって、 Where メソッドの条件式によってフィルタリングされて抽出された複数の RewardData クラスの情報が
ToList メソッドを実行することで再度 List として再編されて存在するようになります。


参考サイト
MicroSoft
Enumerable.ToList<TSource>(IEnumerable<TSource>) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
Qiita @mounntainn 様
LINQについての備忘録
https://qiita.com/mounntainn/items/e8b8f94a15ec4fe...


3.Sum メソッド


 集計用のメソッドの1つです。指定したコレクションの要素の合計値を戻します。

 // 選択されたトレジャーボックスによる、褒賞データの希少度の合計値を算出した上で、その中からランダムな値を決定
  int randomRarityValue = UnityEngine.Random.Range(0, treasureBoxDataSO.treasureBoxDataList[(int)treasureType].rewardRates.Sum());

 こちらの実装では、指定された treasureType(トレジャーボックスの希少度)を持つ treasureBoxData クラスにある rewardRates 配列変数の要素を合計しています。
その合計値を Random.Range メソッドの最大値(第2引数)として利用し、乱数の取得しています。

 なお、UnityEngine.Random.Range メソッドと記述しているのは、Random.Range メソッドが using System と using UnityEngine の両方に用意されているため、
メソッドの前に using 先の指定がないと、どちらの Random.Range メソッドを利用していいのかプログラムが判断できなくなるためです。

 System の記載がない場合には、Random.Range と記述すれば問題ありません。


参考サイト
MicroSoft
Enumerable.Sum メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
Qiita @RyotaMurohoshi 様
~https://qiita.com/RyotaMurohoshi/items/d4a6750a798...
Qitta @logikuma 様
【C#】LINQ備忘録2 〜集計編〜
https://qiita.com/logikuma/items/d4f87ff4c308a7606...


4.Select メソッド


 射影処理と呼ばれる機能です。射影とはデータベース用の専門用語で、テーブル(実データ)から特定の列のデータのみを取り出すことを言います。

 Select メソッドでは引数にした条件を元に、照合できたデータのみを取り出す操作を行います。
このメソッドの戻り値は IEnumerable<TResult> であり、その情報を取得して利用したい場合には、メソッドチェーンを利用して、ToList メソッドや ToArray メソッドを利用して扱える状態にします。
これは Where メソッドと同じ処理の手順になります。

  // 同じ希少度の褒賞の提供割合の値の合計値を算出して、ランダムな値を決定
  int randomRewardValue = UnityEngine.Random.Range(0, rewardDatas.Select(x => x.rate).ToArray().Sum());

 こちらの実装例では、Range メソッドの第2引数(最大値を指定する)の部分で Select メソッドを利用しています。
rewardDatas.Select(x => x.rarityRate).ToArray().Sum() ここまでが、第2引数の処理です。

 rewardDatas 配列変数の各要素より、rarityRate 変数の情報をそれぞれ取り出します。
rewardDatas.Select(x => x.rarityRate) ここまでが Select メソッドです。


参考サイト
MicroSoft
Enumerable.Select メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
.NET Column 様
【LINQのSelectメソッドの書き方3選|LINQについてなどを紹介
https://www.fenet.jp/dotnet/column/language/1454/
Qiita @t_takahari 様
LINQのそのForEach、実はSelectで書き換えられるかも
https://qiita.com/t_takahari/items/6dc72f48b1ebdfe...


5.ToArray メソッド


 IEnumerable<T> から配列を作成します。

 IEnumerable<T> は Linq の処理を実行した際の戻り値の情報です。例えば、フィルタリングして算出された結果を 配列型にして利用したい場合に利用します。

  // 同じ希少度の褒賞の提供割合の値の合計値を算出して、ランダムな値を決定
  int randomRewardValue = UnityEngine.Random.Range(0, rewardDatas.Select(x => x.rarityRate).ToArray().Sum());
 
 Select メソッドによって抽出された情報を配列にしています。そしてその後に Sum メソッドを実行することにより、
配列の要素をすべて合計した値を算出し、それを Range メソッドの最大値として利用しています。

<第2引数の解説>
  // 同じ希少度の褒賞の提供割合の値の合計値を算出して、ランダムな値を決定
  int randomRewardValue = UnityEngine.Random.Range(0, [ 配列である rewardDatas クラスの持つ各 rarityRate 変数の値のみ取り出してそれを配列にし、その配列の要素の値の合計値 ]);


参考サイト
MicroSoft
Enumerable.ToArray<TSource>(IEnumerable<TSource>) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
Qiita @Marimoiro 様
LINQチートシート的なもの
https://qiita.com/Marimoiro/items/0e119b47d65bf138...


7.ゲームを実行して動作を確認する

1.デバッグを行う


 Debug.Log メソッドを活用して、褒賞がランダムに抽選されるか、確認を行います。

 実行時にエラーが出る場合、いくつかの原因が考えられます。


<主なエラーの原因>
  1.どちらかのスクリプタブル・オブジェクトのアサインが出来ていない

  2.TreasureBoxDataSO スクリプタブル・オブジェクトの Size が 0、あるいは Size を 1 以上に設定しているが、Element の内容が登録されていない

 などです。また、RewardData SO スクリプタブル・オブジェクトの Size が 0 のままの場合、エラーは出ませんが、抽選処理が実行されません。

 処理の内容を読み直してから、エラーの特定にチャレンジしてみてください。


<エラー1のケースのときのエラーメッセージ>




<エラー2のケースのときのエラーメッセージ>



 これらは暗記するのではなくて、エラーメッセージを読み解いて、どこに問題があるのか、自分1人でも追及するためのスキルを身につけるようにしましょう。



 RewardManager の debugTreasureType 変数に設定しているレアリティで抽選処理が行われて、褒賞データが排出されます。
インスペクターの設定と Console ビューに表示される情報を見て、処理の流れを確認してください。

 トレジャーボックスの希少度(debugTreasureType 変数 の TreasureType)を変更し、何回も試して、どのような処理が行われてるのかをしっかりと把握しておきましょう。


<デバッグ用のトレジャーボックスの希少度が Bronze の場合>



<デバッグ用のトレジャーボックスの希少度が Silver の場合>




2.活用方法


 この抽選処理はゲーム内の様々な部分に応用できます。

 現在はインスペクターにてデバッグ用の TreasureType を設定していますが、
この部分を別の変数から参照、あるいは乱数化することが出来れば、ゲーム内の処理に活用することが出来ます。

 ガチャだけではなく、例えば、 TreasureBox のレアリティの部分をランダム化すれば、放置系ゲームの時間報酬に活用出来ます。

 色々な角度から処理を考えて、自分のプロジェクトに反映させていってみてください。



 以上でこの手順は終了です。

 お疲れ様でした。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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