Diberikan dua vektor berikut:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
Baris ini ambigu:
v3 += v2; // Unity reports dimension ambiguity
sementara tugas ini bukan:
v3 = v2; // Unity assigns despite different dimensions
Kenapa ini?
Jawaban:
Pesan masalah lengkap:
Unity menyediakan cara untuk secara implisit mengkonversi a
Vector3
keVector2
dan sebaliknya. Ini menyebabkan ambiguitas dalam kasus Anda karena + operator dapat diterapkan.Keluarkan Anda
Vector2
ke secaraVector3
eksplisit dalam operasi itu, sehingga kompiler tahu untuk menggunakannyaUnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)
.Jika Anda penasaran, dokumen Microsoft untuk kesalahan khusus itu ada di sini .
Edit setelah edit Anda:
Vec3 += Vec2
ambigu karena alasan yang sama yang dijelaskan di atas. BayangkanVec3 += Vec2
menjadi kenyataanVec3 = Vec3 + Vec2
.Vec3 + Vec2
dapat menghasilkan keduanyaVector2
danVector3
sebagai jawaban karena konversi tersirat, itu sebabnya Anda harus menentukan apa yang Anda inginkan.Vec3 = Vec2
tidak ambigu karena Vec2 secara implisit dikonversi menjadiVector3
dan kemudian ditugaskan ke Vec3 awal. Jadi seluruh operasi benarVector3 = Vector3
- benar tanpa Anda harus menggunakan Vec2 keVector3
manual.sumber
Biarkan saya mengganti nama vars (untuk kejelasan):
Menjawab
Itu karena bagian
pos3d + pos2d
dari garis. Bagian ini sangat ambigu sedangkan yang+=
tidak. Biarkan saya menjelaskan mengapa yang satu dan mengapa yang lain.Analisis 1
Di baris ini
kompiler pertama kali mencoba untuk mengevaluasi ekspresi
pos3d + pos2d
sebelum melanjutkan, terlepas dari di mana hasilnya akan ditempatkan.Untuk melakukannya, sistem pertama-tama mencoba menemukan fungsi statis publik yang menambahkan Vector3 plus Vector2, misalnya tanda tangan yang mungkin ini:
atau misalnya tanda tangan ini:
Namun demikian, tidak ada tanda tangan di API sehingga kompiler mencoba untuk "membuang" parameter ke tanda tangan yang dikenal.
Kemudian kompiler menemukan dua tanda tangan potensial:
Ini didokumentasikan di sini: http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html dan di sini: http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
Jadi ada dua kemungkinan:
Jadi karena kedua coran dimungkinkan, pos2d dapat dilemparkan ke Vector3 dan pos3d dilemparkan ke dalam Vector2, kompiler kemudian menemukan cara yang memungkinkan untuk mengkompilasi kode sumber yang sama (asalkan coran tersembunyi otomatis tersedia).
Entah mungkin untuk memasukkan pos3d ke Vector2 dan melanjutkan dengan tanda tangan kedua, atau melemparkan pos2d ke Vector3 dan melanjutkan dengan tanda tangan pertama.
Ketika ekspresi
pos3d + pos2d
dievaluasi terlebih dahulu, sebelum mempertimbangkan "di mana hasilnya akan diterapkan" maka kompiler tidak tahu apa yang akan dilemparkan oleh Anda - sebagai pembuat kode - seperti yang ingin dilakukan.Jika Anda ingin beralih ke 3D, Anda dapat menulis ini:
dan masalahnya hilang, seperti sekarang jelas: pertama pindahkan pos2d ke objek lain dari tipe Vector3, kemudian lakukan penjumlahan dari Vector3 + Vector3. Asalkan ada tanda tangan statis ini
tersedia, yang akan digunakan tanpa ambiguitas sama sekali.
Analisis 2
Di sisi lain, ketika Anda melakukannya
tidak ada ambiguitas: Baris pertama menetapkan Vector3 menjadi Vector3 (tidak ada keraguan).
Baris kedua setara dengan
dengan kekhasan transform.posisi hanya dievaluasi sekali, dan oleh karena itu jenisnya dipertimbangkan, seperti yang Anda lihat di halaman Microsoft ini tentang
+=
operator:https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Selain itu tertulis "Operator + = tidak dapat kelebihan beban secara langsung, tetapi tipe yang ditentukan pengguna dapat membebani operator + (lihat operator)." jadi kita harus berpikir
Vector3
's+=
Operator bertindak seperti yang dijelaskan oleh microsoft yang mengatakan:jadi kita bisa yakin bahwa pendekatan kedua memanggil + operan
Vector3
kelas, yang memiliki tanda tangan:jadi tidak ada cara lain untuk mencapai ini selain mengubah pos2d menjadi Vector3 berkat gips tersembunyi tersirat yang tidak bisa dari bentuk lain.
Berharap untuk membantu !!
Edit
Dalam
Unity 5.0.1f1 Personal
denganMonoDevelop-Unit 4.0.1
, seperti kata Alex M., baris:masih melakukan kesalahan
"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)'"
jadi sebenarnya + = menggunakan kedua tanda tangan
terlepas dari fakta sudah tahu "di mana" hasilnya akan ditempatkan (saya kira karena mengeluarkan Vector2 dapat dicast ke tujuan (Vector3) dan jika pemeran itu tidak mungkin mungkin, mungkin, kompiler akan memilih yang dengan tepat tipe keluaran).
Terima kasih untuk poinnya Alex M.
sumber
+=
tidak bekerja juga, itu masihVector3
+Vector2
. Lihat jawaban saya.pos3d += pos2d
(sesuai pertanyaan Anda yang diedit) gagal tetapitransform.position += pos2d
mengkompilasi (sesuai komentar Anda di atas) ?? Akan tampak aneh apa.position
adanyaVector3
- Tidak dapat melihat dengan jelas apakah itu yang Anda maksudkan.