public (Vector3 near, Vector3 far) RaySphere(
Vector3 rayOrigin, Vector3 rayDirection,
Vector3 sphereOrigin, float sphereRadius)
{
// 광선 방향 정규화
rayDirection.Normalize();
// 프로젝션
var rayToSphere = sphereOrigin - rayOrigin;
var project = rayOrigin + Vector3.Project(rayToSphere, rayDirection);
// 직각삼각형 밑변길이 구하기
var sphereToProject = Vector3.Distance(sphereOrigin, project);
var projectToHit = Mathf.Sqrt(sphereRadius * sphereRadius - sphereToProject * sphereToProject);
// 충돌 위치 구하기
var rayToProject = Vector3.Distance(rayOrigin, project);
var hit1 = rayOrigin + rayDirection * (rayToProject - projectToHit);
var hit2 = rayOrigin + rayDirection * (rayToProject + projectToHit);
return (hit1, hit2);
}