'Study' 카테고리의 다른 글
[VR] 구글 카드 보드 비행기 슈팅 게임 리소스 (0) | 2018.12.22 |
---|---|
[라이브러리] MiniJSON 파서 (0) | 2018.12.22 |
[리소스] 박스 (전역 조명 샘플용) (0) | 2018.12.22 |
[VR] Gear VR 사용법 (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (서버 관련) (0) | 2018.12.22 |
[VR] 구글 카드 보드 비행기 슈팅 게임 리소스 (0) | 2018.12.22 |
---|---|
[라이브러리] MiniJSON 파서 (0) | 2018.12.22 |
[리소스] 박스 (전역 조명 샘플용) (0) | 2018.12.22 |
[VR] Gear VR 사용법 (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (서버 관련) (0) | 2018.12.22 |
[라이브러리] MiniJSON 파서 (0) | 2018.12.22 |
---|---|
[네트워크] 클릭커 클라이언트 제작 관련 리소스 (0) | 2018.12.22 |
[VR] Gear VR 사용법 (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (서버 관련) (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (클라이언트 관련) (0) | 2018.12.22 |
진행 프로젝트 :
1. 샘플 실행 준비
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. 샘플 실행 준비
[네트워크] 클릭커 클라이언트 제작 관련 리소스 (0) | 2018.12.22 |
---|---|
[리소스] 박스 (전역 조명 샘플용) (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (서버 관련) (0) | 2018.12.22 |
구글 플레이 연동 및 인앱 결제 (클라이언트 관련) (0) | 2018.12.22 |
[VR] Vive Shooter180 (0) | 2018.12.22 |