Untuk menyederhanakan jawaban, Vector3adalah kebiasaan yang structdisediakan oleh UnityEnginenamespace. Saat kita membuat custom classatau structtipe, kita juga harus mendefinisikan operatornya . Dengan demikian, tidak ada logika default untuk >=operator. Seperti yang ditunjukkan oleh Evgeny Vasilyev , _rect_tfm.position == _positionBmasuk akal, karena kita dapat langsung memeriksa Vector3.x, Vector3.ydan Vector3.znilai - nilai. _rect_tfm.position >= _positionBtidak masuk akal, karena fakta bahwa a Vector3diwakili oleh tiga nilai yang terpisah.
Kita bisa membebani Vector3kelas untuk memuat operator yang sesuai secara teori , tapi itu agak rumit. Sebaliknya, akan lebih mudah untuk hanya memperpanjang dengan Vector3kelas dengan sesuai metode . Yang sedang berkata, tampaknya Anda bermaksud menggunakan logika ini untuk gerakan. Dengan demikian, Anda mungkin merasa lebih mudah menggunakan Vector3.Lerpmetode ini; jika demikian, baca lebih lanjut di bawah ini.
Menambahkan metode ekstensi ke Vector3
Seperti disebutkan sebelumnya, menerapkan <=atau >=ke Vector3sering tidak masuk akal. Untuk gerakan, Anda mungkin ingin membaca lebih lanjut untuk Vector3.Lerpmetode ini. Yang mengatakan, Anda mungkin ingin menerapkan <= =>aritmatika karena alasan lain, jadi saya akan memberi Anda alternatif yang mudah.
Alih-alih menerapkan logika Vector3 <= Vector3atau Vector3 >= Vector3, saya mengusulkan memperluas Vector3kelas untuk memasukkan metode untuk isGreaterOrEqual(Vector3 other)dan isLesserOrEqual(Vector3). Kami dapat menambahkan metode ekstensi ke structatau classdengan mendeklarasikannya di statickelas yang tidak diwariskan. Kami juga memasukkan target classatau structsebagai parameter pertama, menggunakan thiskata kunci. Perhatikan bahwa dalam contoh saya, saya berasumsi bahwa Anda bermaksud memastikan bahwa ketiga nilai utama ( x, ydan z) semuanya lebih besar atau sama, atau lebih rendah atau sama, masing-masing. Anda dapat memberikan logika Anda sendiri, di sini, sesuai kebutuhan Anda.
public static class ExtendingVector3
{
public static bool IsGreaterOrEqual(this Vector3 local, Vector3 other)
{
if(local.x >= other.x && local.y >= other.y && local.z >= other.z)
{
return true;
}
else
{
return false;
}
}
public static bool IsLesserOrEqual(this Vector3 local, Vector3 other)
{
if(local.x <= other.x && local.y <= other.y && local.z <= other.z)
{
return true;
}
else
{
return false;
}
}
}
Ketika kita mencoba memanggil metode ini dari Vector3kelas, localakan mewakili Vector3contoh dari mana kita memanggil metode tersebut. Anda akan mencatat bahwa metodenya adalah static; metode penyuluhan harus menjadi static, tetapi Anda masih harus memanggil mereka dari sebuah contoh. Dengan adanya metode ekstensi di atas, Anda sekarang dapat menerapkannya langsung ke Vector3jenis Anda .
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Pindah Vector3denganVector3.Lerp
Memanggil para Vector3.Lerpmetode memungkinkan kita untuk menentukan posisi yang tepat antara dua Vector3nilai pada waktu tertentu. Manfaat tambahan dari metode ini adalah bahwa yang Vector3tidak akan overshoot target . Vector3.Lerpmembutuhkan tiga parameter; posisi awal, posisi akhir, dan posisi saat ini direpresentasikan sebagai nilai antara 0 dan 1. Ini menampilkan posisi yang dihasilkan sebagai a Vector3, yang dapat langsung kita atur sebagai posisi saat ini.
Memecahkan masalah Anda, saya usulkan menggunakan Vector3.Lerppindah ke a targetPosition. Setelah memanggil Movemetode di masing-masing Update, kita dapat memeriksa apakah kita telah mencapai target tersebut; tidakLerp.Vector3 akan melampaui, jadi menjadi dapat diandalkan. Kita sekarang dapat memeriksa posisi, dan mengubah ke atau untuk membalikkan gerakan.transform.position == targetPositiontargetPositionleftPositionrightPosition
public Vector3 leftPosition, rightPosition;
public float speed;
public Vector3 targetPosition;
private void Awake()
{
targetPosition = rightPosition;
}
private void Update()
{
Move();
if(transform.position == targetPosition)
{
// We have arrived at our intended position. Move towards the other position.
if(targetPosition == rightPosition)
{
// We were moving to the right; time to move to the left.
targetPosition = leftPosition;
}
else
{
// We were moving to the left; time to move to the right.
targetPosition = rightPosition;
}
}
}
private void Move()
{
// First, we need to find out the total distance we intend to move.
float distance = Vector3.Distance(transform.position, targetPosition);
// Next, we need to find out how far we intend to move.
float movement = speed * Time.deltaTime;
// We find the increment by simply dividing movement by distance.
// This will give us a decimal value. If the decimal is greater than
// 1, we are moving more than the remaining distance. Lerp
// caps this number at 1, which in turn, returns the end position.
float increment = movement / distance;
// Lerp gives us the absolute position, so we pass it straight into our transform.
transform.position = Vector3.Lerp(transform.position, targetPosition, increment);
}
Anda dapat melihat ini ditunjukkan dalam animasi berikut. Saya menerjemahkan cube biru Vector3.LerpUnclamped, yang memberi kami hasil yang mirip dengan terjemahan sederhana yang tidak dicentang. Saya menerjemahkan kubus merah menggunakan Vector3.Lerp. Bila tidak dicentang, kubus biru bergerak ke arah terlupakan; sementara kubus merah berhenti tepat di tempat saya bermaksud. Anda dapat membaca lebih lanjut tentang jenis gerakan ini di dokumentasi Stack Overflow .

Boolslike_atPosAdan_atPosB. Tidak dapat dihindari, Anda akan membuat kesalahan dengan menyinkronkan keduanya, dan itu akan menyebabkan bug. Lebih baik membuat yangenumberisi semua posisi (A, B, mungkin yang lain di masa depan), dan menggunakannya