Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using UnityEngine;
- public class BuildRoom : Singleton<BuildRoom>
- {
- #region Private Field
- // original click point
- private float m_OriginalX;
- private float m_OriginalZ;
- // left down point
- private float m_FirstX;
- private float m_FirstZ;
- //right up point
- private float m_LastX;
- private float m_LastZ;
- private bool m_RoomPlacement;
- private bool m_RoomRemovement;
- private RaycastHit m_Hit;
- private List<GameObject> m_RoomSections = new List<GameObject>();
- #endregion
- #region Public Field
- public LayerMask m_Mask;
- public LayerMask DestroyerRoom;
- public bool FindRoom { get; set; }
- public Transform Room;
- public static Vector3 RoomCenter;
- #endregion
- // Update is called once per frame
- void Update()
- {
- #region KeyBoardCheck
- //debug input to test room construction
- if (Input.GetKeyDown(KeyCode.N))
- {
- m_RoomPlacement = !m_RoomPlacement;
- m_RoomRemovement = false;
- }
- //debug input to test room removement
- if (Input.GetKeyDown(KeyCode.M))
- {
- m_RoomRemovement = !m_RoomRemovement;
- m_RoomPlacement = false;
- }
- #endregion
- #region MouseClickCheck
- //if construction active
- //when left click down
- if (Input.GetMouseButtonDown(0))
- {
- FirstMouseClickCreation();
- }
- //during left click down
- if (Input.GetMouseButton(0))
- {
- OnLeftMouseClickCreation();
- }
- if (Input.GetMouseButtonUp(0))
- {
- EventManager.Instance.MouseButtonUp();
- }
- #endregion
- }
- #region Placement
- public void FirstMouseClickCreation()
- {
- //convert monito point into ray
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- //if raycast touch plain
- if (Physics.Raycast(ray, out m_Hit, Mathf.Infinity, m_Mask))
- {
- //save original click position
- m_OriginalX = Mathf.Round(m_Hit.point.x);
- m_OriginalZ = Mathf.Round(m_Hit.point.z);
- m_RoomSections = new List<GameObject>();
- }
- }
- public void OnLeftMouseClickCreation()
- {
- //convert monito point into ray
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- //if raycast touch plain
- if (Physics.Raycast(ray, out m_Hit, Mathf.Infinity, m_Mask))
- {
- //if last x or last y is different to current
- if (m_LastX != Mathf.Round(m_Hit.point.x) || m_LastZ != Mathf.Round(m_Hit.point.z))
- {
- //set new last x and y
- m_LastX = Mathf.Round(m_Hit.point.x);
- m_LastZ = Mathf.Round(m_Hit.point.z);
- CheckFirstAndLastPoint();
- CheckIfSectionIsValid();
- if (m_Hit.transform.gameObject.layer == 8)
- {
- for (float i = m_FirstX; i <= m_LastX; i++)
- {
- for (float j = m_FirstZ; j <= m_LastZ; j++)
- {
- if (m_RoomRemovement || !Physics.Raycast(new Vector3(i, 1f, j), Vector3.down, 0.4f))
- {
- GameObject room = null;
- if (m_RoomPlacement)
- {
- room = ObjectPooler.Instance.GetPoolObject("TempRoom");
- }
- else if (m_RoomRemovement && !Physics.Raycast(new Vector3(i, 1.5f, j), Vector3.down, 1f, DestroyerRoom))
- {
- room = ObjectPooler.Instance.GetPoolObject("RemoveRoom");
- }
- if (room != null)
- {
- room.transform.position = new Vector3(i, 0.51f, j);
- room.SetActive(true);
- room.transform.SetParent(Room);
- m_RoomSections.Add(room);
- }
- }
- }
- }
- }
- }
- }
- }
- #endregion
- #region Check point and position
- //check the smaller point comparing last x to first x and last y to first y
- private void CheckFirstAndLastPoint()
- {
- if (m_OriginalX > m_LastX)
- {
- float temp = m_LastX;
- m_LastX = m_OriginalX;
- m_FirstX = temp;
- }
- else
- {
- m_FirstX = m_OriginalX;
- }
- if (m_OriginalZ > m_LastZ)
- {
- float temp = m_LastZ;
- m_LastZ = m_OriginalZ;
- m_FirstZ = temp;
- }
- else
- {
- m_FirstZ = m_OriginalZ;
- }
- RoomCenter = new Vector3((m_LastX + m_FirstX) / 2, 0.5f, (m_LastZ + m_FirstZ) / 2);
- }
- private void CheckIfSectionIsValid()
- {
- List<GameObject> FindSection = new List<GameObject>();
- foreach (GameObject room in m_RoomSections)
- {
- //if section is out of rect inscribed on last point and first point
- 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)
- {
- FindSection.Add(room);
- room.gameObject.transform.position = ObjectPooler.Instance.transform.position;
- room.gameObject.transform.SetParent(ObjectPooler.Instance.transform);
- FindRoom = false;
- room.gameObject.SetActive(false);
- }
- }
- foreach (GameObject room in FindSection)
- {
- //remove section
- GameObject AnalisingRoom = room;
- foreach (GameObject section in m_RoomSections)
- {
- if (room == section)
- {
- m_RoomSections.Remove(section);
- }
- return;
- }
- }
- }
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement