CapsuleCast поражает более высокий объект, чем капсула - PullRequest
0 голосов
/ 02 апреля 2019

Я сделал функцию, чтобы предвидеть столкновение с CapsuleCast, потому что мой персонаж движется быстро и большая часть столкновений не обнаруживается единым целым:

private bool CheckForwardCollision(Vector3 direction)
{
    RaycastHit hitInfo;
    float maxDistance = m_DefaultSpeed * Time.deltaTime + m_Capsule.radius;
    int layer = 1 << LayerMask.NameToLayer("Default");

    // Debug CapsuleCast
    DebugExtension.DebugCapsule(transform.position + (direction * maxDistance), transform.position + (direction * maxDistance) + (Vector3.up * m_Capsule.height), new Color(1, 0, 0), m_Capsule.radius);
    // Draw last collision point
    DebugExtension.DrawPoint(debug_hitpoint, Color.cyan);

    // Get collision with a capsule cast which is in front of character
    if (Physics.CapsuleCast(transform.position, transform.position + (Vector3.up * m_Capsule.height),
            m_Capsule.radius, direction, out hitInfo, maxDistance, layer, QueryTriggerInteraction.Ignore))
    {
        debug_hitpoint = hitInfo.point;
        return true;
    }
    return false;
}

Но он сталкивается с объектом, который выше высоты капсулы. Вот пример: enter image description here Вы можете увидеть точку попадания выше капсулы.

Что не так? Спасибо

1 Ответ

0 голосов
/ 03 апреля 2019

После многих часов исследований я нашел решение: Physics.CapsuleCast(point1, point2, ...) и DebugExtension.DebugCapsule(point1, point2, ...) сделаны не одинаково.В DebugCapsule точка1 и точка2 - это точка конца капсулы, тогда как в CapsuleCast эти точки являются началом кривой части.Поэтому решение состоит в том, чтобы убрать радиус капсулы из точки 1 и 2!

 Vector3 point1 = transform.position + Vector3.up * m_Capsule.radius;
 Vector3 point2 = transform.position - Vector3.up * m_Capsule.radius + (Vector3.up * m_Capsule.height);

 Physics.CapsuleCast(point1, point2, m_Capsule.radius, move, out hitInfo, maxDistance, layer, QueryTriggerInteraction.Ignore)
...