コード例 #1
0
    void CreateButtons()
    {
        //ボタン生成音
        InstanceCommonGameCanvasManagerScript.DoSoundSetQuestions();


        //画面サイズ
        float DrawAreaSizeX = 360.0f;
        float DrawAreaSizeY = 460.0f;


        //ボタンサイズ
        // 幅
        float ButtonWidth = OriginalButton.GetComponent <RectTransform>().sizeDelta.x;
        // 高さ
        float ButtonHeight = OriginalButton.GetComponent <RectTransform>().sizeDelta.y;


        //タップしやすいようにマージン
        float MarginX = 150f;
        float MarginY = 150f;


        //画面からはみ出さないように
        //ボタンの半分のサイズおよび
        //マージンを両側から除いた描写エリア
        float DrawTargetAreaSizeX = DrawAreaSizeX - ButtonWidth - MarginX;
        float DrawTargetAreaSizeY = DrawAreaSizeY - ButtonHeight - MarginY;


        //        float x = 0f;
        //        float y = 0f;

        float[] x = new float[NumberOfButtons];
        float[] y = new float[NumberOfButtons];

        int j = 0;

        while (j < NumberOfButtons)
        {
//            Debug.Log("j: "+j);

            x[j] = UnityEngine.Random.Range(-DrawTargetAreaSizeX / 2, DrawTargetAreaSizeX / 2);
            y[j] = UnityEngine.Random.Range(-DrawTargetAreaSizeY / 2, DrawTargetAreaSizeY / 2);

            //            Debug.Log(x[j]+" , "+y[j]);

            //
            //  もし二点間の距離がボタンサイズ+α以下なら再度作る
            //


            //初回ボタンは他のボタンと距離を比較する必要がないので以降処理をスキップ
            if (j == 0)
            {
                j++;
                continue;
            }

            int p = 0;
            for (int k = 1; k < (j + 1); k++)
            {
                //各軸の差分を取得
                float defx = x[j] - x[j - k];
                float defy = y[j] - y[j - k];

                //2点間の距離を取得
                float distance = Mathf.Sqrt(defx * defx + defy * defy);

//                Debug.Log("distance: " + distance);


                //2点間の距離が指定より短い組合せをpでカウント
                if (distance < 55f)
                {
//                    Debug.Log("distance<30");
                    p++;
                }
            }

            //pが1以上ならjをカウントしない
            if (p > 0)
            {
                continue;
            }

            //j番目のボタン位置を算出できたのでj+1のボタンへ
            j++;
        }


        for (int i = 0; i < NumberOfButtons; i++)
        {
            //ボタンを新規作成し、以降で扱い易いようにオブジェクトに代入
            Button = Instantiate(OriginalButton, new Vector3(x[i], y[i], 0), Quaternion.identity);

            //新規作成したボタンに紐づく子要素を取得
            foreach (Transform child in Button.transform)
            {
                //子要素はテキストオブジェクトなのでテキストコンポーネントを取得
                Text ButtonNumber = child.GetComponent <Text>();
                ButtonNumber.text = (i + 1).ToString();
            }

            Button.transform.SetParent(drawArea.transform, false);
        }
    }