오브젝트를 회전시킬 때, 기본적으로는 그 오브젝트의 피벗(pivot)을 중심으로 회전합니다. 그러나 때로는 오브젝트의 피벗이 아닌 중심을 기준으로 회전해야 하는 경우가 있습니다. 이런 경우를 위한 기능을 구현하고 정리하였습니다.
📺 미리보기
📖 구현 내용
- public static 함수를 이용하여 특정한 컴포넌트 및 import 없이 매우 편리하게 함수를 호출하여 사용합니다.
- 대상 오브젝트가 여러 하이어라키로 구성되어있어도 문제 없이 중심값을 찾을 수 있습니다.
- 함수를 호출하면 중심축이 자동으로 구성되고 해당 오브젝트가 리턴되어 바로 사용할 수 있습니다.
⚒️ 구현
· GetPivotCenter()
/// <summary>
/// 해당 오브젝트의 중심축 찾고 중심축 오브젝트 리턴
/// </summary>
/// <param name="targetGo">생성된 중심축 오브젝트</param>
/// <returns></returns>
public static GameObject GetPivotCenter(GameObject targetGo)
{
Vector3 center = Vector3.zero;
int count = 0;
// 자식 오브젝트들의 MeshFilter 컴포넌트 검사
foreach (MeshFilter mf in targetGo.GetComponentsInChildren<MeshFilter>())
{
// 메쉬 정보를 가져와서 메쉬의 중심점 계산
Vector3 meshCenter = mf.mesh.bounds.center;
// 로컬 좌표계 상의 중심점을 전역 좌표계 상의 좌표로 변환
meshCenter = mf.transform.TransformPoint(meshCenter);
// 중심점 누적값 계산
center += meshCenter;
++count;
}
if (count > 0)
{
// 자식 오브젝트들의 중심점 평균값 반환
center /= count;
}
// 피벗 중심의 위치에 회전을 위한 부모 오브젝트 생성
GameObject rotateAxis = new GameObject($"Rotate Axis for {targetGo.name}");
rotateAxis.transform.position = center;
// 회전 축을 부모로 지정
targetGo.transform.SetParent(rotateAxis.transform);
// 회전축 오브젝트를 리턴
return rotateAxis;
}
foreach (MeshFilter mf in targetGo.GetComponentsInChildren<MeshFilter>())
- 오브젝트에서 활성화된 하위 MeshFilter을 모두 찾습니다.
// 중심점 누적값 계산
center += meshCenter;
- 중심점을 모두 더합니다.
if (count > 0)
{
// 자식 오브젝트들의 중심점 평균값 반환
center /= count;
}
- count(MeshFilter의 개수)만큼 나누어 중심값을 획득합니다.
// 피벗 중심의 위치에 회전을 위한 부모 오브젝트 생성
GameObject rotateAxis = new GameObject($"Rotate Axis for {targetGo.name}");
rotateAxis.transform.position = center;
- 피벗 중심축을 대체할 새로운 오브젝트르 생성합니다
- 오브젝트의 위치는 직전에 구한 위치(중심점)로 합니다.
// 회전 축을 부모로 지정
targetGo.transform.SetParent(rotateAxis.transform);
- 대상 오브젝트의 부모를 생성한 회전 중심축으로 설정합니다.
✅ 사용
· 함수 호출
mObject = Utility.GetPivotCenter(targetItem);
- 특정 오브젝트를 인자로 함수를 호출하면 인자로 넣은 오브젝트의 중심을 기준으로 새롭게 생성된 회전축 오브젝트가 리턴됩니다.
'unity game modules' 카테고리의 다른 글
[유니티] 퀘스트 시스템(2) - 퀘스트 매니저 (0) | 2023.04.11 |
---|---|
[유니티] 퀘스트 시스템(1) - 퀘스트 데이터 (0) | 2023.04.11 |
[유니티] 데미지 표시 (Damage Indicator) (0) | 2023.04.03 |
[유니티] 로딩 화면 구현 (0) | 2023.04.02 |
[유니티] 게임 저장 시스템(3) - 매니저 (0) | 2023.04.02 |