BoxCast не работает/Unity
[отключу Use Gravity у Player'а]
Когда куб, то есть Player, не касается коллайдером с землёй, но BoxCast касается её, то hitdetect = true.
[включу Use Gravity у Player'а, т.к я не могу поставить куб так, чтобы коллайдеры прикоснулись, но куб не отлетел]
Но если куб касается коллайдером земли и BoxCast тоже, то hitdetect = false.

Коллайдер куба снизу больше чем сам куб Класс KeyboardInput
public class KeyboardInput : MonoBehaviour
{
[SerializeField, Range(-50f, 50f)] private float _maxDistance = 2f;
[SerializeField] private Jumper _jumper;
public Collider collider;
public Quaternion quaternion = Quaternion.identity;
public LayerMask _ground = 9;
public RaycastHit hit;
public bool hitdetect;
private void Update()
{
hitdetect = Physics.BoxCast(collider.bounds.center, collider.bounds.size / 2, Vector3.down,out hit, quaternion,_maxDistance);
if (hitdetect)
{
Debug.Log($"Hit : {hit.collider.name}");
Debug.Log(hitdetect);
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
if (hitdetect)
{
Gizmos.DrawRay(collider.bounds.center, Vector3.down * hit.distance);
Gizmos.DrawWireCube(collider.bounds.center + Vector3.down * hit.distance, collider.bounds.size);
}
else
{
Gizmos.DrawRay(collider.bounds.center, Vector3.down * hit.distance);
Gizmos.DrawWireCube(collider.bounds.center + Vector3.down * _maxDistance, collider.bounds.size);
}
}
}
Класс Jumper
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(BoxCollider))]
public class Jumper : MonoBehaviour
{
[SerializeField] private Rigidbody _rigidbody;
[SerializeField] private float _force = 10;
void Start()
{
_rigidbody = GetComponent<Rigidbody>();
}
public void Jump()
{
_rigidbody.AddForce(Vector3.up * _force);
}
}
Класс Axis
public static class Axis
{
public readonly static string Horizontal = "Horizontal";
public readonly static string Vertical = "Vertical";
public readonly static string Jump = "Jump";
}
Ответы (2 шт):
Пересечение создаётся только в том направлении, которое задано BoxCast(Vector3 direction)
Я сталкивался с тем же, сейчас опишу как я понял эту ситуацию.
Если куб касается коллайдером земли, то дистанция до земли в буквальном смысле равна 0f, из-за этого бокс кастился под землю, а так как под землей ничего нет, то и castBox ничего не встречает на своём пути, тут и получаем false.
Как я решил данную проблему - начальную точку castBox можно сдвинуть вверх на 0.01f. Теперь величина castBox не проходит сквозь землю и, луч того же castBox встречает землю, тем самым отдавая true.
private bool IsGrounded()
{
const float distance = .01f;
var bounds = boxColliderRef.bounds;
return Physics.BoxCast(
bounds.center + Vector3.up * distance,
bounds.size / 2, Vector3.down, Quaternion.identity, distance);
}