#c# #unity3d
#c# #unity3d
Вопрос:
Я хочу добавить текст в класс, созданный в моем коде. Моя проблема в том, что он не распознает текст и не добавляется. В созданном классе есть 3 раздела, которые заполняются по порядку в 3 части, но основная проблема заключается в том, что текст не добавляется в класс c1.set1 Этот код выполняется в Unity. Также кодируется с помощью Visual 2017. Надеюсь, я прояснил проблему.
using System;
[Serializable]
public class c1
{
public string set1;
public string set2;
public string set3;
}
public class stringToArray : MonoBehaviour
{
public string[] S1;
public c1[] c1_item;
public int x;
// Start is called before the first frame update
void Start()
{
S1 = new string[20];// It works properly
while (x<10)
{
S1[x]= string.Format("ok " x,x);
x ;
}
c1_item = new c1[20];
while (x < 10)
{
//S1[x] = string.Format("ok " x, x); // It works properly
c1_item[x].set1 = string.Format("ok " x , x); // It does not work properly
x ;
}
}
}
Кто-нибудь знает, что делать?
Комментарии:
1. Когда вы переходите к while для c1_item, x по- прежнему устанавливается равным 10 из цикла S1.
2. Да, это правда, но даже если это так, это все равно неправильно ` void Start() {S1 = новая строка [10]; // Он работает правильно, пока (x<10) {S1[x]= строка. Формат («ok» x,x); x ; } x = 0; c1_item = новый c1[10]; в то время как (x < 10) { //S1[x] = строка. Формат («ok» x, x); // Он работает правильно c1_item[x].set1 = строка. Формат («ok » x , x); // Он не работает должным образом x ; } } ` Моя главная цель — c1_item[x].set1 = ????? раздел для правильной работы
3. Пожалуйста, добавьте / отредактируйте код в свой OP, чтобы мы могли его прочитать.
Ответ №1:
Итак, ваша проблема в том, что вы на самом деле не создали c1
объекты для хранения своих значений, вы создали только c1_items
массив для хранения ссылок на объекты.
void Start() {
// 'string' is (treated as) a value type, does not need to be initialised
S1 = new string[20];// It works properly
while (x < 10) {
S1[x] = string.Format("ok " x, x);
x ;
}
x = 0; // reset x
// !! CAUSE: 'c1' is a reference type (class), it only holds references and not actual objects
c1_item = new c1[20];
while (x < 10) {
// !! FIX: MUST add the object first
if (c1_item[x] == null) c1_item[x] = new c1();
c1_item[x].set1 = string.Format("ok " x, x); // It does not work properly
x ;
}
}
Что может быть сложным, так это то, что вы установили c1_item
as public
, что означает, что Unity создаст экземпляр и будет управлять всеми необходимыми объектами в массиве. Проблема здесь в том, что вы стираете это и создаете свой собственный array ( new c1[]
) , что означает, что вы также должны быть тем, кто добавляет объекты.
(Следует отметить, что если бы ваш c1
был a struct
вместо a class
, этого бы не произошло)
Ответ №2:
прежде всего, с помощью UnityEngine; может быть полезно, поэтому не всегда удаляйте его, вам также нужно использовать System.Коллекции; и использование System.Коллекции.Универсальный; для использования списков и массивов. Я рекомендую вам инициировать S1 перед запуском, я имею в виду, в методе awake.
public int x = 0; // doesn't hurt to give it a value
вам также нужно, чтобы x был положительным, да? потому что это будет индекс в списке строк, поэтому используйте range и проверьте x перед работой с ним, пример :
[Range(0,20)]
public int x = 0;
Или
void Start()
{
if(x>=0){
//do code
}
}
Теперь, почему ваша строка кода не работает
c1_item[x].set1 = string.Format("ok " x , x); // It does not work properly
Я рекомендую использовать это
if(c1_item.Length >= x){
c1 newC1 = c1_item[x];
newC1.set1 = string.Format("ok " x , x);}