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

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

ただいまの
回答率

88.60%

UI Textのオブジェクトの位置の設定がうまくいかない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,013

Yamaimo_Misoni

score 11

Unity 2D(5.6.1)でクイズを出題するアプリをつくっています。
その中に解答の文字をパネルから選ぶ形式のモードがあります。
知っている方に説明すると、QMAの「文字パネル」と同じ形式です。
具体的には、解答欄に
あ い う え お
か き く け こ
と並んでいて、答えが「きあい」ならき、あ、いとボタンを押すことで解答します。
いま、ボタンを押すと、押した文字が表示される部分を作っています。
ボタンの上に□□□と枠が並んでいて、き、あ、いと押すと□それぞれに文字が表示されるようにしたいと思っています。
この表示枠は、背景をSpriteとして置き、その上にUI Textを貼り付けています。
クイズの答えとなる文字数は変化するので、問題を読み込む度にこの枠の位置を設定したいと思っています。
そのコードを組んだのですが、Sprite部分は正しく並んでいる(中央揃え)なのに、
Text部分はなぜか「1問前の解答文字数」を反映してしまい、表示がおかしくなっています。
1問目ではUnity側でデフォルトに配置した位置にTextが出てしまいます。

これが1問目をうつしたスクリーンショットです。解答は5文字で、背景の黒い部分は正しく設定されているのに文字はデフォルトの位置になっているのでずれてしまっています。

public class PanelQuizManager : MonoBehaviour, QuizManager {

    private GameObject[] panels; //解答パネル
    private GameObject[] panelTexts; //解答パネルに表示する文字
    private GameObject[] inputPanes; //解答表示パネル
    private GameObject[] inputPaneTexts; //解答表示パネルに表示する文字(バグが起きている)
    private GameObject question;

    public string answerText { get; set; }

    private PanelQuiz quiz;
    private string inputAnswer = "";   // 現在入力中の解答

    private System.Random random;

    public PanelQuiz Quiz {
        get {
            return quiz;
        }
        set {
            quiz = value;
            panels = new GameObject[10];
            panels[0] = GameObject.Find("PanelButton1");
            panels[1] = GameObject.Find("PanelButton2");
            panels[2] = GameObject.Find("PanelButton3");
            panels[3] = GameObject.Find("PanelButton4");
            panels[4] = GameObject.Find("PanelButton5");
            panels[5] = GameObject.Find("PanelButton6");
            panels[6] = GameObject.Find("PanelButton7");
            panels[7] = GameObject.Find("PanelButton8");
            panels[8] = GameObject.Find("PanelButton9");
            panels[9] = GameObject.Find("PanelButton10");
            panelTexts = new GameObject[10];
            panelTexts[0] = GameObject.Find("PanelText1");
            panelTexts[1] = GameObject.Find("PanelText2");
            panelTexts[2] = GameObject.Find("PanelText3");
            panelTexts[3] = GameObject.Find("PanelText4");
            panelTexts[4] = GameObject.Find("PanelText5");
            panelTexts[5] = GameObject.Find("PanelText6");
            panelTexts[6] = GameObject.Find("PanelText7");
            panelTexts[7] = GameObject.Find("PanelText8");
            panelTexts[8] = GameObject.Find("PanelText9");
            panelTexts[9] = GameObject.Find("PanelText10");
            inputPanes = new GameObject[8];
            inputPanes[0] = GameObject.Find("InputPane1");
            inputPanes[1] = GameObject.Find("InputPane2");
            inputPanes[2] = GameObject.Find("InputPane3");
            inputPanes[3] = GameObject.Find("InputPane4");
            inputPanes[4] = GameObject.Find("InputPane5");
            inputPanes[5] = GameObject.Find("InputPane6");
            inputPanes[6] = GameObject.Find("InputPane7");
            inputPanes[7] = GameObject.Find("InputPane8");
            inputPaneTexts = new GameObject[8];
            inputPaneTexts[0] = GameObject.Find("InputPaneText1");
            inputPaneTexts[1] = GameObject.Find("InputPaneText2");
            inputPaneTexts[2] = GameObject.Find("InputPaneText3");
            inputPaneTexts[3] = GameObject.Find("InputPaneText4");
            inputPaneTexts[4] = GameObject.Find("InputPaneText5");
            inputPaneTexts[5] = GameObject.Find("InputPaneText6");
            inputPaneTexts[6] = GameObject.Find("InputPaneText7");
            inputPaneTexts[7] = GameObject.Find("InputPaneText8");
            question = GameObject.Find("QuestionText");
            question.GetComponent<Text>().text = "";

            question.GetComponent<Text>().alignment = TextAnchor.UpperLeft;

            random = new System.Random();

            startQuestion();
        }
    }

    private void startQuestion() {
        int choiceNumber = quiz.Choice.Length;
        List<string> choices = new List<string>();
        for (int i = 0; i < choiceNumber; i++) {
            choices.Add(quiz.Choice[i].ToString());
        }
        if (choiceNumber == 8) {
            for (int i = 0; i < 8; i++) {
                //解答パネルの位置設定
                int index = random.Next(0, choices.Count);
                panelTexts[i].GetComponent<Text>().text = choices[index];
                float panelX = (float)(i % 4 * 2 - 3.0);
                float panelY = (float)(i / 4 * (-2.25) - 1.5);
                float textX = i % 4 * 216 - 344 + 960;
                float textY = i / 4 * (-240) - 160 + 540;
                panels[i].transform.position = new Vector2(panelX, panelY);
                panelTexts[i].transform.position = new Vector2(textX, textY);
                choices.RemoveAt(index);
            }
            for (int i = 0; i < 2; i++) {
                //いらないパネルを画面外に飛ばす
                panels[8 + i].transform.position = new Vector2(30, 0);
                panelTexts[8 + i].transform.position = new Vector2(3000, 0);
            }
            for (int i = 0; i < 3; i++) {
                //解答表示パネルの位置設定
                float inputPaneX = (float)(i * 1.2 - 1.2);
                float inputPaneTextX = (float)(i * 1.2 - 1.2);
                inputPanes[i].transform.position = new Vector2(inputPaneX, (float)0.15);
                inputPaneTexts[i].transform.position = new Vector2(inputPaneTextX, (float)0.2);
                inputPaneTexts[i].GetComponent<Text>().text = "";
            }
            for (int i = 0; i < 5; i++) {
                //いらないパネルを画面外に飛ばす
                inputPanes[3 + i].transform.position = new Vector2(30, 0);
                inputPaneTexts[3 + i].transform.position = new Vector2(3000, 0);
            }
        } else {
            for (int i = 0; i < 10; i++) {
                //解答パネルの位置設定
                int index = random.Next(0, choices.Count);
                panelTexts[i].GetComponent<Text>().text = choices[index];
                float panelX = (float)(i % 5 * 2 - 4.0);
                float panelY = (float)(i / 5 * (-2.25) - 1.5);
                float textX = i % 5 * 216 - 432 + 960;
                float textY = i / 5 * (-240) - 160 + 540;
                panels[i].transform.position = new Vector2(panelX, panelY);
                panelTexts[i].transform.position = new Vector2(textX, textY);
                choices.RemoveAt(index);
            }
            int answerLength = quiz.Answer.Length;
            for (int i = 0; i < answerLength; i++) {
                //解答表示パネルの位置設定
                float inputPaneX = (float)((i - ((answerLength - 1) / 2.0)) * 1.2);
                float inputPaneTextX = (float)((i - ((answerLength - 1) / 2.0)) * 1.2);
                inputPanes[i].transform.position = new Vector2(inputPaneX, (float)0.15);
                inputPaneTexts[i].transform.position = new Vector2(inputPaneTextX, (float)0.2);
                Debug.Log(inputPaneTexts[i].transform.position);
                inputPaneTexts[i].GetComponent<Text>().text = "";
            }
            for (int i = 0; i < 8 - answerLength; i++) {
                //いらないパネルを画面外に飛ばす
                inputPanes[answerLength + i].transform.position = new Vector2(30, 0);
                inputPaneTexts[answerLength + i].transform.position = new Vector2(3000, 0);
            }
        }
        resultText.GetComponent<Text>().text = "";
        answerText = quiz.Answer;
    }
}


Textを設定している部分は

            for (int i = 0; i < 3; i++) {
                //解答表示パネルの位置設定
                float inputPaneX = (float)(i * 1.2 - 1.2);
                float inputPaneTextX = (float)(i * 1.2 - 1.2);
                inputPanes[i].transform.position = new Vector2(inputPaneX, (float)0.15);
                inputPaneTexts[i].transform.position = new Vector2(inputPaneTextX, (float)0.2);
                inputPaneTexts[i].GetComponent<Text>().text = "";
            }


            int answerLength = quiz.Answer.Length;
            for (int i = 0; i < answerLength; i++) {
                //解答表示パネルの位置設定
                float inputPaneX = (float)((i - ((answerLength - 1) / 2.0)) * 1.2);
                float inputPaneTextX = (float)((i - ((answerLength - 1) / 2.0)) * 1.2);
                inputPanes[i].transform.position = new Vector2(inputPaneX, (float)0.15);
                inputPaneTexts[i].transform.position = new Vector2(inputPaneTextX, (float)0.2);
                Debug.Log(inputPaneTexts[i].transform.position);
                inputPaneTexts[i].GetComponent<Text>().text = "";
            }


の部分です(細かく言うと、選択肢が8個のとき解答文字数は3、選択肢が10個のとき解答文字数は4~6なのでこのような処理になっています)。
Spriteと同じように設定しているはずなのに(しかも選択肢の部分は同じように設定して動いているのに)、このようなズレがでるのはなぜなのでしょうか。ご教授お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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