XR Ray Interactor, Teleportation Area를 통한 이동 시스템

2021. 9. 1. 19:41Unity/VR

이번 구현은 새로운 것이아니라 기존에 만들어 놓은 부분들을 조금씩 다듬는 것이다.

 

이번에 다듬은 부분은 다음과 같다.

1. cliff영역에도 정상적으로 텔레포테이션될 수있게 조정

2. XR Ray의 형태 변경과 텔레포테이션 버튼 변경, 이동범위조절.

3. cliff영역에도 iceBomb같은 설치형 스킬위치가 제대로 초기화 되도록조정

4. icebomb가 실행전 미리 타격 위치를 알려주는 로직생성

 


Cliff(바위)영역 텔레포테이션

 

지금까지는 제작된 Terrain에만 텔레포테이션이 되도록 만들어 놨다.

기본적으로 이러한 게임오브젝트에 텔레포테이션이 가능하게 만들려면 Teleportation Area 컴포넌트를 적용해야 한다.

이 컴포넌트를 적용하는 순간 부터 XR Ray Interator와 XR Controller가 같이 연동 되며 컴포넌트가 적용된 오브젝트에 텔레포테이션이 가능하게 된다.

 

 


XR Ray의 형태변경, 텔레포테이션 버튼 변경, 이동범위 조절

 

 

이 3가지의 요소는 XR Ray Interactor와 XR Interactor Line Visual, XR Controller 컴포넌트로 이루어진다.

 

먼저 들어가기전에 앞어 XR Ray Interactor의 기능을 짚고 넘어가자면 이 컴포넌트는 말그대로 Raycast를 사용해 오브젝트들과 Interactor,즉 상호작용하는 기능이다. 이 컴포넌트를 통해 레이캐스트로 UI를 체크하고 선택하는기능을 추가할 수 있는 것이다. 물론 텔레포테이션도 레이캐스트로 진행이 되기때문에 이 컴포넌트에서 기능을 관장한다.

 

먼저 XR Ray의 형태 변경과 이동범위 조절이다.

 

여기서 주목해야할 점은 Raycast Configuration아래의 Line Type와 Velocity이다. 여기 Line Type은 3종류가 있는데

Straight type, projectile Curve, Bezier Curve가 있다.

 

Straight type은 직선의 Ray이고 나머지 두개는 곡선의 Ray이다.

이를통해 필자는 기존의 직선 Ray를 곡선으로 변경하기 위해 projectile Curve를 사용하였다.

 

그리고 Velocity를통해 이동범위를 제한해 주었는데 이 Velocity가 작아지면 작아질 수록 곡선의 도착점 거리가 짧아지는 것을 확인할 수 있었기 때문이다. 

 

하지만 여기 까지만 하게되면 곡선이 중간에 끊기게 되는 현상을 만날 수가 있다. 이는 곡선의 길이가 유동적으로 늘어나는게 아닌 최댓값이 있기 때문인데 이는 XR Interactor Line Visual에서 조정이 가능하다.

 

Line Length를 통해 곡선의 길이를 조정해 줄 수가 있다. 

 

 

세번째로는 텔레포테이션 버튼 변경이다. 기존의 스킬의 발동시스템들이 Grip버튼으로 잡혀있어 현재 인터렉션 버튼이 Grip에 계속있게 된다면 원치않는 이동과 선택을 하게 될 것이다.

 

XR Controller컴포넌트에서 input의 selectUsage를 원하는 버튼으로 변경하여 이동버튼을 독립적으로 만들어 주었다. 그외에도 Ui클릭등도 독립적으로 바꾸어 줄 수가 있다.

 

 

변경이 완료된 모습이다.

 

 

 


지형지물에서 설치형 스킬의 위치초기화및 타격포인트 생성

 

 

지금까지의 IceBomb의 스킬로직은 Raycast가 바닥에 광선을 쏴 Terrain Layer가 검출이 되면 그 위치에 스킬을 발동 하는 구조였다. 이 는 지형지물로 사용된 암석과 큰 바위의 Layer를 Terrain으로 설정해 줌으로 써 해결이 되었다.

 

 

다음은 스킬발동전 타격포인트 생성이다.

 void Update()
        {
            RaycastHit hit;
            //float distance = 1000f;
            int layerMask = 1 << LayerMask.NameToLayer("Terrain");
            if (Physics.Raycast(EyeTrans.transform.position, EyeTrans.transform.forward, out hit, Mathf.Infinity, layerMask))
            {

               Vector3 insPos = hit.point;
               TempTrans.transform.position = insPos;
               if(drawed == false)
                {
                    Instantiate(DrawCircle, TempTrans.transform);
                    drawed = true;
                }
               


            }
             if (leftPos.position.y < handPosY - 0.7f && rightPos.position.y < handPosY - 0.7f && use == false)
            {
                use = true;

                Instantiate(IceBomb, TempTrans.transform);
                Debug.Log("발동");
                Destroy(this.gameObject);       
             }
        }

현재 바뀐 코드의 내용이다. 예전에는 Raycast안에 스킬발동 로직이 담겨있었지만 지금은 둘이 분리가 되어 Raycast안에서는 발동이될 스킬의 위치만을 초기화 해주고있다. 그 위치를 받아 포인트를 만들고 자식화 한뒤 위치를 계속 초기화 시켜주는 것이다.

 

이상태에서 트리거 발동시 위치정보를 기반으로 스킬이 발동되는 형식이다.

 

 

전체적인 구현 모습이다.

'Unity > VR' 카테고리의 다른 글

Unity GunShot Skill 생성  (0) 2022.01.12
XR Rig Body생성, 스킬 거리 최댓값 주기  (0) 2021.09.05
Unity IceBomb Skill제작  (0) 2021.07.16
Unity 스킬 획득,관리 시스템(3)  (0) 2021.07.11
Unity 스킬 획득,관리 시스템(2)  (0) 2021.07.09