Dados os dois vetores a seguir:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
Esta linha é ambígua:
v3 += v2; // Unity reports dimension ambiguity
embora esta tarefa não seja:
v3 = v2; // Unity assigns despite different dimensions
Por que é isso?
Respostas:
Mensagem completa:
A unidade forneceu uma maneira de converter implicitamente a
Vector3
para aVector2
e vice-versa. Isso causa uma ambiguidade no seu caso, porque os dois operadores podem ser aplicados.Elenco sua
Vector2
a umVector3
explicitamente nessa operação, de modo que o compilador sabe usarUnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)
.Se você estiver curioso, os documentos da Microsoft para esse erro específico estão aqui .
Edite após sua edição:
Vec3 += Vec2
é ambígua pelo mesmo motivo descrito acima. ImagineVec3 += Vec2
estar de fatoVec3 = Vec3 + Vec2
.Vec3 + Vec2
pode render tantoVector2
eVector3
como resposta devido a conversões implícitas, é por isso que você precisa especificar o que deseja.Vec3 = Vec2
não é ambíguo porque o Vec2 é implicitamente convertido em aVector3
e depois atribuído ao Vec3 inicial. Portanto, toda a operação é realmenteVector3 = Vector3
sem que você precise converter o Vec2Vector3
manualmente.fonte
Deixe-me renomear os vars (para maior clareza):
Responda
É por causa da seção
pos3d + pos2d
da linha. Esta parte é realmente ambígua enquanto a+=
não é. Deixe-me esclarecer por que um e por que o outro.Análise 1
Nesta linha
o compilador primeiro tenta avaliar a expressão
pos3d + pos2d
antes de continuar, independentemente de onde o resultado será colocado.Para fazer isso, o sistema primeiro tenta encontrar qualquer função estática pública que adicione um Vector3 mais um Vector2, por exemplo, esta possível assinatura:
ou, por exemplo, esta possível assinatura:
No entanto, não há nenhuma dessas assinaturas na API; portanto, o compilador tenta "converter" parâmetros em assinaturas conhecidas.
Em seguida, o compilador encontra essas duas assinaturas em potencial:
Eles estão documentados aqui: http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html e aqui: http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
Portanto, existem duas possibilidades:
Portanto, como ambas as peças fundidas são possíveis, o pos2d pode ser fundido em um Vector3 e o pos3d é fundido em um Vector2, o compilador encontra maneiras possíveis de compilar o mesmo código fonte (desde que as fundições ocultas automáticas estejam no lugar).
É possível converter pos3d no vetor2 e prosseguir com a segunda assinatura, ou converter pos2d no vetor3 e prosseguir com a primeira assinatura.
Como a expressão
pos3d + pos2d
é avaliada primeiro, antes de levar em consideração "onde o resultado será aplicado", o compilador não sabe qual conversão você - como codificador - gostaria de executar.Se você deseja avançar para o 3D, pode escrever o seguinte:
e o problema desapareceu, como agora está claro: primeiro mova pos2d para outro objeto do tipo Vector3, depois faça a soma de Vector3 + Vector3. Desde que exista essa assinatura estática
disponível, esse será usado sem nenhuma ambiguidade.
Análise 2
Por outro lado, quando você faz
não há ambiguidade: a primeira linha atribui um Vector3 a um Vector3 (sem dúvida).
A segunda linha é equivalente a
com a particularidade, o transform.position é avaliado apenas uma vez e, portanto, o tipo é levado em consideração, como você pode ver nesta página da Microsoft sobre o
+=
operador:https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Além disso, diz "O operador + = não pode ser sobrecarregado diretamente, mas os tipos definidos pelo usuário podem sobrecarregar o operador + (consulte operador)". por isso, devemos pensar que o
Vector3
's+=
operador atua como descrito pela Microsoft, onde ele diz:para ter certeza de que a segunda abordagem chama o operando + da
Vector3
classe, que tem a assinatura:portanto, não há outra maneira de conseguir isso além da conversão do pos2d em um Vector3, graças a uma conversão oculta implícita que não pode ter outra forma.
Espero ajudar !!
Editar
Em
Unity 5.0.1f1 Personal
comMonoDevelop-Unit 4.0.1
, como Alex M. diz, as linhas:ainda lança o erro
"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)'"
então realmente o + = está usando as duas assinaturas
independentemente do fato de já saber "onde" o resultado deve ser colocado (acho que porque a saída de um Vector2 é passível de conversão para o destino (Vector3)) e se essa conversão não foi possível, provavelmente, talvez, o compilador escolheria aquele com a devida tipo de saída).
Obrigado pelo ponto Alex M.
fonte
+=
também não funciona, ainda é umVector3
+Vector2
. Veja minha resposta.pos3d += pos2d
(conforme sua pergunta editada) falha, mastransform.position += pos2d
compila (conforme seu comentário acima) ?? Parece estranho como.position
éVector3
- Não é possível ver claramente se é isso que você está querendo dizer.