Даны следующие два вектора:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
Эта строка неоднозначна:
v3 += v2; // Unity reports dimension ambiguity
пока это назначение не:
v3 = v2; // Unity assigns despite different dimensions
Почему это?
Ответы:
Полное сообщение о проблеме:
Unity предоставил способ неявного преобразования a
Vector3
в aVector2
и наоборот. Это вызывает двусмысленность в вашем случае, потому что оба оператора + могут быть применены.Отдайте свой
Vector2
кVector3
явно в этой операции, так что компилятор знает использоватьUnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)
.Если вам интересно, документы Microsoft для этой конкретной ошибки здесь .
Редактировать после редактирования:
Vec3 += Vec2
является неоднозначным по той же причине, описанной выше. Представь,Vec3 += Vec2
что ты на самом делеVec3 = Vec3 + Vec2
.Vec3 + Vec2
может давать какVector2
иVector3
в ответ в результате неявных преобразований, поэтому вы должны указать, что вы хотите.Vec3 = Vec2
не является двусмысленным, потому что Vec2 неявно преобразуется в a,Vector3
а затем назначается начальному Vec3. Таким образом, вся операция на самом делеVector3 = Vector3
без необходимостиVector3
вручную приводить Vec2 .источник
Позвольте мне переименовать переменные (для ясности):
Ответ
Это из-за сечения
pos3d + pos2d
линии. Эта часть действительно неоднозначна, в то время+=
как нет. Позвольте мне уточнить, почему одно и почему другое.Анализ 1
В этой строке
компилятор сначала пытается вычислить выражение,
pos3d + pos2d
прежде чем продолжить, независимо от того, куда будет помещен результат.Для этого система сначала пытается найти любую общедоступную статическую функцию, которая добавляет Vector3 плюс Vector2, например, такую возможную сигнатуру:
или, например, эта возможная подпись:
Тем не менее, в API нет ни одной из этих сигнатур, поэтому компилятор пытается «привести» параметры к известным сигнатурам.
Затем компилятор находит эти две потенциальные сигнатуры:
Они описаны здесь: http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html и здесь: http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html.
Итак, есть две возможности:
Так как возможны оба приведения, pos2d может быть преобразован в Vector3, а pos3d - в Vector2, компилятор затем находит возможные способы компиляции одного и того же исходного кода (при условии наличия автоматических скрытых приведений).
Можно либо привести pos3d в Vector2 и перейти ко второй подписи, либо привести pos2d в Vector3 и перейти к первой подписи.
Поскольку выражение
pos3d + pos2d
вычисляется в первую очередь, прежде чем принимать во внимание «где будет применен результат», тогда компилятор не знает, какое приведение вы, как кодер, хотели бы выполнить.Если вы хотите перейти к 3D, вы можете написать это:
и проблема исчезла, как теперь понятно: сначала переместите pos2d в другой объект типа Vector3, затем выполните суммирование Vector3 + Vector3. При условии, что есть эта статическая подпись
доступно, что один будет использоваться без двусмысленности вообще.
Анализ 2
С другой стороны, когда вы делаете
нет никакой двусмысленности: первая строка назначает Vector3 в Vector3 (без сомнения).
Вторая строка эквивалентна
с учетом специфики transform.position оценивается только один раз, и поэтому принимается во внимание тип, как вы можете видеть на этой странице Microsoft об
+=
операторе:https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Кроме того, в нем говорится: «Оператор + = не может быть перегружен напрямую, но пользовательские типы могут перегружать оператор + (см. Оператор)». поэтому мы должны думать, что оператор
Vector3
s+=
действует так, как описано в Microsoft, где он говорит:поэтому мы можем быть уверены, что второй подход вызывает операнд +
Vector3
класса, который имеет сигнатуру:так что нет другого способа добиться этого, кроме как преобразовать pos2d в Vector3 благодаря неявному скрытому приведению, которое не может быть в любой другой форме.
Надеюсь помочь !!
редактировать
В связи
Unity 5.0.1f1 Personal
с темMonoDevelop-Unit 4.0.1
, как говорит Алекс М., строки:все еще наложил ошибку
"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)'"
так что на самом деле + = использует обе подписи
независимо от того, что уже известно, «где» результат должен быть помещен (я полагаю, что вывод Vector2 можно преобразовать в место назначения (Vector3), и, возможно, если это приведение было невозможно, возможно, компилятор выберет тот, который имеет тип выхода).
Спасибо за точку зрения Алекс М.
источник
+=
тоже не работает, все равноVector3
+Vector2
. Смотри мой ответ.pos3d += pos2d
(согласно вашему отредактированному вопросу) происходит сбой, ноtransform.position += pos2d
компилируется (согласно вашему комментарию выше) ?? Казалось бы странно, как.position
естьVector3
- не могу ясно понять, если это то, что вы имеете в виду.