Добавление текста в общедоступный класс C # и unity

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