#c# #unity3d
#c# #unity3d
Вопрос:
У меня есть два плоских игровых объекта с одинаковыми масштабами. Я пытаюсь добиться того, чтобы увидеть, проходит ли первая движущаяся плоскость вокруг положения / поворота как вторая статическая плоскость. Не имеет значения, совпадают ли позиции и повороты или нет, важно то, что оно должно иметь одинаковое значение. Например, если положение x плоскости 2 равно 2,75, плоскости 1 должно соответствовать значение 2. Она должна иметь значение смещения, по крайней мере, около второй плоскости. Как мне этого добиться?
public class CheckIfFits: MonoBehaviour
{
public GameObject Plane_2;
public float offset;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(this.transform.position == Plane_2.transform.position amp;amp; this.transform.eulerAngles == Plane_2.transform.eulerAngles)
{
Debug.Log("THEY MATCH");
}
}
}
РЕДАКТИРОВАТЬ: ответ для поворота работает не для всех экземпляров. Например, если объект перевернут или имеет вращение по отрицательной оси. Это то, что я сделал на данный момент:
float diff = Quaternion.Angle(transform.rotation, target.rotation);
// Return true if both values are smaller than the offset.
return dist <= offset_position amp;amp; ((diff <= offset_rotation amp;amp; diff >= 0) || (diff <= (90 offset_rotation) amp;amp; diff >= 90) || (diff <= (180 offset_rotation) amp;amp; diff >= 180) || (diff <= (270 offset_rotation) amp;amp; diff >= 270) || (diff <= 360 amp;amp; diff >= (350 offset_rotation)));
Я не знаю, есть ли лучший способ сделать это.
Комментарии:
1. «Точное положение / поворот в качестве второй статической плоскости. Не имеет значения, совпадают ли позиции и повороты или нет» Какой из них сейчас? Вы хотите проверить, что они находятся в одном и том же положении, или не имеет значения, совпадают ли они?
2. Извините за это. Я изменю свой вопрос.
3. @MathewHD я подумал о расстоянии, но это отлично подходит для вычисления позиций. Проблема с поворотами, не так ли?
4. Нет, это должно работать с обоими, потому что, в конце концов, ваши eulerAngles — это тоже просто Vector3 .
Ответ №1:
Использование оператора equals ==
приведет к сбою, если 2 Vector3
находятся дальше, чем 0.00001.
Вместо этого вы можете использовать, Vector3.Distance()
а затем сравнивать float
полученные вами offset
данные напрямую друг с другом.
Метод CompareTransform:
public float offset;
// Compares 2 Transforms position and rotations.
private bool CompareTransform(Transform current, Transform target) {
// Gets the distance between 2 positions.
float dist = Vector3.Distance(current.position, target.position);
// Get the difference between the 2 rotations.
float diff = Vector3.Distance(current.eulerAngles, target.eulerAngles);
// Return true if both values are smaller than the offset.
return dist <= offset amp;amp; diff <= offset;
}
Теперь вы можете использовать этот метод для сравнения обоих Transform
компонентов в вашем Update
Методе.
Вызов функции:
private void Update() {
if(CompareTransform(this.transform, Plane_2.transform)) {
Debug.Log("Both planes match position with given offset.");
}
}
В качестве альтернативы вы можете использовать Quaternion.Angle()
, чтобы получить угол между 2 поворотами, а затем снова сравнить float
полученный результат с вашим offset
.
Кватернион.Альтернативный угол:
// Get the angle between the 2 rotations.
float angle = Quaternion.Angle(transform.rotation, target.rotation);
Комментарии:
1. Привет, спасибо за подробный ответ! Я не понимаю концепцию смещения в вашем коде. Для меня позиции / повороты совпадают, если я сохраняю смещение около> = 100. В принципе, значения осей должны приближаться к целевому значению, чтобы совпадать. Это и есть цель смещения.
2. Цель смещения, как вы сказали, по-прежнему получать значение true, даже если они не совсем одинаковы, и это также то, что он делает в моем коде. Я просто сравниваю расстояния между поворотами и позициями со смещением, а затем проверяю, меньше или больше, чтобы проверить, соответствуют ли ониравны друг другу.
3. Ах, отлично, спасибо. Моя вторая плоскость была повернута на 180 градусов, поэтому это сбивало с толку. : D
4.
if the 2 Vector3 are nearly the same
если быть точным, если расстояние меньше, чем0.00001
.. просто добавляю для полноты 😉5.
Vector3
оператор==
😉