오늘은 VR의 Menu 등을 조작하기 위한 레이저 포인트를 만들어 보도록
하겠습니다.
레이저 포인트를 만들기 위한 방법이 2가지가 있습니다.
첫 번 째로 Cube 객체를 생성해서 길이만 길게 하고 몸통 너비는
작게 해서 레이저 처럼 보이게 하는 방법
두 번 째는 Line Renderer를 사용하는 방법입니다.
오늘은 Line Renderer를 활용해 보겠습니다.
Line Renderer를 이용한 레이저 포인트를 만들기 위해
Script를 만들겠습니다.
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
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LayserPointer : MonoBehaviour
{
private LineRenderer layser; // 레이저
private RaycastHit Collided_object; // 충돌된 객체
private GameObject currentObject; // 가장 최근에 충돌한 객체를 저장하기 위한 객체
public float raycastDistance = 100f; // 레이저 포인터 감지 거리
// Start is called before the first frame update
void Start()
{
// 스크립트가 포함된 객체에 라인 렌더러라는 컴포넌트를 넣고있다.
layser = this.gameObject.AddComponent<LineRenderer>();
// 라인이 가지개될 색상 표현
layser.material = material;
// 레이저의 꼭지점은 2개가 필요 더 많이 넣으면 곡선도 표현 할 수 있다.
layser.positionCount = 2;
// 레이저 굵기 표현
layser.startWidth = 0.01f;
layser.endWidth = 0.01f;
}
// Update is called once per frame
void Update()
{
layser.SetPosition(0, transform.position); // 첫번째 시작점 위치
// 업데이트에 넣어 줌으로써, 플레이어가 이동하면 이동을 따라가게 된다.
// 선 만들기(충돌 감지를 위한)
Debug.DrawRay(transform.position, transform.forward * raycastDistance, Color.green, 0.5f);
// 충돌 감지 시
if (Physics.Raycast(transform.position, transform.forward, out Collided_object, raycastDistance))
{
layser.SetPosition(1, Collided_object.point);
// 충돌 객체의 태그가 Button인 경우
if (Collided_object.collider.gameObject.CompareTag("Button"))
{
// 오큘러스 고 리모콘에 큰 동그라미 부분을 누를 경우
if (OVRInput.GetDown(OVRInput.Button.One))
{
// 버튼에 등록된 onClick 메소드를 실행한다.
}
else
{
Collided_object.collider.gameObject.GetComponent<Button>().OnPointerEnter(null);
currentObject = Collided_object.collider.gameObject;
}
}
}
else
{
// 레이저에 감지된 것이 없기 때문에 레이저 초기 설정 길이만큼 길게 만든다.
layser.SetPosition(1, transform.position + (transform.forward * raycastDistance));
// 최근 감지된 오브젝트가 Button인 경우
// 버튼은 현재 눌려있는 상태이므로 이것을 풀어준다.
if(currentObject != null)
{
currentObject.GetComponent<Button>().OnPointerExit(null);
currentObject = null;
}
}
}
private void LateUpdate()
{
// 버튼을 누를 경우
if (OVRInput.GetDown(OVRInput.Button.One))
{
}
// 버튼을 뗄 경우
{
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
코드 설명이 블로그에서 보면 흐릿하게 보이네요
코드 설명을 구체적으로 하려고 하였습니다.
이해하는데 도움이 되면 좋겠네요
혹시 어려운 점이 생기신다면 댓글을 남겨주세요.
이제 빈 객체를 생성하고 이름을 layserPoint이라고 하겠습니다.
위의 스크립트를 layserPoint의 component로 넣어주세요
넣어주는 이유는, 레이저를 객체화 함으로써 레이저를 껏다 켯다 할 수 있기 때문입니다.
여기다 프리팹을 넣어주세요
프리팹의 좌표는 0, 0, 0 이어야합니다.
참고한 자료 위치
https://github.com/baedi/TIL-Unity3D/blob/master/Script-VR/VR006/VRPointer.cs
'Oculus Go Unity' 카테고리의 다른 글
[Oculus Go Unity] NPC와 상호작용 하기#2 (1) | 2020.04.15 |
---|---|
[Oculus Go Unity] NPC와 상호작용 하기#1 (0) | 2020.04.04 |
[Oculus Go Unity] 메뉴 만들기(canvas에 메뉴 만들기) #2 (2) | 2020.02.06 |
[Oculus Go Unity] 기본 동작 구현 (0) | 2020.02.05 |
[Oculus Go Unity] 빌드환경 구축하기 (0) | 2020.02.05 |