오늘은 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;
 
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>();
 
        // 라인이 가지개될 색상 표현
        Material material = new Material(Shader.Find("Standard"));
        material.color = new Color(01952550.5f);
        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(1Collided_object.point);
 
            // 충돌 객체의 태그가 Button인 경우
            if (Collided_object.collider.gameObject.CompareTag("Button"))
            {
                // 오큘러스 고 리모콘에 큰 동그라미 부분을 누를 경우
                if (OVRInput.GetDown(OVRInput.Button.One))
                {
                    // 버튼에 등록된 onClick 메소드를 실행한다.
                    Collided_object.collider.gameObject.GetComponent<Button>().onClick.Invoke();
                }
 
                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))
        {
            layser.material.color = new Color(2552552550.5f);
        }
 
        // 버튼을 뗄 경우          
        else if (OVRInput.GetUp(OVRInput.Button.One))
        {
            layser.material.color = new Color(01952550.5f);
        }
    }
}
 
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

 

baedi/TIL-Unity3D

Unity3D Study with C#. Contribute to baedi/TIL-Unity3D development by creating an account on GitHub.

github.com

 

+ Recent posts