Мой объект начинает вращаться при столкновении со стеной

У меня есть в Unity ящик, за которым следует камера на плоскости. Я пытаюсь обработать столкновения между коробкой и разными объектами. Когда он сталкивается с разными предметами, он крутится, прыгает и с ним происходят странные вещи. Я загрузил на YouTube видео, чтобы показать проблему. видео.

Я создал пустой с камерой и коробкой. Этот пустой объект имеет жесткое тело массы 1.

У пустого есть скриптовый компонент:

using UnityEngine;
using System.Collections;

public class Character : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log ("Entered OnCollisionEnter function");
        if (collision.gameObject.name == "Wall") {
            GetComponent<Rigidbody>().velocity = Vector3.zero;
            Debug.Log ("Inside if statement");
        }

    }
}

Как видите, я попытался справиться с коллизией, написав код, который останавливает движение куба.


Дополнительная информация, которая может помочь вам, ребята:

Коробка

У него есть бокс-коллайдер. Скрипт:

using UnityEngine;
using System.Collections;

public class MoveCharacter : MonoBehaviour {

    public float deltaMovement = 10f;

    // Use this for initialization
    void Start ()
    {
    }

    // Update is called once per frame
    void Update ()
    {
        Moving();
    }


    void Moving()
    {
        //Moves the character to where it needs.
        if (Input.GetKey (KeyCode.A)) {
            transform.Translate (new Vector3 (-deltaMovement, 0f, 0f) * Time.deltaTime);
        } else if (Input.GetKey (KeyCode.D)){
            transform.Translate (new Vector3 (deltaMovement, 0f, 0f) * Time.deltaTime);
        }
        float yRotation = Camera.main.transform.eulerAngles.y;
        float movementX = Mathf.Sin ((yRotation * Mathf.PI) / 180) * deltaMovement;
        float movementZ = Mathf.Cos ((yRotation * Mathf.PI) / 180) * deltaMovement;

        if (Input.GetKey (KeyCode.W)) {
            transform.Translate (new Vector3 (movementX, 0f, movementZ) * Time.deltaTime, Space.World);
        } else if (Input.GetKey (KeyCode.S)){
            transform.Translate (new Vector3 (-movementX, 0f, -movementZ) * Time.deltaTime, Space.World);
        }
    }
}

Стена

Это самолет с сетчатым коллайдером, с твердым телом или без него, не имеет значения, та же проблема...


Любая помощь, пожалуйста?


person Pichi Wuana    schedule 23.09.2016    source источник


Ответы (1)


Если вы используете физику, вы не должны перемещать объект, изменяя его перевод, вы должны перемещать его, применяя силы к объекту или, по крайней мере, добавляя к нему скорость. Это позволит физическому движку правильно рассчитывать реакции с другими твердыми телами.

Если вы переместите объект, регулируя его перемещение, то, когда произойдет столкновение, это будет так, как если бы объект материализовался в другой объект для движка, поскольку он будет двигаться без скорости и т. д., и вы получите странное поведение.

person Graeme    schedule 23.09.2016
comment
Если у меня public Rigidbody rb, а в Start() rb = GetComponent<Rigidbody> ();, нужно ли в Moving() писать: rb.velocity = new Vector3(-deltaMovement, 0, 0);? Он вращается вокруг оси Z, когда я написал это в операторе if. - person Pichi Wuana; 24.09.2016
comment
Вы удалили или закомментировали весь остальной код? Я только что построил быстрый тест того, что вы описали, и мой куб просто скользит без проблем? У меня есть, как вы говорите, в start () и в моем методе обновления: if (Input.GetKey (up)) { rb.velocity = new Vector3 (1, 0, 0); } - person Graeme; 24.09.2016
comment
Если вы добавите скорость, вы также уничтожите все существующие скорости на вашем твердом теле, чего вы, возможно, не хотите делать. То есть, когда он пытается кувыркаться/подпрыгивать/падать, если вы затем просто установите скорость объекта, вы испортите его текущие скорости и, возможно, испортите эффекты. Применение силы в большинстве случаев дает наилучшие результаты, настраивайте скорости для обмана, когда вам нужны конкретные результаты :) - person Graeme; 24.09.2016
comment
У меня есть if (Input.GetKey (KeyCode.A)) { rb.velocity = new Vector3(-1, 0, 0); } else if (Input.GetKey (KeyCode.D)){ rb.velocity = new Vector3 (1, 0, 0); } и вот что происходит тестирование клавишами A и D... очень странно, вместо скольжения. - person Pichi Wuana; 24.09.2016
comment
Я приму ваш ответ, потому что вы решили мою проблему столкновения. Спасибо! - person Pichi Wuana; 24.09.2016
comment
Глядя на ваше видео, я подозреваю, что то, что вы видите, связано с трением о поверхность, на которой сидит куб. Точно так же, как если бы вы положили деревянный кубик на наждачную бумагу и толкнули его пальцем, он бы «катился», а не скользил, вы понимаете, что я имею в виду? Попробуйте поднять куб вверх и отключить гравитацию, чтобы на него не действовали внешние силы, и попробуйте еще раз. Вы также можете проверить трение задействованных материалов и устранить любое трение, и оно должно просто скользить. - person Graeme; 25.09.2016