LaserPointer.cs 3.2 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LaserPointer : MonoBehaviour
{
    //GameObject controller_L;
    GameObject controller_R;
    private LineRenderer layser;        // 레이저
    private RaycastHit Collided_object; // 충돌된 객체
    private GameObject currentObject;   // 가장 최근에 충돌한 객체를 저장하기 위한 객체

    public float raycastDistance = 100f; // 레이저 포인터 감지 거리

    // Start is called before the first frame update
    void Start()
    {
        //controller_L = GameObject.Find("Controller (left)");
        controller_R = GameObject.Find("Controller (right)");
        // 스크립트가 포함된 객체에 라인 렌더러라는 컴포넌트를 넣고있다.
        layser = this.gameObject.AddComponent<LineRenderer>();

        // 라인이 가지개될 색상 표현
        Material material = new Material(Shader.Find("Standard"));
        material.color = new Color(0, 195, 255, 0.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(1, Collided_object.point);

            // 충돌 객체의 태그가 npc인 경우
            if (Collided_object.collider.gameObject.CompareTag("NPC"))
            {
                // 큰 동그라미 부분을 누를 경우
                if (controller_R.GetComponent<ActionTest>().GetTeleportDown())
                {
                    // npc에 등록된 대화를 실행한다.
                    //Collided_object.collider.gameObject.GetComponent<VIDE_Assgin>.BeginDialogue();
                }

                else
                {
                    currentObject = Collided_object.collider.gameObject;
                }
            }
        }

        else
        {
            // 레이저에 감지된 것이 없기 때문에 레이저 초기 설정 길이만큼 길게 만든다.
            layser.SetPosition(1, transform.position + (transform.forward * raycastDistance));

            // 최근 감지된 오브젝트가 Button인 경우
            // 버튼은 현재 눌려있는 상태이므로 이것을 풀어준다.
            if (currentObject != null)
            {
                currentObject = null;
            }

        }

    }

    private void LateUpdate()
    {
        // 버튼을 누를 경우        
        if (controller_R.GetComponent<ActionTest>().GetTeleportDown())
        {
            layser.material.color = new Color(255, 255, 255, 0.5f);
        }

        // 버튼을 뗄 경우          
        else{
            layser.material.color = new Color(0, 195, 255, 0.5f);
        }
    }
}