Cevabı basitleştirmek için , ad alanı tarafından sağlanan Vector3
bir gelenek . Özel veya tür oluşturduğumuzda , operatörlerini de tanımlamamız gerekir . Bu nedenle, operatör için varsayılan bir mantık yoktur . Tarafından işaret edildiği gibi Evgeny Vasilyev , doğrudan kontrol edebilirsiniz olarak, mantıklı , ve değerleri. a'nın üç ayrı değerle temsil edilmesi nedeniyle çok mantıklı değildir .struct
UnityEngine
class
struct
>=
_rect_tfm.position == _positionB
Vector3.x
Vector3.y
Vector3.z
_rect_tfm.position >= _positionB
Vector3
TeorideVector3
uygun operatörleri içerecek şekilde sınıfı aşırı yükleyebiliriz , ancak bu oldukça karmaşık görünüyor. Bunun yerine, sadece daha kolay olacağını uzatmakVector3
uygun olan sınıf yöntemiyle . Bununla birlikte, bu mantığı hareket için kullanmak istediğiniz anlaşılıyor. Bu nedenle, Vector3.Lerp
yöntemi kullanmak çok daha kolay olabilir ; öyleyse, aşağıda daha fazla bilgi edinin.
Ekleme yöntemleri ekleme Vector3
Daha önce uygulanması, belirtildiği gibi, <=
ya da >=
bir Vector3
çoğu mantıksız değildir. Hareket için, muhtemelen Vector3.Lerp
yöntem için daha fazla okumak istersiniz . Bununla birlikte, <=
=>
aritmetiği başka nedenlerle uygulamak isteyebilirsiniz , bu yüzden size kolay bir alternatif vereceğim.
Bunun yerine mantığını uygulanması Vector3 <= Vector3
ya da Vector3 >= Vector3
I uzanan öneren, Vector3
için yöntemler dahil sınıfı isGreaterOrEqual(Vector3 other)
ve isLesserOrEqual(Vector3)
. Biz yapabilirsiniz uzatma yöntemleri eklemek bir etmek struct
veya class
bir onları bildirerek static
miras değil sınıfın. Ayrıca anahtar kelimeyi kullanarak hedefi class
veya struct
ilk parametre olarak ekleriz this
. Not benim örnekte, hepinizin üç ana değerleri (sağlamak için demek farz olduğunu x
, y
ve z
) olan tüm sırasıyla büyük veya eşit veya daha az ya da eşittir. İstediğiniz gibi burada kendi mantığınızı sağlayabilirsiniz.
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;
}
}
}
Bu yöntemleri Vector3
sınıftan çağırmaya çalıştığımızda, yöntemi çağırdığımız örneği local
temsil eder Vector3
. Yöntemlerin static
; uzatma yöntemleri gerekir olmak static
, ama yine örneğinden onları aramak zorunda. Yukarıdaki uzantı yöntemleri göz önüne alındığında, artık bunları doğrudan Vector3
türlerinize uygulayabilirsiniz .
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Hareketli Vector3
olanVector3.Lerp
Yöntemin çağrılması ,Vector3.Lerp
Vector3
belirli bir zamanda iki değer arasındaki kesin konumu belirlememizi sağlar . Bu yöntemin ek bir yararı , Vector3
iradenin hedefini aşmayacağıdır . Vector3.Lerp
üç parametre alır; başlangıç konumu, bitiş konumu ve geçerli konum 0 ile 1 arasında bir değer olarak temsil edilir. Sonuç Vector3
olarak, geçerli konum olarak doğrudan ayarlayabildiğimiz sonuç konumunu a olarak verir.
Sorununuzu çözerek, Vector3.Lerp
a targetPosition
. Move
Her birinde yöntemi çağırdıktan sonra Update
, söz konusu hedefe ulaşıp ulaşmadığımızı kontrol edebiliriz; Lerp.Vector3
will not aşım, bu yüzden transform.position == targetPosition
güvenilir hale gelir. Şimdi konumunu kontrol etmek ve değiştirmek targetPosition
için leftPosition
ya da rightPosition
buna göre, hareket ters.
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);
}
Bunu aşağıdaki animasyonda görebilirsiniz. Mavi küpü tercüme ediyorum Vector3.LerpUnclamped
, bu da bize basit kontrolsüz çeviriye benzer bir sonuç veriyor. Kırmızı küpü kullanarak çeviriyorum Vector3.Lerp
. Denetlenmeden bırakıldığında, mavi küp unutulmaya başlar; kırmızı küp tam istediğim yerde duruyor. Bu tür hareketlerle ilgili daha fazla bilgiyi Yığın Taşması belgelerinde okuyabilirsiniz .
Bools
gibi_atPosA
ve kullanmaktan kaçınmalısınız_atPosB
. Kaçınılmaz olarak, ikisini de senkronize tutarken hata yaparsınız ve hatalara yol açar.enum
Tüm pozisyonları içeren bir şey yapmak daha iyidir (A, B, belki de gelecekte başkaları) ve bunu kullanarak