Bagaimana cara membuat objek teks UI secara dinamis di Unity 5?

8

Saya telah mencari sesuatu yang seharusnya sederhana, tetapi dokumentasi Unity 5 tentang itu sudah ketinggalan zaman. Apa yang ingin saya capai adalah untuk dapat membuat Teks UI sepenuhnya dari skrip, yaitu sepenuhnya dinamis - dalam aplikasi kasus nyata saya, saya akan melakukannya dalam satu lingkaran jumlah iterasi yang tidak ditentukan sebelumnya.

Pencarian menggunakan Google akan menemukan cukup banyak contoh tentang cara melakukan itu, tetapi semua yang saya lihat baik menggunakan metode yang sudah usang (berasal dari sebelum Unity versi 5) atau hanya salah (tidak mengherankan di sini ...). Saya sudah tahu bahwa saya harus terlebih dahulu menambahkan Kanvas ke proyek saya, kemudian saya harus memasukkan using UnityEngine.UIdalam kode C # saya, dan juga bahwa saya bisa mendeklarasikan seperti Teks UI Text _guitext.

Namun, kode di bawah ini tidak berfungsi. Maksud saya, bukan karena crash, melainkan karena tidak ada yang ditampilkan:

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 () {
}
}

Lebih buruk dari itu, tampaknya saat permainan dimainkan, tidak ada objek baru yang muncul dalam daftar hierarki objek.

Bisakah Anda tunjukkan saya ke arah yang benar di sini? Terima kasih.

Kim Shutter
sumber

Jawaban:

9

Saya pikir apa yang Anda cari adalah sesuatu seperti berikut:

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;
}

Artinya, Anda pertama kali membuat GameObject kosong. Kemudian Anda menambahkan komponen teks, dengan parameter lokal dan / atau berlabuh tertentu, mengatur teks yang diinginkan dan warnanya, maka Anda membuat objek ini anak dari objek permainan kosong.

Anda ingin mengambil UI informasi Teks dari atau set variabel bahwa objek yang Anda buat melalui script, Anda dapat maka cukup gunakan yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().font, dll

Dan tentu saja, agar berhasil, Anda harus menjadi seperti itu using UnityEngine.UI.

Dan
sumber
Contoh script Anda membuat kesalahan untuk 'Teks' dalam teks teks, ukuran font, dan warna. Text' does not contain a definition for teks 'dan tidak ada metode ekstensi text' of type Teks' dapat ditemukan (apakah Anda melewatkan arahan menggunakan atau referensi rakitan?)
Ian S
1
@ IanSteffy, apakah Anda yakin itu bukan karena Anda lupa untuk mengikuti baris terakhir dari jawaban saya, yaitu untuk memasukkan using UnityEngine.UIdi awal skrip?
Tanggal
3

1 maksud Anda Anda ingin mengubah uitext secara dinamis?

Jika Anda ingin mengubahnya, pertama-tama Anda harus melampirkan skrip ke objek game. Kemudian ikat variabel Anda. Tutorial dapat ditemukan di sini

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

2 Jika Anda ingin membuat uitext yang tidak ada dalam Hirarki sebelumnya.

Anda bisa menggunakan GUI .Label GUI

Masukkan instance yang dibuat di OnGUI. Ini seperti pembaruan yang disebut setiap frame.

3 Sebenarnya jawaban ke-2 tidak membuat objek uitext.

Tetapi itu akan mencapai hasil yang sama. Jika Anda benar-benar menginginkan objek uitext alih-alih efeknya. Anda dapat melakukannya di prefab, dan memulai dalam runtime. Namun, uitext haruslah anak dari kanvas.

AlexWei
sumber
Terima kasih atas jawaban anda. Namun, saya benar-benar tidak ingin mengubah, tetapi untuk membuat Teks UI (tanpa cetakan, Teks GUI nyata). Saya membaca referensi resmi itu, tetapi tidak ada petunjuk di dalamnya tentang cara membuat Teks UI hanya menggunakan skrip (yaitu tanpa meletakkannya di editor). Ada referensi ini di sini, tetapi juga sangat kabur: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter
@KimShutter Tautan yang Anda sebutkan> Agar dapat dengan mudah membuat instance elemen UI secara dinamis, langkah pertama adalah membuat prefab untuk jenis elemen UI yang ingin Anda instantiate
AlexWei
3

Jika Anda mencari solusi cepat & kotor untuk debugging, Anda masih dapat menggunakan solusi Unity 4 lama. Menerapkan OnGUIacara dari setiap MonoBehavior yang Anda selalu aktif untuk memanggil kelas GUI untuk menambahkan beberapa elemen UI ke bingkai rendering saat ini.

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

Jika Anda ingin menggunakan kanvas, Anda perlu menambahkan skrip ke kanvas yang:

  1. menciptakan GUITextobjek game baru
  2. mengatur teks pada objek itu
  3. menambahkannya sebagai anak ke transformkanvas
Philipp
sumber