Étant donné les deux vecteurs suivants:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
Cette ligne est ambiguë:
v3 += v2; // Unity reports dimension ambiguity
alors que cette mission n'est pas:
v3 = v2; // Unity assigns despite different dimensions
Pourquoi est-ce?
Réponses:
Message de problème complet:
Unity a fourni un moyen de convertir implicitement a
Vector3
en aVector2
et vice-versa. Cela provoque une ambiguïté dans votre cas car les deux opérateurs + peuvent être appliqués.Castez votre
Vector2
versVector3
explicitement dans cette opération, afin que le compilateur sache comment l'utiliserUnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)
.Si vous êtes curieux, les documents de Microsoft pour cette erreur spécifique sont ici .
Modifier après votre modification:
Vec3 += Vec2
est ambigu pour la même raison que celle décrite ci-dessus. ImaginezVec3 += Vec2
être en faitVec3 = Vec3 + Vec2
.Vec3 + Vec2
peut donner les deuxVector2
etVector3
comme réponse en raison de conversions implicites, c'est pourquoi vous devez spécifier ce que vous voulez.Vec3 = Vec2
n'est pas ambigu car Vec2 est implicitement converti en aVector3
puis affecté au Vec3 initial. Donc, toute l'opération est vraimentVector3 = Vector3
sans que vous ayez à transtyper Vec2Vector3
manuellement.la source
Permettez-moi de renommer les vars (pour plus de clarté):
Réponse
C'est à cause de la section
pos3d + pos2d
de la ligne. Cette partie est vraiment ambiguë alors que ce+=
n'est pas le cas. Permettez-moi de clarifier pourquoi l'un et pourquoi l'autre.Analyse 1
Dans cette ligne
le compilateur essaie d'abord d'évaluer l'expression
pos3d + pos2d
avant de continuer, quel que soit l'endroit où le résultat va être placé.Pour ce faire, le système essaie d'abord de trouver toute fonction statique publique qui ajoute un Vector3 plus un Vector2, par exemple cette signature possible:
ou par exemple cette signature possible:
Néanmoins, il n'y a aucune de ces signatures dans l'API, donc le compilateur essaie de «transtyper» les paramètres en signatures connues.
Ensuite, le compilateur trouve ces deux signatures potentielles:
Ceux-ci sont documentés ici: http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html et ici: http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
Il y a donc deux possibilités:
Donc, comme les deux castings sont possibles, pos2d peut être casté en un Vector3 et pos3d est castabale en un Vector2, le compilateur trouve ensuite des façons possibles de compiler le même code source (à condition que des castings cachés automatiques soient en place).
Il est possible de transposer pos3d dans Vector2 et de procéder à la deuxième signature, ou de transposer pos2d dans Vector3 et de procéder à la première signature.
Comme l'expression
pos3d + pos2d
est évaluée en premier, avant de prendre en considération "où le résultat sera appliqué", alors le compilateur ne sait pas quel casting souhaitez-vous, en tant que codeur, qu'il souhaite effectuer.Si vous voulez vous diriger vers la 3D, vous pouvez écrire ceci:
et le problème a disparu, comme maintenant il est clair: déplacez d'abord pos2d dans un autre objet de type Vector3, puis faites la somme de Vector3 + Vector3. Pourvu qu'il y ait cette signature statique
disponible, celui-ci sera utilisé sans aucune ambiguïté.
Analyse 2
D'un autre côté, quand vous faites
il n'y a pas d'ambiguïté: la première ligne assigne un Vector3 à un Vector3 (pas de doute).
La deuxième ligne équivaut à
avec la particularité que transform.position n'est évalué qu'une seule fois, et donc le type est pris en considération, comme vous pouvez le voir dans cette page Microsoft sur l'
+=
opérateur:https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Il indique en outre "L'opérateur + = ne peut pas être surchargé directement, mais les types définis par l'utilisateur peuvent surcharger l'opérateur + (voir opérateur)." nous devons donc penser que le
Vector3
l »+=
opérateur agit comme décrit par Microsoft où il est dit:nous pouvons donc être sûrs que la deuxième approche invoque l'opérande + de la
Vector3
classe, qui a la signature:il n'y a donc pas d'autre moyen d'y parvenir que de convertir le pos2d en un Vector3 grâce à une distribution cachée implicite qui ne peut pas être d'une autre forme.
Au plaisir d'aider !!
Éditer
En
Unity 5.0.1f1 Personal
avecMonoDevelop-Unit 4.0.1
, comme Alex M. dit, les lignes:jette toujours l'erreur
"Assets/Scripts/CubeScript.cs(15,27): error CS0121: The call is ambiguous between the following methods or properties: 'UnityEngine.Vector2.operator +(UnityEngine.Vector2, UnityEngine.Vector2)' and 'UnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)'"
donc vraiment le + = utilise les deux signatures
indépendamment du fait de savoir déjà "où" le résultat doit être placé (je suppose que la sortie d'un Vector2 peut être casté vers la destination (Vector3) et si ce cast n'était pas possible probablement, peut-être, le compilateur choisirait celui avec le bon le type de sortie).
Merci pour le point Alex M.
la source
+=
ne fonctionne pas non plus, c'est toujours unVector3
+Vector2
. Voir ma réponse.pos3d += pos2d
(selon votre question modifiée) échoue maistransform.position += pos2d
compile (selon votre commentaire ci-dessus) ?? Semble bizarre que.position
estVector3
- ne peut pas voir clairement si c'est ce que vous sens.