Предотвратить прохождение объекта через коллайдер - PullRequest
0 голосов
/ 31 мая 2018

Я строю 3D-лабиринт, который перемещается игроком.Я выбираю «лабиринтный» подход, и мне нужно будет маневрировать маленьким шариком по лабиринту, когда игрок перемещает лабиринт.Проблема возникает, когда игрок перемещает стенку, на которой в данный момент находится шар, в направлении мяча.Мяч проходит через стену и останавливается на следующей доступной стене.

Лабиринт использует сетчатый коллайдер и твердое тело, а шар - сферический коллайдер.

Я резко увеличил частоту кадров физики.но безрезультатно.Учитывая сложность лабиринта и потенциально большое количество комбинаций лабиринта, я действительно не хочу прикреплять простые коллайдеры к каждой стене.Будем благодарны за любые советы, подсказки, предложения, комментарии и т. Д.

Сценарий шара для непрерывного вращения:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ballGravity : MonoBehaviour {
    public Rigidbody m_Rigidbody;
    public Vector3 m_EulerAngleVelocity;

    // Use this for initialization
    void Start () {
        m_EulerAngleVelocity = new Vector3 (0, 100, 0);
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void FixedUpdate () {
        Quaternion deltaRotation = Quaternion.Euler (m_EulerAngleVelocity * Time.deltaTime);
        m_Rigidbody.MoveRotation (m_Rigidbody.rotation * deltaRotation);
    }

}

Сценарий вращения лабиринта:

using UnityEngine;
using System.Collections;

public class rotObj : MonoBehaviour 
{
    private float baseAngle = 0.0f;
    float rotSpeed = 10;


    void OnMouseDown(){
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        pos = Input.mousePosition - pos;
        baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
        baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) *Mathf.Rad2Deg;
    }


    void OnMouseDrag(){
        //float rotY = Input.GetAxis("Vertical")*rotSpeed*Mathf.Deg2Rad;
        //gm.transform.Rotate(Vector3.right, rotY);
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        pos = Input.mousePosition - pos;
        float ang = Mathf.Atan2(pos.y, pos.x) *Mathf.Rad2Deg - baseAngle;
        transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
    }
}

1 Ответ

0 голосов
/ 01 июня 2018

Чтобы получить согласованное физическое состояние, лучше всего перемещать коллайдеры внутри FixedUpdate - если вы перемещаете коллайдеры на стадии конвейера OnMouseXX (рассмотрите вопрос https://docs.unity3d.com/Manual/ExecutionOrder.html),, вы рискуете пропустить изменение при следующем вызове FixedUpdate.Т.е. ваш мяч движется через состояние вашей сцены, основываясь на том, как это было до того, как вы повернули лабиринт, и с некоторыми неудачными моментами времени возможно, что столкновения будут пропущены. Если вы уже пробовали с более коротким временным шагом, подумайте об очереди изменения OnMouseDrag, например storeрезультирующее вращение в переменной, и примените его в FixedUpdate, так что он применяется на всякий случай для следующего вычисления физики.

Вы также можете рассмотреть возможность перемещения вашего шара в то же время, как вы вращаете лабиринт, быстро перемещаясьСетка-коллайдер с гораздо меньшим твердым телом является источником проблем. Можете ли вы вместо этого переместить камеру?

...