x


Can I define initial variable for serialized array in the inspector?

Here is my example code.

[System.Serializable] public class Test { public int p; public float v; public Color c;

 public Test()
 {
     p = 2;
     v = 4.4f;
     c = Color.yellow;
 }

}

public class Example : MonoBehaviour { public Test test;

 public Test[] testArray;

}

The result is that test and testArray variables are editable in the inspector. test is properly started with initial value in the constructor of Test class. But for testArray, when I edit array size in the inspector, the initial value of those variables are always system default. (p = 0, v = 0, c = Color.black) It isn't used the initial value in the constructor. I've already tried to define value in the declaration part but it doesn't help. Is there a way to work around this problem? This is just a test code. I intend to have many more editable variables in the class. Without initial value, it would be a pain to edit all of those variables again and again when increasing the array in the inspector.

more ▼

asked Sep 09, 2010 at 08:50 PM

jjobby gravatar image

jjobby
477 87 74 92

(comments are locked)
10|3000 characters needed characters left

3 answers: sort voted first

Possible using the constructor:

public class Example : MonoBehaviour { public Test test;

 public Test[] testArray;

 public Example()
 {
     Test a = new Test();
     a.p = 5;
     Test b = new Test();
     b.p = 100;
     testArray = new Test[] { a, b };  //your array will start with a and b in the inspector by default
 }

}

Note: using the constructor for monobehaviours is usually a bad idea, but this is one place that it'll work well, as it'll create the array before the deserializer adds in any values. It will however mean that the array is assigned twice at runtime - You can however comment/remove the code before making a final build though

more ▼

answered Sep 24, 2010 at 03:10 PM

Mike 3 gravatar image

Mike 3
33.2k 21 88 297

(comments are locked)
10|3000 characters needed characters left

No. Array values must be initialized manually. If you have Test[], the type is actually "Array of Tests", which is not the same as a "Test". Anytime you have an array, each cell has to be initialized independently. Unity handles this for you because of the inspector, so it just assigns the default/null values to the type. If you want to be able to control the values, or assign them via the constructor, you need to do something like this:

public Test[] arr;

void Start() { arr = new Test[10]; foreach(Test t in arr) { t = new Test(); } }

That will initialize all of the values in the array. Unity does not do this for you, as far as I know.

more ▼

answered Sep 09, 2010 at 08:57 PM

qJake gravatar image

qJake
12.7k 92 139 220

Ahh... But I want it to be editable by user before the script is run. The script will use those value to do the work. So, doing the initialize in Start() isn't something I want to do. Well, if I can't initialize value for the array then I think that I will write the script to check if the value is left zero or not. If so then it will be reset to my default value in Start()

Thanks for the answer!

Sep 09, 2010 at 09:26 PM jjobby

One option might be to create a custom inspector for your class. You could display the default inspector, but also (for example) include a control that would initialize the array elements to the desired values.

Sep 10, 2010 at 12:17 AM Jesse Anders
(comments are locked)
10|3000 characters needed characters left

This is how you do it. When Unity creates the 'myStrings' property for viewing in the inspector, it will call the ArrayInitializer() constructor, assigning the default values you pass as parameter:

 public MyClass : MonoBehavior
 {
     [System.Serializable]
     public class ArrayInitializer
     {
         public string[] values;
         public ArrayInitializer(string[] defaults) { values = defaults; }
     }
 
     public ArrayInitializer myStrings = new ArrayInitializer(new string[]{"a", "b", "c"});
 }
more ▼

answered Jul 30 at 09:51 AM

standardcombo gravatar image

standardcombo
31 3 2 4

You can go as far as overloading the [] and adding a Length getter so its transparent from the point of view of the code using the property, so you don't have to go through .values each time.

Jul 30 at 10:15 AM standardcombo
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x4998
x2284
x435

asked: Sep 09, 2010 at 08:50 PM

Seen: 3572 times

Last Updated: Jul 30 at 10:15 AM