Unity 5でUIテキストオブジェクトを動的に作成する方法


8

私はシンプルなものを探していましたが、Unity 5のドキュメントはかなり古くなっています。私が達成したいのは、スクリプトから完全に、つまり完全に動的にUIテキストを作成できるようにすることです。実際のアプリケーションでは、事前定義されていない反復回数のループでそれを行います。

Googleを使用して検索すると、その方法に関する非常に多くの例が見つかりますが、すでに廃止されている(Unityバージョン5より前の)メソッドを使用しているか、単に間違っている(ここで驚きません...)方法を使用しています。最初にCanvasをプロジェクトに追加し、次にusing UnityEngine.UIC#コードに含める必要があること、およびのようなUIテキストを宣言できることはすでに知っていText _guitextます。

ただし、以下のコードは機能しません。つまり、クラッシュするのではなく、何も表示されないということです。

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


public class MyClass: MonoBehaviour {

Text _guitext;

// Use this for initialization
void Start () {
    _guitext.text = "testing";
}

// Update is called once per frame
void Update () {
}
}

さらに悪いことに、ゲームがプレイされている間、オブジェクト階層リストに新しいオブジェクトが表示されないようです。

ここで正しい方向に私を指摘していただけませんか?ありがとう。

回答:


9

あなたが探しているのは次のようなものだと思います:

GameObject CreateText(Transform canvas_transform, float x, float y, string text_to_print, int font_size, Color text_color)
{
    GameObject UItextGO = new GameObject("Text2");
    UItextGO.transform.SetParent(canvas_transform);

    RectTransform trans = UItextGO.AddComponent<RectTransform>();
    trans.anchoredPosition = new Vector2(x, y);

    Text text = UItextGO.AddComponent<Text>();
    text.text = text_to_print;
    text.fontSize = font_size;
    text.color = text_color;

    return UItextGO;
}

つまり、最初に空のゲームオブジェクトを作成します。次に、特定のローカルパラメータやアンカーパラメータを使用してテキストコンポーネントを追加し、目的のテキストとその色を設定してから、このオブジェクトを空のゲームオブジェクトの子にします。

あなたはその後、ちょうど使用することができ、UIのテキストからの情報や、スクリプトを経由して作成した、そのオブジェクトのセット変数を取得したいyourGOname.GetComponent<Text>().textyourGOname.GetComponent<Text>().fontなど、

そしてもちろん、それが機能するためにはあなたがである必要がありますusing UnityEngine.UI


サンプルスクリプトは、テキストテキスト、フォントサイズ、色の「テキスト」に対してエラーをスローします。Text' does not contain a definition for text 'と拡張メソッドがないtext' of type Text'が見つかりました(usingディレクティブまたはアセンブリ参照がありませんか?)
Ian S

1
@IanSteffy私の答えの最後の行をフォローするのを忘れた、つまりusing UnityEngine.UIスクリプトの最初にを含めるのを忘れたからではないですか?
Mand

3

1 uitextを動的に変更したいですか?

変更したい場合は、まずスクリプトをgameobjectにアタッチする必要があります。次に、変数をバインドします。チュートリアルはここにあります

 transform.gameObject.GetComponent<Text>().text = "123";

2事前に階層にないuitextを作成する場合。

GUIを使用できます。GUIラベル

作成したインスタンスをOnGUIに配置します。フレームごとに呼び出されるアップデートのようなものです。

3実際には2番目の回答では、uitextオブジェクトは作成されません。

しかし、同じ結果が得られます。エフェクトではなくuitextオブジェクトが本当に必要な場合。Uはプレハブでそれを行い、実行時にそれを開始するかもしれません。ただし、uitextはcanvasの子である必要があります。


ご回答有難うございます。しかし、私は本当に変更したくはありませんが、UIテキストを作成する必要があります(プレハブではなく、実際のGUIテキスト)。私はその公式リファレンスを読みましたが、スクリプトを使用して(つまり、エディターに入れずに)UIテキストを作成する方法についての手がかりはありません。ここにはこの参照がありますが、非常にあいまいです:docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter

@KimShutterリンクが言及したリンク> UI要素を動的に簡単にインスタンス化できるようにするための最初のステップは、インスタンス化できるようにするUI要素のタイプのプレハブを作成することです
AlexWei

3

デバッグのための迅速で汚いソリューションを探している場合でも、古いUnity 4ソリューションを使用できます。OnGUI常にアクティブになっている任意のMonoBehavior のイベントを実装して、GUIクラスを呼び出し、UI要素を現在のレンダリングフレームに追加します。

void OnGUI() {
    GUI.Label(new Rect(10, 10, 100, 20), "Hello World!");
}

キャンバスを使用する場合は、キャンバスに次のスクリプトを追加する必要があります。

  1. 新しいGUITextゲームオブジェクトを作成します
  2. そのオブジェクトにテキストを設定します
  3. transformキャンバスのに子として追加します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.