Biorąc pod uwagę następujące dwa wektory:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
Ta linia jest niejednoznaczna:
v3 += v2; // Unity reports dimension ambiguity
podczas gdy to zadanie nie jest:
v3 = v2; // Unity assigns despite different dimensions
Dlaczego to?
Odpowiedzi:
Pełny komunikat o problemie:
Unity umożliwił niejawną konwersję a
Vector3
naVector2
vice versa. Powoduje to niejednoznaczność w twoim przypadku, ponieważ można zastosować oba operatory +.W tej operacji możesz przesłać swoje
Vector2
polecenieVector3
jawnie, aby kompilator wiedział, jak go używaćUnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)
.Jeśli jesteś ciekawy, dokumenty Microsoft dotyczące tego konkretnego błędu są tutaj .
Edytuj po edycji:
Vec3 += Vec2
jest niejednoznaczny z tego samego powodu opisanego powyżej. Wyobraź sobie,Vec3 += Vec2
że tak naprawdę jestVec3 = Vec3 + Vec2
.Vec3 + Vec2
może dać jednoVector2
iVector3
jako odpowiedź z powodu niejawnych konwersji, dlatego musisz określić, co chcesz.Vec3 = Vec2
nie jest niejednoznaczny, ponieważ Vec2 jest domyślnie konwertowany na a,Vector3
a następnie przypisywany do początkowej Vec3. Tak więc cała operacja jest naprawdęVector3 = Vector3
bez koniecznościVector3
ręcznego przesyłania Vec2 .źródło
Pozwól mi zmienić nazwę vars (dla jasności):
Odpowiedź
Jest to spowodowane odcinkiem
pos3d + pos2d
linii. Ta część jest naprawdę dwuznaczna, podczas gdy+=
nie jest. Pozwól mi wyjaśnić, dlaczego jedno i dlaczego drugie.Analiza 1
W tej linii
kompilator najpierw próbuje ocenić wyrażenie
pos3d + pos2d
przed kontynuowaniem, niezależnie od tego, gdzie wynik ma zostać umieszczony.Aby to zrobić, system najpierw próbuje znaleźć dowolną publiczną funkcję statyczną, która dodaje Vector3 i Vector2, na przykład tę możliwą sygnaturę:
lub na przykład ten możliwy podpis:
Niemniej jednak w interfejsie API nie ma żadnych tych podpisów, więc kompilator próbuje „rzutować” parametry na znane podpisy.
Następnie kompilator znajduje te dwa potencjalne podpisy:
Są one udokumentowane tutaj: http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html i tutaj: http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
Istnieją więc dwie możliwości:
Aby oba castingi były możliwe, pos2d można rzutować na Vector3, a pos3d jest castabale na Vector2, kompilator następnie znajduje możliwe sposoby na skompilowanie tego samego kodu źródłowego (pod warunkiem, że automatyczne ukryte castingi są na miejscu).
Możliwe jest albo rzutowanie pos3d na Vector2 i przejście do drugiego podpisu, albo albo rzutowanie pos2d na Vector3 i przejście do pierwszego podpisu.
Gdy wyrażenie
pos3d + pos2d
jest oceniane najpierw, zanim weźmie się pod uwagę „gdzie zostanie zastosowany wynik”, kompilator nie wie, jaką obsadę - jak programista - wykona.Jeśli chcesz przejść do 3D, możesz napisać to:
problem zniknął, ponieważ teraz jest jasne: najpierw przenieś pos2d do innego obiektu typu Vector3, a następnie wykonaj sumę Vector3 + Vector3. Pod warunkiem, że istnieje ten podpis statyczny
dostępne, ten będzie używany bez żadnych dwuznaczności.
Analiza 2
Z drugiej strony, kiedy to zrobisz
nie ma dwuznaczności: pierwsza linia przypisuje Vector3 do Vector3 (bez wątpliwości).
Druga linia odpowiada
ze szczególnym uwzględnieniem transform.position jest oceniany tylko raz, dlatego też brany jest pod uwagę typ, jak można zobaczyć na tej stronie Microsoft o
+=
operatorze:https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Ponadto napisano: „Operatora + = nie można bezpośrednio przeciążać, ale typy zdefiniowane przez użytkownika mogą przeciążać operatora + (patrz operator)”. więc powinniśmy myśleć
Vector3
„s+=
operator działa w sposób opisany przez Microsoft, gdzie jest napisane:więc możemy być pewni, że drugie podejście wywołuje operand +
Vector3
klasy, który ma podpis:więc nie ma innego sposobu na osiągnięcie tego niż konwersja pos2d w Vector3 dzięki ukrytej obsadzie ukrytej, która nie może mieć innej formy.
Mam nadzieję na pomoc !!
Edytować
W
Unity 5.0.1f1 Personal
zMonoDevelop-Unit 4.0.1
, jak mówi Alex M., linie:wciąż rzucam błąd
"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)'"
tak naprawdę + = używa obu podpisów
bez względu na to, że już wiem „gdzie” wynik powinien zostać umieszczony (chyba dlatego, że wypisanie Vector2 jest możliwe do rzucenia do miejsca docelowego (Vector3) i jeśli prawdopodobnie nie byłoby to możliwe, kompilator wybrałby ten z właściwym Typ wyjścia).
Dzięki za punkt Alex M.
źródło
+=
też nie działa, to wciążVector3
+Vector2
. Zobacz moją odpowiedź.pos3d += pos2d
(zgodnie z edytowanym pytaniem) kończy się niepowodzeniem, aletransform.position += pos2d
kompiluje (zgodnie z komentarzem powyżej)? Wydawałoby się dziwne, jakie.position
jestVector3
- Nie mogę wyraźnie zobaczyć, czy o to ci chodzi.