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

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

ただいまの
回答率

87.58%

Unity Sliderを用いたグラフ作成

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,135

score 32

前提・実現したいこと

現在、Unityを用いてシステムをつくりながら、C#やphp、MySQLなどについて勉強しています。

今回はUnityを用いてグラフを表示したいと考え、多くの記事を参考にしながら続けてきましたが、どうしても実現できず行き詰ってしまったため、質問させていただきました。

今回私が実現したいことは、UnityでJSONを用いてグラフを表示したいです。
グラフにしたいデータは、DBにあるデータをphpから取得し、
Unity側のC#(Graph.cs)でJSONデータを受け取り、それを基に棒グラフを作成したいと考えています。
作成したい棒グラフの概要は、今回のJSONデータでいうと、

  • ○の数と×の数の合計数
  • ○の数
    を一本の棒グラフで表示(図1)することができるようにしたいと考えています。

該当のソースコード

グラフにしたいJSONデータ

[
{"sum":30,"maru":"16","batu":"14"},
{"sum":27,"maru":"22","batu":"5"}
]

Graph.cs

using UnityEngine;
using System.Collections;
using MiniJSON;
using UnityEngine.UI;

public class Graph : MonoBehaviour
{

    Slider _slider;
    int graph = 0;

    [SerializeField]
    RectTransform prefab = null;

     public void start()
    {
        StartCoroutine("GetJSON");
    }

    IEnumerator GetJSON()
    {
        WWW www = new WWW("http://localhost/graphjson.php");
        yield return www;
        Debug.Log(www.text);

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.LogError(string.Format("Fail Whale!\n{0}", www.error));
            yield break; 
        }
        string json = www.text;

        IList List = (IList)Json.Deserialize(json);

        foreach (IDictionary list in List)
        {
            long sum = (long)list["sum"];
            string maru = (string)list["maru"];
            string batu = (string)list["batu"];

            var item = GameObject.Instantiate(prefab) as RectTransform;
            item.SetParent(transform, false);
            var text = item.GetComponentInChildren<Text>();

            text.text ="合計数 " + sum.ToString() + "問"+ "○の数" + maru.ToString() + "問" + "×の数 " + batu.ToString() + "問";

            // スライダーのバーの値を指定 しかし、初めに表示されたボタンのスライダーしか値は変わらない
            _slider = GameObject.Find("Slider").GetComponent<Slider>();
            graph = 28;//ゲージの値を設定
            _slider.value = graph;
         }
       }
   }
}

試したこと 考えたこと

Unityで、棒グラフを作成するには、【Unity】縦棒グラフ作ってみる – LineRender編
のような記事がありましたが、実現したい、JSONを用いてグラフを作成しているようなサイトが見つからず、行き詰っています。

そこで考えたことは、HPゲージでよくみられるスライダーを用いて棒グラフを作成することです。
グラフ図1図1
このように縦にグラフを重ねて表示したいと考えました。
図1の表示例では、○と×の合計数が30で○の数が16という表示です。

Graph.csでは、取得したJSONデータから動的に作成したボタン上にTextとして表示するスクリプトで、今回はあらかじめ、ボタンの子オブジェクトとしてスライダーをコンポーネントし、プレハブとしています。

エラー、困っていること

Graph.csの表示では、しっかりとJSONから取得したデータをボタン上にテキストとして出力できています。
試しにスライダーのゲージの値を最大値30のうち、28に設定したとこる、作成されたボタン2つの内、初めのボタンだけがゲージの値が28であり、もう片方の値は何変わりませんでした。
調べたところ、子オブジェクトのインスタンス化?をする必要があるのではと考えましたが、いまいち良く分かりません…

どのようなコードを用いれば、動的に作成したボタンに、JSONから取得した値をスライダーのバーの値に反映することができるのでしょうか。

補足情報

まだプログラミングを始めてまだ間もなく、Unityやphpの知識、理解が追い付いていない点等あり、また拙い文章ではございますが、何卒お力をお借りできませんでしょうか。
よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

_slider = GameObject.Find("Slider").GetComponent<Slider>();
この部分ですが、これは「Sliderという名前のオブジェクトを見付けて、そのオブジェクトに付いたSliderコンポーネントを_slider変数に代入する」というコードです。

同名のオブジェクトがシーン上に複数ある場合、Unityは最初の1つしか見付けません(各オブジェクトには見えないIDが振られており、同名オブジェクトの中でIDが一番若いものを取得します)。
つまりforeachで幾ら繰り返そうが、対象としているのが「(最初に見付けた)Sliderという名前のオブジェクト」なので1つしか変化しないわけです。

Sliderオブジェクトの名前をそれぞれ変更するなどして、別々のオブジェクトを見付けられるようにすれば解決するかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/01 17:38

    sakura_hana様
    ご回答ありがとございます。
    .Findで別の名前のsliderを設定したところ、無事すべてのsliderの値が変化しました。
    詳しく教えていただき、とても分かりやすかったです。
    ありがとうございました。

    キャンセル

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

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

関連した質問

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