Para simplificar la respuesta, Vector3
es una costumbre struct
proporcionada por el UnityEngine
espacio de nombres. Cuando creamos tipos class
o struct
tipos personalizados , también debemos definir sus operadores . Como tal, no existe una lógica predeterminada para el >=
operador. Como ha señalado Evgeny Vasilyev , _rect_tfm.position == _positionB
tiene sentido, como podemos comprobar directamente los Vector3.x
, Vector3.y
y Vector3.z
los valores. _rect_tfm.position >= _positionB
no tiene tanto sentido, debido al hecho de que a Vector3
está representado por tres valores separados.
Podríamos sobrecargar la Vector3
clase para contener los operadores adecuados en teoría , pero eso parece bastante complicado. En cambio, sería más fácil simplemente extender la Vector3
clase con un método adecuado . Dicho esto, parece que tienes la intención de utilizar esta lógica para el movimiento. Como tal, puede resultarle mucho más fácil usar el Vector3.Lerp
método; Si es así, lea más abajo.
Agregar métodos de extensión a Vector3
Como se mencionó anteriormente, aplicar <=
o >=
a Vector3
menudo es ilógico. Para el movimiento, probablemente desee leer más sobre el Vector3.Lerp
método. Dicho esto, es posible que desee aplicar la <=
=>
aritmética por otras razones, por lo que le daré una alternativa fácil.
En lugar de aplicar la lógica de Vector3 <= Vector3
o Vector3 >= Vector3
, propongo extender la Vector3
clase para incluir métodos para isGreaterOrEqual(Vector3 other)
y isLesserOrEqual(Vector3)
. Podemos añadir los métodos de extensión a una struct
o class
declarándolos en una static
clase que no hereda. También incluimos el objetivo class
o struct
como primer parámetro, usando la this
palabra clave. Tenga en cuenta que en mi ejemplo, supongo que quiere asegurarse de que los tres valores principales ( x
, y
y z
) son todos mayores o iguales, o menores o iguales, respectivamente. Puede proporcionar su propia lógica, aquí, según lo requiera.
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;
}
}
}
Cuando intentemos llamar a estos métodos desde la Vector3
clase, local
representaremos la Vector3
instancia desde la que estamos llamando al método. Notarás que los métodos son static
; los métodos de extensión deben ser static
, pero aún debe llamarlos desde una instancia. Dado los métodos de extensión anteriores, ahora puede aplicarlos directamente a sus Vector3
tipos.
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Moviéndose Vector3
conVector3.Lerp
Llamar al Vector3.Lerp
método nos permite determinar la posición exacta entre dos Vector3
valores en un momento dado. Un beneficio adicional de este método es que el Vector3
no sobrepase su objetivo . Vector3.Lerp
toma tres parámetros; la posición inicial, la posición final y la posición actual representada como un valor entre 0 y 1. Produce la posición resultante como a Vector3
, que podemos establecer directamente como la posición actual.
Para resolver su problema, propongo usar Vector3.Lerp
para pasar a a targetPosition
. Después de llamar al Move
método en cada uno Update
, podemos verificar si hemos alcanzado dicho objetivo; Lerp.Vector3
lo hará sin exceso, por lo que transform.position == targetPosition
se convierte en fiable. Ahora podemos comprobar la posición y cambiar el targetPosition
a leftPosition
o rightPosition
invertir el movimiento, en consecuencia.
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);
}
Puede ver esto demostrado en la siguiente animación. Traduzco el cubo azul con Vector3.LerpUnclamped
, lo que nos da un resultado similar a la traducción simple no verificada. Traduzco el cubo rojo usando Vector3.Lerp
. Si no se controla, el cubo azul se va al olvido; mientras que el cubo rojo se detiene exactamente donde lo pretendo. Puede leer más sobre este tipo de movimiento en la documentación de Stack Overflow .
Bools
gusta_atPosA
y_atPosB
. Inevitablemente, cometerá un error manteniéndolos sincronizados a ambos, y dará lugar a errores. Es mejor hacer un queenum
contenga todas las posiciones (A, B, quizás otras en el futuro), y usar eso