Creare Videogiochi - Game Developer

Versione completa: [C#] Dubbio concettuale su Array di oggetti
Al momento stai visualizzando i contenuti in una versione ridotta. Visualizza la versione completa e formattata.
Cialve,
le cose son 2, o son troppo stanco in questo momento, oppure c'è qualcosa che mi sfugge a livello concettuale.
Il problema è questo, sto facendo uno script C# in unity, con cui prendo un oggetto 'Ray' di partenza e creo un array di 5 elementi che inizializzo tutti come copie del raggio iniziale. Poi applico ad elemento dell'Array un modificatore del campo 'origin', alcuni variati nelle ordinate, altri nelle ascisse.
Però mi sputa addosso questo errore:
"Cannot modify a value type return value of `UnityEngine.Ray.origin'. Consider storing the value in a temporary variable"

allego anche il frammento di codice incriminato:

Codice:
Ray[] r = new Ray[5];
for(int i=0; i<5; i++) {
    r[i] = firstRay;
}
r[1].origin.x += widthMargin*0.05;
r[2].origin.x -= widthMargin*0.05;
r[3].origin.y += heightMargin*0.05;
r[4].origin.y -= heightMargin*0.05;

Thx in anticipo.
Ciao
Hai provato ha creare una variabile temporanea?
Prova a fare questa piccola modifica:

Codice:
Vector2 rayPos = r[1].origin;
rayPos.x += widthMargin*0.05;
r[1].origin = rayPos;

Non sono sicuro che funzioni ma comunque provare non costa nulla Smile

P.S. Naturalmente devi farlo per tutte e 4 le righe
Quell'errore succede perché il Vector3 origin è una struct: in C# non puoi modificare il valore di una struct, devi ricostruirla. In compenso le struct sono allocate nello stack, quindi sono più veloci.
Per fare quello che vuoi tu devi fare qualcosa di questo tipo:

Codice:
Ray[] r = new Ray[5];
for(int i=0; i<5; i++) {
    r[i] = firstRay;
}
r[1].origin += new Vector3(widthMargin*0.05f, 0.0f);
r[2].origin -= new Vector3(widthMargin*0.05f, 0.0f);
r[3].origin += new Vector3(0.0f, heightMargin*0.05f);
r[4].origin -= new Vector3(0.0f, heightMargin*0.05f);


PS.
Non conosco C# quindi non prendere per oro tutto ciò che ti dico, se non sei convinto di qualcosa chiedi ulteriori spiegazioni o approfondisci con google o sul tuo libro.
(29-10-2013, 10:29 PM)steve Ha scritto: [ -> ]Quell'errore succede perché il Vector3 origin è una struct: in C# non puoi modificare il valore di una struct, devi ricostruirla. In compenso le struct sono allocate nello stack, quindi sono più veloci.
Per fare quello che vuoi tu devi fare qualcosa di questo tipo:

Codice:
Ray[] r = new Ray[5];
for(int i=0; i<5; i++) {
    r[i] = firstRay;
}
r[1].origin += new Vector3(widthMargin*0.05f, 0.0f);
r[2].origin -= new Vector3(widthMargin*0.05f, 0.0f);
r[3].origin += new Vector3(0.0f, heightMargin*0.05f);
r[4].origin -= new Vector3(0.0f, heightMargin*0.05f);


PS.
Non conosco C# quindi non prendere per oro tutto ciò che ti dico, se non sei convinto di qualcosa chiedi ulteriori spiegazioni o approfondisci con google o sul tuo libro.


E' corretto... proprio ieri sera sono arrivato a scrivere la stessa cosa trovando su google che era necessario riassegnare con un vector3.
Ora funge tutto Smile