次の2つのベクトルがあるとします。
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
この行があいまいです:
v3 += v2; // Unity reports dimension ambiguity
この割り当てはそうではありませんが:
v3 = v2; // Unity assigns despite different dimensions
どうしてこれなの?
次の2つのベクトルがあるとします。
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
この行があいまいです:
v3 += v2; // Unity reports dimension ambiguity
この割り当てはそうではありませんが:
v3 = v2; // Unity assigns despite different dimensions
どうしてこれなの?
回答:
完全な問題メッセージ:
エラーCS0121:次のメソッドまたはプロパティ間の呼び出しがあいまいです:
UnityEngine.Vector2.operator +(UnityEngine.Vector2, UnityEngine.Vector2)' and
UnityEngine.Vector3.operator +(UnityEngine.Vector3、UnityEngine.Vector3) '
Unityは、暗黙的にa Vector3
をaに、Vector2
またはその逆に変換する方法を提供しました。+演算子は両方とも適用できるため、これによりケースが曖昧になります。
あなたのキャスト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
Vec2をVector3
手動でキャストする必要がないため、操作全体が本当に可能です。
変数の名前を変更しましょう(わかりやすくするため):
Vector3 pos3d = new Vector3 (1f, 2f, 3f);
Vector2 pos2d = new Vector2 (1f, 2f);
それはpos3d + pos2d
ラインのセクションのためです。この部分はあいまいですが、あいまい+=
です。なぜ一方と他方の理由を明らかにしましょう。
この行で
transform.position = pos3d + pos2d;
コンパイラーpos3d + pos2d
は、結果がどこに配置されるかに関係なく、先に進む前に最初に式を評価しようとします。
これを行うには、システムはまず、Vector3とVector2を追加するパブリック静的関数を見つけようとします。たとえば、次のようなシグネチャです。
public static Vector3 operator +(Vector3 a, Vector2 b);
またはたとえば、この可能な署名:
public static Vector2 operator +(Vector3 a, Vector2 b);
それにもかかわらず、APIにはこれらのシグネチャは存在しないため、コンパイラはパラメータを既知のシグネチャに「キャスト」しようとします。
次に、コンパイラーはこれらの2つの潜在的なシグニチャーを見つけます。
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
これらはここに文書化されています:http : //docs.unity3d.com/ScriptReference/Vector3-operator_add.html およびここ:http : //docs.unity3d.com/ScriptReference/Vector2-operator_add.html
したがって、2つの可能性があります。
したがって、両方のキャストが可能であるため、pos2dをVector3にキャストし、pos3dをVector2にキャストできます。コンパイラは、同じソースコードをコンパイルするための可能な方法を見つけます(自動非表示キャストが提供されている場合)。
pos3dをVector2にキャストして2番目の署名を続行するか、pos2dをVector3にキャストして最初の署名を続行することができます。
式pos3d + pos2d
が最初に評価されるため、「結果がどこに適用されるか」を考慮する前に、コンパイラーは、どのようなキャストを(コーダーとして)実行するかを知りません。
3Dに移動したい場合は、次のように記述できます。
transform.position = pos3d + ( Vector3 )pos2d;
そして問題はなくなりました。これは明らかです。最初にpos2dをVector3型の別のオブジェクトに移動し、次にVector3 + Vector3の合計を実行します。この静的署名がある場合
public static Vector3 operator +(Vector3 a, Vector3 b);
利用可能です。あいまいさなしで使用されます。
一方、あなたがするとき
transform.position = pos3d;
transform.position += pos2d;
あいまいさはありません。最初の行はVector3をVector3に割り当てます(間違いありません)。
2行目は次と同等です。
transform.position = transform.position + pos2d;
特殊性については、transform.positionは1回しか評価されないため、+=
演算子に関するこのMicrosoftページでわかるように、型が考慮されます。
https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
さらに、「+ =演算子を直接オーバーロードすることはできませんが、ユーザー定義型は+演算子をオーバーロードできます(演算子を参照)。」したがって、Vector3
の+=
演算子は、Microsoftの説明どおりに動作すると考える必要があります。
x += y
に相当
x = x + y
ただし、xは1回しか評価されません。+演算子の意味は、xおよびyのタイプ(数値オペランドの加算、文字列オペランドの連結など)によって異なります。
したがって、2番目のアプローチVector3
は、シグネチャを持つクラスの+オペランドを確実に呼び出すことができます。
public static Vector3 operator +(Vector3 a, Vector3 b);
そのため、他の形式にすることはできない暗黙の隠しキャストのおかげで、pos2dをVector3に変換する以外にこれを達成する方法はありません。
お手伝いしたいです!!
編集
ではUnity 5.0.1f1 Personal
とMonoDevelop-Unit 4.0.1
、アレックスM.が言うように、行:
transform.position = pos3d;
transform.position += pos2d;
まだエラーをキャストします "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)'"
+ =は両方の署名を使用しています
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
「場所」がわかっているという事実に関係なく、結果が配置されます(Vector2の出力は宛先(Vector3)にキャスト可能であるため、そのキャストがおそらく不可能である場合、おそらくコンパイラは適切なものを選択します)出力タイプ)。
ポイントアレックスMをありがとう
pos3d += pos2d
(編集した質問に従って)失敗しますが、transform.position += pos2d
コンパイル(上記のコメントに従って)?? そのままで.position
は奇妙に見えるでしょうVector3
-それがあなたの意味していることかどうかはっきりとわかりません