x


multidimensional builtin vector3 array?

I know I can use this helper script in order to create multidimensional builtin arrays in Unity Javascript -- but can I create multidimensional builtin VECTOR3 arrays? I don't know C# so I tried tinkering with the helper script to no avail.

As a side question, are multidimensional builtin arrays as fast in Unity as single-dimensional builtin arrays? I'd rather have performance and a little extra coding...

more ▼

asked Aug 05 '10 at 12:01 PM

robinking gravatar image

robinking
756 61 68 81

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

3 answers: sort voted first

Sure, you'd probably simply add this static method to the C# script:

public static Vector3[,] Vector3Array (int a, int b) {
    return new Vector3[a,b];
}

... so that would be for a 2-dimensional one ... for 3-dimensional, you'd add:

public static Vector3[,,] Vector3Array (int a, int b, int c) {
    return new Vector3[a,b,c];
}

Regarding the question of performance: I'm pretty sure there is no performance difference between one-dimensional arrays and multi-dimensional ones. Of course, creating those arrays will likely take a little longer because usually they have more "space" so more memory needs to be allocated and managed. But writing/reading into/from those arrays shouldn't take a significant amount of time.

Of course, it depends on how "much" you do of it. As a rule of thumb: If it's just once per frame: Don't worry. If you're looping or doing nested loops in each frame: Watch out.

As with anything that has to do with performance: "Premature optimization is the root of all evil" (Donald Knuth). See also: Wikipedia: Program Optimization - When to optimize

more ▼

answered Aug 05 '10 at 12:35 PM

jashan gravatar image

jashan
10.1k 25 40 116

I just tried that and got the following Console error:

Assets/Standard Assets/Scripts/MultiDim.cs(31,19): error CS0246: The type or namespace name `Vector3' could not be found. Are you missing a using directive or an assembly reference?

Aug 05 '10 at 01:23 PM robinking

@Robin King: you need to use the UnityEngine namespace for Unity-specific structs like Vector3.

Aug 05 '10 at 02:44 PM Eric5h5

Brilliant, that's something else I've learned about today. Thanks!

Aug 05 '10 at 03:41 PM robinking
(comments are locked)
10|3000 characters needed characters left

You can make a new class containing an array of vector3's

e.g.

class ThreeVecs
{
    var v3Arr : Vector3[] = new Vector3[3]; // Array of 3 x Vector3
    function ThreeVecs(){} // constructor - init the class variables here if you like
}

You can then create an array of ThreeVecs:

var multiArr : ThreeVecs[] = new ThreeVecs[10]; // Array of 10 ThreeVecs

multiArr[0] = new ThreeVecs(); 
multiArr[0].v3Arr[0] = Vector3(1,2,3);
multiArr[0].v3Arr[1] = Vector3(4,5,6);
multiArr[0].v3Arr[2] = Vector3(7,8,9);

Just one possible way. :)

[EDIT]

so a class to answer your question below and illustrate using the constructor to initialise:

class ThreeVecs
{
    var corner0 : Vector3;
    var corner1 : Vector3;
    var corner2 : Vector3;
    function ThreeVecs(c0 : Vector3, c1 : Vector3, c2 : Vector3)
    {
        corner0 = c0;
        corner1 = c1;
        corner2 = c2;
    }
}

var multiArr : ThreeVecs[] = new ThreeVecs[10]; // Array of 10 ThreeVecs

multiArr[0] = new ThreeVecs(Vector3(1,2,3), Vector3(4,5,6), Vector3(7,8,9)); 

Debug.Log(multiArr[0].corner0); //
more ▼

answered Aug 05 '10 at 12:41 PM

cncguy gravatar image

cncguy
1k 21 25 36

I think I understand it! Could I instead give the class three variables corner0, corner1 and corner2 - and then say... var multiArr : ThreeVecs[] = new ThreeVecs[10]; multiArr[0].corner0 = Vector3(1,2,3); ? I tried this and it doesn't work. Is it possible and I'm just getting the syntax wrong, or am I barking up the wrong SpeedTree?

Aug 05 '10 at 01:38 PM robinking

You can put whatever variables you like in the class. something like That should work - what errors are you getting?

Aug 05 '10 at 02:57 PM cncguy

oh I see - don't forget to do this: multiArr[0] = new ThreeVecs();

Aug 05 '10 at 02:59 PM cncguy

See you create an array of ThreeVecs but then you have to assign each ThreeVec object in the array with an instance of ThreeVec. Then you have to assign the class variables of each ThreeVec instance;

Aug 05 '10 at 03:01 PM cncguy

Of course you can use the class constructor to assign the variables when you create each instance

Aug 05 '10 at 03:02 PM cncguy
(comments are locked)
10|3000 characters needed characters left

Multi-dimensional arrays are slightly slower than 1-dimensional arrays. It's unlikely to make any difference in practice though.

more ▼

answered Aug 05 '10 at 02:43 PM

Eric5h5 gravatar image

Eric5h5
80.3k 42 132 521

(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:

x3460
x578
x29
x19

asked: Aug 05 '10 at 12:01 PM

Seen: 2632 times

Last Updated: Aug 05 '10 at 12:01 PM