Как вывести свой текст на каждой кнопке?

Общие вопросы о Unity3D

Как вывести свой текст на каждой кнопке?

Сообщение EIvanov 07 окт 2022, 14:50

На сцене есть 4 кнопки:
Answer1Button
Answer2Button
Answer3Button
Answer4Button
У каждой кнопки есть вложенный компонент - текст. Как у любой обычной кнопки в Unity.
Нужно вывести определенный текст на каждой кнопке.

Вот скрипт, который привязан к каждой кнопке.
Синтаксис:
Используется csharp
public class AnswerButton : MonoBehaviour
{
public int buttonNumber; // В это поле вводим номер кнопки. Это работает, в дебаге вижу цифру, которую ввел.
GameObject answerButton;
GameObject answerText;
Component _text; // Текст, который надо вывести. Работает - в дебаге вижу текст.

int answerId;
string _answer;

public int AnswerId{ get{return answerId;} set{answerId=value;} }
public string _Answer{ get{return _answer;} set{_answer=value;} }


void Start()
{

Не работает - не может найти ссылку на объект.
/*
if (buttonNumber==1) answerButton = GameObject.Find("/Answer1Button/Text");
if (buttonNumber==2) answerButton = GameObject.Find("/Answer2Button/Text");
_text = answerButton.GetComponent<Text>();
_text.text=_answer; // Пишет - нет такого свойства.
*/




// Работает, но выводит текст только на первой кнопке.
// И это понятно т.к. всегда будет найден один и тот же компонент Text (мы ведь не указали, где искать этот вложенный компонент Answer1Button/Text вот и выводит первый попавшийся)
Debug.Log("Start "+buttonNumber);
var gameObject = GameObject.Find("Text");
var component = gameObject.GetComponent<Text>();
component.text=_answer;
Debug.Log("Ответ="+_answer);

}
 


Как вывести текст на кнопке? Как "достучаться" до вложенного объекта Text?
По идее, наверно даже не надо обращаться через /Answer1Button/Text т.к. Text, на который мы хотим получить ссылку - это вложенный компонент Button.
Просто "сказать" скрипту - найди у объекта, к которому ты привязан, вложенный компонент Text. И присвой есу текст.
Как то так...
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как вывести свой текст на каждой кнопке?

Сообщение Saltant 07 окт 2022, 15:09

Синтаксис:
Используется csharp
buttonObject.transform.GetChild(0).GetComponent<TextMeshProUGUI>().SetText("какой то текст");
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Как вывести свой текст на каждой кнопке?

Сообщение EIvanov 07 окт 2022, 15:54

buttonObject.transform.GetChild(0).GetComponent<TextMeshProUGUI>().SetText("какой то текст");


if (buttonNumber==1) answerButton = GameObject.Find("/Answer1Button/Text");
if (buttonNumber==2) answerButton = GameObject.Find("/Answer2Button/Text");
answerButton.transform.GetChild(0).GetComponent<Text>().SetText("какой то текст");

Assets\Scenes\EventScene\AnswerButton.cs(37,57): error CS1061: 'Text' does not contain a definition for 'SetText' and no accessible extension method 'SetText' accepting a first argument of type 'Text' could be found (are you missing a using directive or an assembly reference?)
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как вывести свой текст на каждой кнопке?

Сообщение Alkos26Rus 07 окт 2022, 17:35

EIvanov писал(а):_text.text=_answer; // Пишет - нет такого свойства.

все там есть, шо то ты напутал

EIvanov писал(а):Не работает - не может найти ссылку на объект.
/*
if (buttonNumber==1) answerButton = GameObject.Find("/Answer1Button/Text");

ты что путь вбил что ли? Тут просто имя объекта на сцене нужно
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как вывести свой текст на каждой кнопке?

Сообщение EIvanov 07 окт 2022, 17:42

все там есть, шо то ты напутал


Синтаксис:
Используется csharp
public class AnswerButton : MonoBehaviour
{
public int buttonNumber;
GameObject answerButton;
GameObject answerText;
Component _text;


void Start()
{

// Код 1.
/*
if (buttonNumber==1) answerButton = GameObject.Find("/Answer1Button/Text");
if (buttonNumber==2) answerButton = GameObject.Find("/Answer2Button/Text");
_text = answerButton.GetComponent<Text>(); // error CS1061: 'Component' does not contain a definition for 'text' and no accessible extension method 'text' accepting a first argument of type 'Component' could be found (are you missing a using directive or an assembly reference?)
_text.text=_answer;
*/


// Код 2.
/*
if (buttonNumber==1) answerButton = GameObject.Find("Answer1Button");
if (buttonNumber==2) answerButton = GameObject.Find("Answer2Button");
answerButton.transform.GetChild(0).GetComponent<Text>().SetText("какой то текст"); // error CS1061: 'Text' does not contain a definition for 'SetText' and no accessible extension method 'SetText' accepting a first argument of type 'Text' could be found (are you missing a using directive or an assembly reference?)
*/


// Код 3. - Работает.
Debug.Log("Start "+buttonNumber);
var gameObject = GameObject.Find("Text");
var component = gameObject.GetComponent<Text>();
component.text=_answer;
Debug.Log("Ответ="+_answer);

 
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как вывести свой текст на каждой кнопке?

Сообщение EIvanov 08 окт 2022, 10:29

Разобрался.
Так как тип любого объекта на сцене GameObject (надеюсь, я прав), то по аналогии я предполагал, что тип любого компонента Component.

Что и писал в коде.
Я изначально предполагал, что
Синтаксис:
Используется csharp
Component _text; // А должен быть Text.
 


Как я понимаю, это не так. У каждого компонента свой тип.
И пока я писал
Синтаксис:
Используется csharp
var component = gameObject.GetComponent<Text>();
 

всё работало. Я даже не задумывался о Object.GetType, думая что тип любого компонента Component.
А вот при инициализации полей, у меня всё и перестало работать и пошли ошибки 'Text' does not contain a definition for 'SetText' ...
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как вывести свой текст на каждой кнопке?

Сообщение Saltant 08 окт 2022, 13:55

EIvanov писал(а):
buttonObject.transform.GetChild(0).GetComponent<TextMeshProUGUI>().SetText("какой то текст");


if (buttonNumber==1) answerButton = GameObject.Find("/Answer1Button/Text");
if (buttonNumber==2) answerButton = GameObject.Find("/Answer2Button/Text");
answerButton.transform.GetChild(0).GetComponent<Text>().SetText("какой то текст");

Assets\Scenes\EventScene\AnswerButton.cs(37,57): error CS1061: 'Text' does not contain a definition for 'SetText' and no accessible extension method 'SetText' accepting a first argument of type 'Text' could be found (are you missing a using directive or an assembly reference?)

Вместо TextMeshProUGUI бери просто Text раз у тебя там он а не текстмешпро и вместо метода SetText вызывай просто .text = "какой то текст."
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29