private bool CheckGround(CharacterControllerMotor motor, Transform transform) { var controller = motor.CharacterController; var worldCenter = transform.position + controller.center; var lowPoint = worldCenter - new Vector3(0, controller.height * 0.5f, 0); Profiler.BeginSample("RaycastNonAlloc"); var layerMask = CPhysicSettings.PhysicInteractionLayerMask; var rayLength = Physics.RaycastNonAlloc(lowPoint, Vector3.down, s_RaycastHits, 0.0001f, layerMask); Profiler.EndSample(); for (int i = 0; i != rayLength; i++) { var ray = s_RaycastHits[i]; if (ray.transform == transform) { continue; } var velocityToAdd = ray.point - lowPoint; CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, true); motor.MoveBy(velocityToAdd); CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, false); return(true); } return(false); }
private Vector3 ProbeGround(CharacterControllerMotor motor, Transform transform, Vector3 previousDirection, float maxAngle, float globalMaxAngle) { var controller = motor.CharacterController; var worldCenter = transform.position + controller.center; var lowPoint = worldCenter - new Vector3(0, controller.height * 0.5f, 0); var highPoint = lowPoint + new Vector3(0, controller.height, 0); Profiler.BeginSample("RaycastNonAlloc"); var layerMask = CPhysicSettings.PhysicInteractionLayerMask; var rayLength = Physics.RaycastNonAlloc(lowPoint, Vector3.down, s_RaycastHits, controller.stepOffset, layerMask); Profiler.EndSample(); if (previousDirection == Vector3.zero) { previousDirection = Vector3.up; } var highestAngle = 0f; var highestDir = previousDirection; var highestY = float.MinValue; for (int i = 0; i != rayLength; i++) { var ray = s_RaycastHits[i]; if (ray.transform == transform) { continue; } //ray.normal = RepairHitSurfaceNormal(ray); var angle = Vector3.Angle(previousDirection, ray.normal); if (angle > highestAngle) { highestAngle = angle; highestDir = ray.normal; } if (angle > maxAngle || Vector3.Angle(Vector3.up, ray.normal) > globalMaxAngle && highestY > ray.point.y) { continue; } var velocityToAdd = ray.point - lowPoint; CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, true); motor.MoveBy(velocityToAdd); CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, false); highestY = ray.point.y; motor.IsGroundForcedThisFrame = true; } return(highestDir); }