Функция Mathf.Clamp искажает размер объекта
Я делаю игру SpaceShooter в Unity.
Вот функция.
void FixedUpdate ()
{
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
Player.GetComponent<Rigidbody>().velocity=movement*speed;
Player.GetComponent<Rigidbody> ().rotation = Quaternion.Euler(0.0f,0.0f,Player.GetComponent<Rigidbody> ().velocity.x * -tilt);
}
В приведенном выше коде, когда я добавляю функцию "Зажим", чтобы ограничить Корабль границами, размер Корабля уменьшается с боков. Это код функции Clamp, который уменьшает размер корабля.
Player.GetComponent<Rigidbody> ().position=new Vector3
(
Mathf.Clamp(Player.GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp(Player.GetComponent<Rigidbody>().position.z, boundary.zMin, boundary.zMax)
);
Я дал точные значения границ экрана в функции "Зажим".
2 ответа
Изменение положения твердого тела действительно перемещает трансформацию, но после последнего физического шага. Хотя это считается более быстрым, оно может вызвать нежелательное поведение, поскольку вы перемещаете что-то, что физический движок также использует, и делаете это в FixedUpdate
функция, которая в основном должна использоваться для физики. замещать Player.GetComponent<Rigidbody>().position
с Player.GetComponent<Transform>().position
, Кроме того, поскольку вы здесь не используете физику, а вместо этого непосредственно изменяете позицию объекта, установите эту часть кода в Update
функция вместо
void Update()
{
Transform playerTransform = Player.GetComponent<Transform>();
playerTransform.position=new Vector3
(
Mathf.Clamp(playerTransform.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp(playerTransform.position.z, boundary.zMin, boundary.zMax)
);
}
Если вы когда-нибудь захотите переместить объект, используя его Rigidbody, никогда не делайте этого, кстати. Попробуйте вместо этого использовать функцию MovePosition. Перемещение его так, как вы это сделали, заставляет его телепортироваться, а не вычислять столкновения на одном и том же кадре, но на следующем.
В качестве примечания, вы должны сохранить ссылку на трансформацию игрока в вашем классе, чтобы вам не приходилось использовать GetComponent
функционировать каждый раз.
Решил проблему, выдвинув фоновый "квад" под (около -4) плоскости и установив значение Y корабля на 0