TheLetterM

Refraction: Reflective Object

May 11th, 2023
10
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.83 KB | Gaming | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class ReflectiveObject : MonoBehaviour
  6. {
  7.     public bool isReflecting = false; // Checks whether this object is being hit by a laser
  8.     public float laserSize = 0.1f;
  9.     [Header("LaserProperties")]
  10.     public Transform emitPoint; // Empty gameobject that is laser origin
  11.     LineRenderer lr;
  12.     public Transform endPoint; // Empty gameobject that is end of laser
  13.     [Header("GameObjects")]
  14.     public GameObject sparks;
  15.     public GameObject pointLight;
  16.     private Vector3 originalPosition; // Stores the original position of the endpoint before it is moved by lineRenderer
  17.  
  18.     void OnTriggerStay(Collider other)
  19.     {
  20.         if (other.tag == "Laser")
  21.         {
  22.             isReflecting = true;
  23.         }
  24.     }
  25.  
  26.     void OnTriggerExit(Collider other)
  27.     {
  28.         if (other.tag == "Laser")
  29.         {
  30.             isReflecting = false;
  31.         }
  32.     }
  33.     void Start()
  34.     {
  35.         lr = GetComponent<LineRenderer>();
  36.         GetComponent<LineRenderer>().enabled = false; // Does not start shooting laser upon play
  37.         sparks.SetActive(false);
  38.         pointLight.SetActive(false); // sparks and pointLight start inactive
  39.         originalPosition = endPoint.transform.position; // Stores reference to endPoint's original position
  40.     }
  41.  
  42.     // Update is called once per frame
  43.     void Update()
  44.     {
  45.         if (isReflecting)
  46.         {
  47.             lr.startWidth = laserSize; lr.endWidth = laserSize;
  48.  
  49.             GetComponent<LineRenderer>().enabled = true; // Shoot own laser while hit by laser
  50.             sparks.SetActive(true);
  51.             pointLight.SetActive(true);
  52.             lr.SetPosition(0, emitPoint.position); // Set start point of laser to empty gameObject
  53.             RaycastHit hit;
  54.             if (Physics.Raycast(emitPoint.position, transform.right, out hit, Mathf.Infinity, -1, QueryTriggerInteraction.Ignore))
  55.             {
  56.                 if (hit.collider)
  57.                 {
  58.                     lr.SetPosition(1, hit.point); // Set end point of laser to the point where raycast hits collider
  59.                     endPoint.position = hit.point;
  60.                 }
  61.             }
  62.             else
  63.             {
  64.                 lr.SetPosition(1, emitPoint.position + transform.right * 1000); // Line extends 1000 units to the right if not hitting anything
  65.                 sparks.SetActive(false);
  66.                 pointLight.SetActive(false);
  67.             }
  68.         }
  69.         else
  70.         {
  71.             endPoint.transform.position = originalPosition; // When we are not reflecting, return end point to originalPosition;
  72.             GetComponent<LineRenderer>().enabled = false;
  73.             sparks.SetActive(false);
  74.             pointLight.SetActive(false); // sparks and pointLight deactivated
  75.         }
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment