Advertisement
Guest User

TPH BuildRoom

a guest
Nov 22nd, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.36 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3.  
  4. public class BuildRoom : Singleton<BuildRoom>
  5. {
  6.     #region Private Field
  7.     // original click point
  8.     private float m_OriginalX;
  9.     private float m_OriginalZ;
  10.  
  11.     // left down point
  12.     private float m_FirstX;
  13.     private float m_FirstZ;
  14.  
  15.     //right up point
  16.     private float m_LastX;
  17.     private float m_LastZ;
  18.  
  19.     private bool m_RoomPlacement;
  20.     private bool m_RoomRemovement;
  21.     private RaycastHit m_Hit;
  22.     private List<GameObject> m_RoomSections = new List<GameObject>();
  23.     #endregion
  24.  
  25.     #region Public Field
  26.     public LayerMask m_Mask;
  27.     public LayerMask DestroyerRoom;
  28.     public bool FindRoom { get; set; }
  29.  
  30.     public Transform Room;
  31.     public static Vector3 RoomCenter;
  32.     #endregion
  33.  
  34.     // Update is called once per frame
  35.     void Update()
  36.     {
  37.         #region KeyBoardCheck
  38.         //debug input to test room construction
  39.         if (Input.GetKeyDown(KeyCode.N))
  40.         {
  41.             m_RoomPlacement = !m_RoomPlacement;
  42.             m_RoomRemovement = false;
  43.         }
  44.  
  45.         //debug input to test room removement
  46.         if (Input.GetKeyDown(KeyCode.M))
  47.         {
  48.             m_RoomRemovement = !m_RoomRemovement;
  49.             m_RoomPlacement = false;
  50.         }
  51.         #endregion
  52.  
  53.         #region MouseClickCheck
  54.         //if construction active
  55.         //when left click down
  56.         if (Input.GetMouseButtonDown(0))
  57.         {
  58.             FirstMouseClickCreation();
  59.         }
  60.  
  61.         //during left click down
  62.         if (Input.GetMouseButton(0))
  63.         {
  64.             OnLeftMouseClickCreation();
  65.         }
  66.  
  67.         if (Input.GetMouseButtonUp(0))
  68.         {
  69.             EventManager.Instance.MouseButtonUp();
  70.         }
  71.         #endregion
  72.     }
  73.  
  74.     #region Placement
  75.     public void FirstMouseClickCreation()
  76.     {
  77.         //convert monito point into ray
  78.         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  79.  
  80.         //if raycast touch plain
  81.         if (Physics.Raycast(ray, out m_Hit, Mathf.Infinity, m_Mask))
  82.         {
  83.             //save original click position
  84.             m_OriginalX = Mathf.Round(m_Hit.point.x);
  85.             m_OriginalZ = Mathf.Round(m_Hit.point.z);
  86.             m_RoomSections = new List<GameObject>();
  87.         }
  88.     }
  89.  
  90.  
  91.     public void OnLeftMouseClickCreation()
  92.     {
  93.         //convert monito point into ray
  94.         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  95.  
  96.         //if raycast touch plain
  97.         if (Physics.Raycast(ray, out m_Hit, Mathf.Infinity, m_Mask))
  98.         {
  99.  
  100.             //if last x or last y is different to current
  101.             if (m_LastX != Mathf.Round(m_Hit.point.x) || m_LastZ != Mathf.Round(m_Hit.point.z))
  102.             {
  103.                 //set new last x and y
  104.                 m_LastX = Mathf.Round(m_Hit.point.x);
  105.                 m_LastZ = Mathf.Round(m_Hit.point.z);
  106.                 CheckFirstAndLastPoint();
  107.                 CheckIfSectionIsValid();
  108.                 if (m_Hit.transform.gameObject.layer == 8)
  109.                 {
  110.                     for (float i = m_FirstX; i <= m_LastX; i++)
  111.                     {
  112.                         for (float j = m_FirstZ; j <= m_LastZ; j++)
  113.                         {
  114.                             if (m_RoomRemovement || !Physics.Raycast(new Vector3(i, 1f, j), Vector3.down, 0.4f))
  115.                             {
  116.                                 GameObject room = null;
  117.                                 if (m_RoomPlacement)
  118.                                 {
  119.                                     room = ObjectPooler.Instance.GetPoolObject("TempRoom");
  120.                                 }
  121.                                 else if (m_RoomRemovement && !Physics.Raycast(new Vector3(i, 1.5f, j), Vector3.down, 1f, DestroyerRoom))
  122.                                 {
  123.                                     room = ObjectPooler.Instance.GetPoolObject("RemoveRoom");
  124.                                 }
  125.  
  126.  
  127.                                 if (room != null)
  128.                                 {
  129.                                     room.transform.position = new Vector3(i, 0.51f, j);
  130.                                     room.SetActive(true);
  131.                                     room.transform.SetParent(Room);
  132.                                     m_RoomSections.Add(room);
  133.                                 }
  134.                             }
  135.                         }
  136.                     }
  137.                 }
  138.             }
  139.         }
  140.     }
  141.     #endregion
  142.  
  143.     #region Check point and position
  144.     //check the smaller point comparing last x to first x and last y to first y
  145.     private void CheckFirstAndLastPoint()
  146.     {
  147.         if (m_OriginalX > m_LastX)
  148.         {
  149.             float temp = m_LastX;
  150.             m_LastX = m_OriginalX;
  151.             m_FirstX = temp;
  152.         }
  153.         else
  154.         {
  155.             m_FirstX = m_OriginalX;
  156.         }
  157.  
  158.         if (m_OriginalZ > m_LastZ)
  159.         {
  160.             float temp = m_LastZ;
  161.             m_LastZ = m_OriginalZ;
  162.             m_FirstZ = temp;
  163.         }
  164.         else
  165.         {
  166.             m_FirstZ = m_OriginalZ;
  167.         }
  168.  
  169.         RoomCenter = new Vector3((m_LastX + m_FirstX) / 2, 0.5f, (m_LastZ + m_FirstZ) / 2);
  170.     }
  171.  
  172.     private void CheckIfSectionIsValid()
  173.     {
  174.         List<GameObject> FindSection = new List<GameObject>();
  175.         foreach (GameObject room in m_RoomSections)
  176.         {
  177.             //if section is out of rect inscribed on last point and first point
  178.             if (room.transform.position.x < m_FirstX || room.transform.position.x > m_LastX || room.transform.position.z < m_FirstZ || room.transform.position.z > m_LastZ)
  179.             {
  180.                 FindSection.Add(room);
  181.                 room.gameObject.transform.position = ObjectPooler.Instance.transform.position;
  182.                 room.gameObject.transform.SetParent(ObjectPooler.Instance.transform);
  183.                 FindRoom = false;
  184.                 room.gameObject.SetActive(false);
  185.             }
  186.         }
  187.  
  188.         foreach (GameObject room in FindSection)
  189.         {
  190.             //remove section   
  191.             GameObject AnalisingRoom = room;
  192.             foreach (GameObject section in m_RoomSections)
  193.             {
  194.                 if (room == section)
  195.                 {
  196.                     m_RoomSections.Remove(section);
  197.                 }
  198.                 return;
  199.             }
  200.         }
  201.     }
  202.     #endregion
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement