Функция 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

Другие вопросы по тегам