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

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

ただいまの
回答率

90.51%

  • Unity

    4024questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,479

K3E1N

score 3

【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でガチャを作るといった初歩が参考できるサイトも無くこまっております。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

  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 10:33

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

    キャンセル

check解決した方法

0

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

【やりたい事】

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

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

【現状】

  • ガチャを回すボタンは作れました。
  • ボタンを押したらCoinが有るかないかを確認して、無ければポップアップさせられました。
  • ポップアップの左ボタンを押すとCoinを獲得できました。
    └※右ボタンは閉じる。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GachaScript : MonoBehaviour {
    public GameObject PopUp;
    public Text mycoinText; //Textよう変数
    private int Coin = 0;
    private int GachaCoin = 100; 

    void Start (){
        //********** 開始 **********//
        mycoinText.text = "Coin: 0"; //初期スコアを代入して画面に表示
        //********** 終了 **********//
    }

    public void OnClickNoButton(){ //クリックした時のアクションはこれをつかう
        //********** コイン獲得部分開始 **********//
        Coin += 30; 
        mycoinText.text = "Coin: " + Coin.ToString();
        //********** コイン獲得部分終了 **********//
    }
    public void ButtonPush (){
        //********** ガチャできるかできないか判断とポップアップ開始 **********//
        if (Coin >= 100) {
            Debug.Log ("この部分にコインを消費するコードを入れるのかな?");
        }
        if (Coin < 100) {

            PopUp.gameObject.SetActive(true);
        }
        //********** ガチャできるかできないか判断とポップアップ終了 **********//
    }
}

【できなかった事、解決したい事】
※ガチャのシステムはまだない(というか知識がない)ので次の段階にまわします。

  1. ポイントを消費させたいです。
  2. そのポイント保存させたい。(できれば外部保存)
  3. 可能であれば、別のシーンに行ってもポイントが維持されるようにさせたい。

ここでいま躓きました。

過去の関連質問

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    4024questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。