PNG.zip


Box.zip


진행 프로젝트 : 

GearVR_Sample(3).zip


 

1. 샘플 실행 준비

  1. www.oculus.com 회
    CVrControllerRayCast.cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
          
        public class CVrControllerRayCast : MonoBehaviour {
          
            // 시선 카메라
            [SerializeField] private Transform _camera;
          
            // 레이 체크 제외 레이어
            [SerializeField] private LayerMask _exclusionLayers;
          
            // 기본 레이 길이
            [SerializeField] private float _rayLength;
          
            // 리티클
            [SerializeField] private CReticle _reticle;
          
            // 라인 렌더러
            [SerializeField] private LineRenderer _lineRenderer;
          
            // 라인 렌더러 표시 여부
            [SerializeField] private bool _showLineRenderer = true;
          
            // 트랙 스페이스 참조
            [SerializeField] private Transform _trackingSpace;
          
            // 현재 선택된 컨트롤러 레이 충돌 오브젝트
            private CVrRaycastItem _currentRaycastItem;
            private CVrRaycastItem _lastRaycastItem;
          
            // 리모트 컨트롤러 연결 여부 프로퍼티
            public bool ControllerIsConnected
            {
                get
                {
                    // 왼쪽 또는 오른쪽 컨트롤러가 존재하고 연결되어 있다면 True 리턴
                    OVRInput.Controller controller =
                        OVRInput.GetConnectedControllers()
                        & (OVRInput.Controller.LTrackedRemote |
                        OVRInput.Controller.RTrackedRemote);
          
                    return controller == OVRInput.Controller.LTrackedRemote ||
                        controller == OVRInput.Controller.RTrackedRemote;
                }
            }
          
          
            // 리모트 컨트롤러 프로퍼티
            public OVRInput.Controller Controller
            {
                get
                {
                    // 현재 왼쪽손에 컨트롤러가 있다면 왼쪽 컨트롤러를
                    // 아니면 오른쪽 컨트롤러를 아니면 활성 컨트롤러를 리턴함
                    OVRInput.Controller controller =
                        OVRInput.GetConnectedControllers();
                    if ((controller & OVRInput.Controller.LTrackedRemote)
                        == OVRInput.Controller.LTrackedRemote)
                    {
                        return OVRInput.Controller.LTrackedRemote;
                    }
                    else if ((controller & OVRInput.Controller.RTrackedRemote)
                        == OVRInput.Controller.RTrackedRemote)
                    {
                        return OVRInput.Controller.RTrackedRemote;
                    }
          
                    return OVRInput.GetActiveController();
                }
            }
          
            private void RemoteControllerRayCast()
            {
                // 카메라 시선에 맞는 레이르르 수행함
                Ray ray = new Ray(_camera.position, _camera.forward);
                RaycastHit hit;
          
                // 컨트롤러의 라인렌더러 표시 위치 초기화
                Vector3 worldStartPoint = Vector3.zero;
                Vector3 worldEndPoint = Vector3.zero;
          
                // 라인렌더라가 존재한다면
                if (_lineRenderer != null)
                {
                    // 리모트 컨트롤러가 연결되어 있고 라인렌더라가 활성화 체크 상태면
                    _lineRenderer.enabled = ControllerIsConnected
                        && _showLineRenderer;
                }
          
                // 컨트롤러가 연결되어 있고 트래킹 영역이 존재 한다면
                if (ControllerIsConnected && _trackingSpace != null)
                {
                    // 컨트롤러의 회전을 구하고
                    Matrix4x4 localToWorld = _trackingSpace.localToWorldMatrix;
                    Quaternion orientation = OVRInput.GetLocalControllerRotation(
                        Controller);
          
                    // 컨트롤러의 레이 시작 위치와 끝 위치를 정함
                    Vector3 localStartPoint = OVRInput.GetLocalControllerPosition(
                        Controller);
                    Vector3 localEndPoint = localStartPoint +
                        ((orientation * Vector3.forward) * 500.0f);
          
                    // 로컬 위치를 월드 위치로 변경하고
                    // (TrackingSpace 로컬 좌표를 => World좌표로 변환)
                    worldStartPoint = localToWorld.MultiplyPoint(localStartPoint);
                    worldEndPoint = localToWorld.MultiplyPoint(localEndPoint);
          
                    // 레이를 변경함
                    ray = new Ray(worldStartPoint,
                        worldEndPoint - worldStartPoint);
                }
          
                // 지정한 레이어만 제외한 레이어를 충돌 체크함
                if (Physics.Raycast(ray, out hit, _rayLength, ~_exclusionLayers))
                {
                    // 시선 충돌용 아이템이 존재한다면
                    CVrRaycastItem item
                        = hit.collider.GetComponent<CVrRaycastItem>();
          
                    // 현재 선택 오브젝트로 설정함
                    _currentRaycastItem = item;
          
                    // 충돌 아이템이 존재하면
                    if (item != null)
                    {
                        // 레이 캐스트의 종단 위치를 충돌 지점으로 설정
                        worldEndPoint = hit.point;
                    }
          
                    // 오브젝트가 존재하고 이전에 선택했던 오브젝트와 다르다면
                    if (item && item != _lastRaycastItem)
                    {
                        // 시선 오버 이벤트를 처리함
                        item.OnRayOver();
                    }
          
                    // 현재 선택된 오브젝트가 없거나
                    // 이전 선택된 오브젝트와의 다른 오브젝트라면
                    if (item != _lastRaycastItem)
                    {
                        // 현재 상호작용 아이템의 아웃 이벤트를 수행함
                        DeactiveLastRaycastItem();
                    }
          
                    // 현재 오브젝트를 이전 선택된 오브젝트로 설정함
                    _lastRaycastItem = item;
          
                    if (_reticle)  // 리티클이 존재하고
                    {
                        // 선택된 아이템이 있다면 해당 아이템의 위치로 설정함
                        _reticle.SetPosition(hit);
                    }
                }
                else // 시선충돌된 오브젝트가 없다면
                {
                    // 현재 상호작용 아이템의 아웃 이벤트를 수행함
                    DeactiveLastRaycastItem();
          
                    _currentRaycastItem = null;
          
                    // 시선으로 충돌하고 있는 오브젝트가 없다면
                    if (_reticle)
                    {
                        // 리티클의 위치를 기본 위치로 설정함
                        _reticle.SetPosition(ray.origin, ray.direction);
                    }
                }
          
                // 리모트 컨트롤러가 연결되어 있고 라인렌더러가 존재한다면
                if (ControllerIsConnected && _lineRenderer != null)
                {
                    // 라인렌더러를 그려 줌
                    _lineRenderer.SetPosition(0, worldStartPoint);
                    _lineRenderer.SetPosition(1, worldEndPoint);
                }
            }
              
            // Update is called once per frame
            void Update () {
                RemoteControllerRayCast();
            }
          
            // 시선이 이전에 선택된 오브젝트에서 벗어남
            private void DeactiveLastRaycastItem()
            {
                if (_lastRaycastItem == null) return;
          
                // 오브젝트 시선이 벗어날 경우 이벤트를 실행함
                _lastRaycastItem.OnRayOut();
                _lastRaycastItem = null;
            }
        }

    원가입, 로그인
  2. Oculus Utilities for Unity 1.23.0 다운로드
  3. 본인 핸드폰의 Device ID 확인
  4. Oculus Signature File 생성
  5. 디바이스를 개발자 모드로 변경
    • 핸드폰 -> 설정 -> 디바이스 정보 -> 소프트웨어 정보 -> 빌드 번호를 여러 번 클릭
      • 개발자 모드를 실행했습니다 까지 뜨면 완료
      • 이후에 설정 제일 밑에 개발자 옵션 항목이 활성화 됨
  6. USB 디버깅 활성화
    • 핸드폰 -> 설정 -> 개발자 옵션 -> USB 디버깅을 활성화
      (개발자 옵션 활성화)
    • 이후 USB 모드를 MTP 모드로 사용해야 함
  7. Samsung Android USB Driver 설치 후 재부팅
  8. Gear VR 개발자 모드 활성화
    • 폰설정 -> 어플리케이션 -> Gear VR Service -> 저장공간 -> VR Service Version -> 6번 클릭 -> 개발자 모드 활성화

2. 샘플 실행 준비

 

 


+ Recent posts