Untuk menyederhanakan jawaban, Vector3
adalah kebiasaan yang struct
disediakan oleh UnityEngine
namespace. Saat kita membuat custom class
atau struct
tipe, kita juga harus mendefinisikan operatornya . Dengan demikian, tidak ada logika default untuk >=
operator. Seperti yang ditunjukkan oleh Evgeny Vasilyev , _rect_tfm.position == _positionB
masuk akal, karena kita dapat langsung memeriksa Vector3.x
, Vector3.y
dan Vector3.z
nilai - nilai. _rect_tfm.position >= _positionB
tidak masuk akal, karena fakta bahwa a Vector3
diwakili oleh tiga nilai yang terpisah.
Kita bisa membebani Vector3
kelas untuk memuat operator yang sesuai secara teori , tapi itu agak rumit. Sebaliknya, akan lebih mudah untuk hanya memperpanjang dengan Vector3
kelas dengan sesuai metode . Yang sedang berkata, tampaknya Anda bermaksud menggunakan logika ini untuk gerakan. Dengan demikian, Anda mungkin merasa lebih mudah menggunakan Vector3.Lerp
metode ini; jika demikian, baca lebih lanjut di bawah ini.
Menambahkan metode ekstensi ke Vector3
Seperti disebutkan sebelumnya, menerapkan <=
atau >=
ke Vector3
sering tidak masuk akal. Untuk gerakan, Anda mungkin ingin membaca lebih lanjut untuk Vector3.Lerp
metode ini. Yang mengatakan, Anda mungkin ingin menerapkan <=
=>
aritmatika karena alasan lain, jadi saya akan memberi Anda alternatif yang mudah.
Alih-alih menerapkan logika Vector3 <= Vector3
atau Vector3 >= Vector3
, saya mengusulkan memperluas Vector3
kelas untuk memasukkan metode untuk isGreaterOrEqual(Vector3 other)
dan isLesserOrEqual(Vector3)
. Kami dapat menambahkan metode ekstensi ke struct
atau class
dengan mendeklarasikannya di static
kelas yang tidak diwariskan. Kami juga memasukkan target class
atau struct
sebagai parameter pertama, menggunakan this
kata kunci. Perhatikan bahwa dalam contoh saya, saya berasumsi bahwa Anda bermaksud memastikan bahwa ketiga nilai utama ( x
, y
dan 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 Vector3
kelas, local
akan mewakili Vector3
contoh 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 Vector3
jenis Anda .
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Pindah Vector3
denganVector3.Lerp
Memanggil para Vector3.Lerp
metode memungkinkan kita untuk menentukan posisi yang tepat antara dua Vector3
nilai pada waktu tertentu. Manfaat tambahan dari metode ini adalah bahwa yang Vector3
tidak akan overshoot target . Vector3.Lerp
membutuhkan 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.Lerp
pindah ke a targetPosition
. Setelah memanggil Move
metode 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 == targetPosition
targetPosition
leftPosition
rightPosition
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 .
Bools
like_atPosA
dan_atPosB
. Tidak dapat dihindari, Anda akan membuat kesalahan dengan menyinkronkan keduanya, dan itu akan menyebabkan bug. Lebih baik membuat yangenum
berisi semua posisi (A, B, mungkin yang lain di masa depan), dan menggunakannya