내가 까먹을 때 보려고 적는 Unity VR 개발 시 컴포넌트 세부사항들..
: XR 기기의 좌표계나 기준점 설정 모드
- Device
: XR 기기 장착 위치 자체를 기준으로 설정, 사용자가 처음 장비를 착용한 위치
-> 앉거나 고정된 위치에서 이용할 때 사용- Floor
: 사용자 발밑의 바닥을 기준으로 좌표계 설정
-> 룸스케일, 이동하면서 이용할 때 사용
: Controller 입력 처리, 상호작용 이벤트 트리거
- Select Action
: 물체 선택 시 사용하는 입력
-> 트리거 버튼, 그립 버튼을 눌러 객체를 선택하거나 잡는 경우 사용- Activate Action
: 선택한 객체를 활성화 시킬 때 사용되는 입력
-> 트리거 버튼을 사용하여 물체와 상호작용할 때 사용- UIPress Action
: UI 상호작용 입력- Haptic Feedback
: 컨트롤러 진동 피드백 설정
- Grid Snap
: Ctrl 키 누른 상태에서 오브젝트 이동
-> 격자에 맞춰 이동 가능- Vertex Snapping
: V 키 누른 상태에서 오브젝트 이동
-> Vertex 배치에 유용
- Use Dynamic Attach
-> 사용자의 손 위치에 맞춰 오브젝트의 Grab 위치를 동적으로 조정할 수 있도록 하는 기능
- Movement Type
-> Instantaneous : 즉시 이동, 지연이 거의 없지만 부자연스러운 움직임으로 보일 수 있고, 물리적 충돌 효과가 제한된다.
-> Kinematic : 손의 움직에 맞춰 자연스럽게 따라오는 움직임, 물리 오브젝트와 상호작용이 제한된다.
-> Velocity Tracking : 물리적으로 자연스러운 움직임, 역동적인 상호작용에 적합하다. 하지만 지연이 있을 수 있어 제어가 어렵다.
- Fixed Timestep
: 물리 계산이 이루어지는 주기를 결정하는 옵션, 초 단위, 기본값 : 0.02초
-> 값이 작을 수록 더 정확하고, 자주 물리 연산을 수행한다.
- Default Solver Iterations
: 충돌 처리와 제약 조건의 정확도를 조정하는 옵션, 충돌과 관절 같은 제약 조건을 해결할 때 반복하는 횟수를 결정한다. 기본값 : 6
-> 빠른 속도로 움직이거나 여러 오브젝트가 복잡하게 충돌할 때 Solver Iterations을 높이면 올바르게 계산되고, 서로 겹치지 않는다.
- Solver Type
: 물리 연산의 안정성과 정확도를 조절하는 옵션
-> TGS : 높은 정확도와 복잡한 물리 상호작용이 포함된 게임 추천
-> PGS : 성능이 중요하여 물리적 정확도가 크게 중요하지 않은 게임 추천
public class TriggerZone : MonoBehaviour
{
public string targetTag;
public UnityEvent<GameObject> OnEnterEvent;
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == targetTag)
{
OnEnterEvent.Invoke(other.gameObject);
}
}
}
public class TreshCan : MonoBehaviour
{
private void Start()
{
GetComponent<TriggerZone>().OnEnterEvent.AddListener(InsideTrash);
}
public void InsideTrash(GameObject go)
{
go.SetActive(false);
}
}
public class DisableGrabbingHandModel : MonoBehaviour
{
public GameObject leftHandModel;
public GameObject rightHandModel;
// Start is called before the first frame update
void Start()
{
XRGrabInteractable grabInteractable = GetComponent<XRGrabInteractable>();
grabInteractable.selectEntered.AddListener(HideGrabbingHand);
grabInteractable.selectExited.AddListener(ShowGrabbingHand);
}
public void HideGrabbingHand(SelectEnterEventArgs args)
{
if(args.interactorObject.transform.tag == "Left Hand")
{
leftHandModel.SetActive(false);
}
else if(args.interactorObject.transform.tag == "Right Hand")
{
rightHandModel.SetActive(false);
}
}
public void ShowGrabbingHand(SelectExitEventArgs args)
{
if(args.interactorObject.transform.tag == "Left Hand")
{
leftHandModel.SetActive(true);
}
else if(args.interactorObject.transform.tag == "Right Hand")
{
rightHandModel.SetActive(true);
}
}
}
: 이동을 할 수 있도록 돕는 기능
Teleportation
: 특정 지점 선택 후 순간적인 이동
: Teleportation Area 또는 Teleportation Anchor로 텔레포트 영역 지정
Continuous Movement
: 사용자가 조이스틱을 이용해 시점을 회전
: Snap Turn -> 특정 각도로 빠르게 회전
: Continuous Turn -> 부드럽게 회전 (연속적)
Teleportation Provider
: 텔레포트 구현을 위한 제공자 역할
: 텔레포트 요청 처리 및 사용자 위치 업데이트
Safety 및 Comfort
: 속도 제한 및 헤드 고정 기능 제공
: 객체를 소켓에 넣거나 끼우는 동작을 구현할 때 사용한다.
: 퍼즐, 도구 조립, 물체 고정 같은 상호작용에 필요하다.
: 특정 태그를 가진 객체만 상호작용 가능하도록 커스텀 소켓 인터랙터 구현
: CanHover -> 객체가 소켓 위에 호버할 수 있는지 결정하는 메소드
: CanSelect -> 객체를 소켓에 삽입할 수 있는지 결정하는 메소드