質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5566閲覧

クロッシーロードのガチャのようなシステムを作りたい。

K3E1N

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/03/13 08:44

編集2017/03/16 06:56

【0316追加】
進められるようになったので、最後にまとめて掲載します!

以前、キャラクターがアイテムを取得しキャラクターが発射されるキャラクターの銃弾の色をかえる。という内容を皆様のおかげで作ることができました。

今回はクロッシーロードのように、ポイントをもってガチャできるシステムにチャレンジしております。

まずコードを参考にしたサイトはこちらです。

unity のprojectに

  • __ProbabilityCalclator.cs__と
using UnityEngine; using System.Collections; using System.Collections.Generic; public static class ProbabilityCalclator { public static bool DetectFromPercent(int percent){ return DetectFromPercent ((float)percent); } public static bool DetectFromPercent(float percent){ int digitNum = 0; if(percent.ToString().IndexOf(".") > 0){ digitNum = percent.ToString ().Split('.')[1].Length; } int rate = (int)Mathf.Pow (10, digitNum); int randomValueLimit = 100 * rate; int border = (int)(rate * percent); return Random.Range (0, randomValueLimit) < border; } public static T DetermineFromDict<T>(Dictionary<T, int> targetDict){ Dictionary<T, float> targetFloatDict = new Dictionary<T, float>(); foreach (KeyValuePair<T, int> pair in targetDict) { targetFloatDict.Add(pair.Key, (float)pair.Value); } return DetermineFromDict (targetFloatDict); } public static T DetermineFromDict<T>(Dictionary<T, float> targetDict){ float totalPer = 0; foreach (float per in targetDict.Values) { totalPer += per; } float rand = Random.Range (0, totalPer); foreach (KeyValuePair<T, float> pair in targetDict) { rand -= pair.Value; if(rand < 0){ return pair.Key; } } Debug.LogError ("抽選ができませんでした"); return new List<T>(targetDict.Keys)[0]; } }
  • __GachaTEST.cs__を作成しました。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class GachaTEST : MonoBehaviour { [ContextMenu("Run")] private void Test(){ DetectFromPercent (); DetermineFromDict (); } private void DetectFromPercent(){ int trueCount = 0; int calcCount = 1000000; float per = 0.2f; for (int i = 0; i < calcCount; i++) { if (ProbabilityCalclator.DetectFromPercent (per)) trueCount++; } Debug.Log ("真偽判定の精度確認\n試行回数 : " + calcCount + "回, 目標 : " + per + "%, 実際 : " + ((float)trueCount / (float)calcCount * 100f) + "%"); } private void DetermineFromDict(){ Dictionary<Color, int> targetDict = new Dictionary<Color, int> () { {Color.red, 25}, {Color.green, 15}, {Color.blue, 60} }; Dictionary<Color, int> trueCountDict = new Dictionary<Color, int> () { {Color.red, 0}, {Color.green, 0}, {Color.blue, 0} }; int calcCount = 1000000; for (int i = 0; i < calcCount; i++) { trueCountDict [ProbabilityCalclator.DetermineFromDict<Color> (targetDict)]++; } string logText = "抽選の精度確認\n試行回数 : " + calcCount.ToString() + "回\n"; foreach (KeyValuePair<Color, int> pair in targetDict) { logText += pair.Key.ToString() + " 目標 : " + pair.Value.ToString() + "%, 実際 : " + ((float)trueCountDict[pair.Key] / (float)calcCount * 100f).ToString() + "%\n"; } Debug.Log (logText); } }

というのを作りまして、説明とおりに"ContextMenu"のRUNで実行してログを出すことはできました。

が、しかし・・・これを実際ガチャとして動かすにはどうすればいいのかがまったく分からず、検索してもunityでガチャを作るといった初歩が参考できるサイトも無くこまっております。

先がながいと思いマスが・・・目標としているクロッシーロードのガチャのようなシステムを作る為に何からはじめればいいのか・・・教えていただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずは作りたいシステムの流れを日本語で考えましょう。
クロッシーロードはやったことが無いので想像ですが……

  1. プレイヤーがガチャボタンを押す。
  2. ポイントが足りているか確認。持っていなかったらアラート画面を出して終了。
  3. ポイントを消費する。
  4. 10種類のガチャアイテムの中から1つを選択する。
  5. 選択したアイテムをユーザーに与える。

例えばこんな流れになるとしましょう。
次に、どのような仕組みでこれを実装するか考えます。

  1. uGUIでボタンを作ろう。
  2. 変数で条件分岐しよう。アラート画面はuGUIで作ろう。
  3. 変数を操作しよう。※ゲーム終了時に消えないように変数をどう保存する?
  4. 質問文内にあるランダム生成スクリプトを利用しよう。※景品リストはどう持つ?
  5. ※どんな方法で「アイテムの所持状態」を管理する?

これで考えるべきことが3つ(※の部分)あると分かりました。

この※部分の最適解はゲーム毎に異なります。
ポイントの保存だけでも「PlayerPrefsでいいのか」「サーバーに保存するのか」「市販Assetを使うのか」など色々な方法があります。
これを決めるのは質問主さんです。

「どう決めていいか分からない」という場合、とりあえずどんな方法があるのか調べる&考えてください。
後はトライ&エラーです。

例:「アイテムの所持状態の管理」とはどういうことか?→
「アイテム1を持っているかどうかのbool変数(isHasItem1)」
「アイテム2を持っているかどうかのbool変数(isHasItem2)」…など、
たくさんの変数を作って、オンオフを切り替えればいい→
でもアイテムの数だけbool変数を作るのは面倒臭い→
ではリスト(配列)で持ったらどうか→
「unity リスト」で検索したら「List<bool>」というのが出た→
これを使ってみよう→
並び順を考慮しないといけないので面倒臭い、アイテム名で検索したい→
検索したら「Dictionary<string, bool>」というのが出た→
これを使ってみよう→(以下繰り返し)

投稿2017/03/14 01:14

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K3E1N

2017/03/14 01:33

なるほど! スクリプトは文面は英語?でも、思考の内容や方向性は確かに日本語で問題ないですね! フローを考えて、それに当てはまるコードを検索してくっつけて一つにする・・・。 エラーがでたりするのが怖くて避けてましたが、いちど挑戦してみます!いろいろ問題にぶつかりそうですが是非ともお付き合いお願い致します!
guest

0

自己解決

sakura_hanaさんのご指摘を受けて、一つずつ勉強して良く事にしました。

【やりたい事】
0. ゲームで何らかの方法をCoinを獲得する。
0. ガチャボタンを押してガチャを回す
└※コインが足りないときはポップアップをだす。
0. ガチャを回せたらポイントを消費させる。

まずはこの三つを目標にしています。

【現状】

  • ガチャを回すボタンは作れました。
  • ボタンを押したらCoinが有るかないかを確認して、無ければポップアップさせられました。
  • ポップアップの左ボタンを押すとCoinを獲得できました。

└※右ボタンは閉じる。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4 5public class GachaScript : MonoBehaviour { 6 public GameObject PopUp; 7 public Text mycoinText; //Textよう変数 8 private int Coin = 0; 9 private int GachaCoin = 100; 10 11 void Start (){ 12 //********** 開始 **********// 13 mycoinText.text = "Coin: 0"; //初期スコアを代入して画面に表示 14 //********** 終了 **********// 15 } 16 17 public void OnClickNoButton(){ //クリックした時のアクションはこれをつかう 18 //********** コイン獲得部分開始 **********// 19 Coin += 30; 20 mycoinText.text = "Coin: " + Coin.ToString(); 21 //********** コイン獲得部分終了 **********// 22 } 23 public void ButtonPush (){ 24 //********** ガチャできるかできないか判断とポップアップ開始 **********// 25 if (Coin >= 100) { 26 Debug.Log ("この部分にコインを消費するコードを入れるのかな?"); 27 } 28 if (Coin < 100) { 29 30 PopUp.gameObject.SetActive(true); 31 } 32 //********** ガチャできるかできないか判断とポップアップ終了 **********// 33 } 34}

【できなかった事、解決したい事】
※ガチャのシステムはまだない(というか知識がない)ので次の段階にまわします。
0. ポイントを消費させたいです。
0. そのポイント保存させたい。(できれば外部保存)
0. 可能であれば、別のシーンに行ってもポイントが維持されるようにさせたい。

ここでいま躓きました。

過去の関連質問

投稿2017/03/17 10:32

K3E1N

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問