Сначала вам понадобится вектор, параллельный земле!
Вы можете использовать Collider.ClosestPoint
, чтобы найти ближайшую точку на стенке коллайдера к положению шара.
Из этого вы затем узнаете плоскость, нормальную для вашего земля / стена, чтобы вы могли затем использовать Vector3.ProjectOnPlane
, чтобы преобразовать обычное направление движения в одну параллель к земле.
private void FixedUpdate ()
{
var ballRb = ball.GetComponent<Rigidbody>();
var wallCollider = Wall.GetComponent<Collider>();
var hitPoint = wallCollider.ClosestPoint(ballRb.position);
// normal of ground (= vector from hitPoint to ball)
var groundNormal = (ballRb.position - hitPoint).normalized;
// project the given velocity onto the ground
var newVelocity = Vector3.ProjectOnPlane(ballRb.velocity, groundNormal);
// optionally increase the speed of needed e.g.
//var newDirection = newVelocity.normalized;
//var newMagnitude = newVelocity.magnitude * 1.1f; // or any multiplication or addition factor
//newVelocity = newDirection * newMagnitude;
// and finally reassign the new velocity
ballRb.velocity = newVelocity;
}
Примечание: типизировано на смартфоне, но я надеюсь, что идея проясняется, и это обеспечивает хорошую отправную точку