Cevabı basitleştirmek için , ad alanı tarafından sağlanan Vector3bir 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 .structUnityEngineclassstruct>=_rect_tfm.position == _positionBVector3.xVector3.yVector3.z_rect_tfm.position >= _positionBVector3
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.Lerpyö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.Lerpyö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 <= Vector3ya da Vector3 >= Vector3I uzanan öneren, Vector3için yöntemler dahil sınıfı isGreaterOrEqual(Vector3 other)ve isLesserOrEqual(Vector3). Biz yapabilirsiniz uzatma yöntemleri eklemek bir etmek structveya classbir onları bildirerek staticmiras değil sınıfın. Ayrıca anahtar kelimeyi kullanarak hedefi classveya structilk parametre olarak ekleriz this. Not benim örnekte, hepinizin üç ana değerleri (sağlamak için demek farz olduğunu x, yve 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 Vector3sınıftan çağırmaya çalıştığımızda, yöntemi çağırdığımız örneği localtemsil 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 Vector3türlerinize uygulayabilirsiniz .
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Hareketli Vector3olanVector3.Lerp
Yöntemin çağrılması ,Vector3.LerpVector3 belirli bir zamanda iki değer arasındaki kesin konumu belirlememizi sağlar . Bu yöntemin ek bir yararı , Vector3iradenin 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ç Vector3olarak, geçerli konum olarak doğrudan ayarlayabildiğimiz sonuç konumunu a olarak verir.
Sorununuzu çözerek, Vector3.Lerpa targetPosition. MoveHer birinde yöntemi çağırdıktan sonra Update, söz konusu hedefe ulaşıp ulaşmadığımızı kontrol edebiliriz; Lerp.Vector3will not aşım, bu yüzden transform.position == targetPositiongüvenilir hale gelir. Şimdi konumunu kontrol etmek ve değiştirmek targetPositioniçin leftPositionya da rightPositionbuna 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 .

Boolsgibi_atPosAve kullanmaktan kaçınmalısınız_atPosB. Kaçınılmaz olarak, ikisini de senkronize tutarken hata yaparsınız ve hatalara yol açar.enumTüm pozisyonları içeren bir şey yapmak daha iyidir (A, B, belki de gelecekte başkaları) ve bunu kullanarak