OldBlueWater/BlueWater/Assets/GolemiteGames/GridBuilder2/Scripts/GridObjectOptions.cs
2023-08-01 13:03:57 +09:00

340 lines
12 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.Events;
/*************This class contains the functions for the placed objects such as Move etc. It can easily be expanded to contain more.**************/
public class GridObjectOptions : MonoBehaviour
{
//Cached variables
GridSelector gridSelector;
ObjectPlacer objectPlacer;
ObjectRemover objectRemover;
ObjectSelector objectSelector;
GameObject selectedObj;
//Private variables
bool moving = false;
float moveTimeout = 0;
//Serialized variables
[Tooltip("Make sure to link up your camera to the canvas in world space and link your grid object options function to the relevent button")]
[SerializeField] GameObject menuCanvas;
[SerializeField] float menuHover;
[SerializeField] bool dragMove;
[SerializeField] bool dragAfterSelect;
[SerializeField] Material upgradeMaterial;
[SerializeField] bool swapMeshBeforeUpgrade;
//Accessors
public GameObject SelectedObject
{
set { selectedObj = value; }
}
public bool DragMove
{
get { return dragMove; }
}
public bool Moving
{
get { return moving; }
}
public bool DragAfterSelect
{
get { return dragAfterSelect; }
}
public GameObject MenuCanvas
{
get { return menuCanvas; }
}
public float MoveTimeout
{
get { return moveTimeout; }
}
private void Awake()
{
}
private void Start()
{
//Caches objects
gridSelector = GridBuilder2Manager.Instance.GridSelector;
objectPlacer = GridBuilder2Manager.Instance.ObjectPlacer;
objectRemover = GridBuilder2Manager.Instance.ObjectRemover;
objectSelector = GridBuilder2Manager.Instance.ObjectSelector;
}
private void Update()
{
if (dragMove)
{
if (gridSelector && gridSelector.SelectedGameObjectToPlace && moving)
{
if (Input.GetMouseButtonUp(0))
{
DragMoveEnd();
}
}
}
if(!moving)
{
if(moveTimeout > 0)
{
moveTimeout -= Time.deltaTime;
}
else
{
moveTimeout = 0;
}
}
}
//Opens the menu canvas assigned in the inspector
public void OpenMenu(Vector3 pos, GameObject obj)
{
if (menuCanvas)
{
menuCanvas.SetActive(true);
menuCanvas.transform.position = new Vector3(pos.x, pos.y + (objectPlacer.GetObjectHeight(obj) + menuHover), pos.z);
}
}
public void CloseMenu()
{
if (menuCanvas)
{
menuCanvas.SetActive(false);
}
}
//The standard move function, essentially sending the placed object back to the GridSelecter to preview it again
public void Move()
{
if(selectedObj && selectedObj.GetComponent<GridObject>())
{
if (objectPlacer && objectRemover && gridSelector)
{
moving = true;
moveTimeout = 0;
//Gets the data from the selected object
var selectedObjData = selectedObj.GetComponent<GridObject>().data;
//Unblock cells so can replace in the same spot if we want to
objectRemover.UnblockCells(selectedObjData.CheckPositions, selectedObjData.GridSquare);
if (objectPlacer)
{
if (objectPlacer.HideCellsUnderPlacedObj)
{
//If this option is enabled, unhides the objects taken cells
objectPlacer.ShowRemovedObjCells(selectedObjData.GridSquare, selectedObjData.CheckPositions);
}
}
//Sends the selected object to the grid selector for previewing, moving and rotation
gridSelector.SetGameObjectToPlace(selectedObj.GetComponent<Building>());
CloseMenu();
//Recieves an event to deselect after moving an object
objectPlacer.MovedObjEvent.AddListener(() =>
{
moveTimeout = 0.1f;
moving = false;
objectSelector.DeselectObject();
});
}
}
}
//Drag variation of the move function
public void DragMoveStart()
{
if (selectedObj && selectedObj.GetComponent<GridObject>())
{
if (objectPlacer && objectRemover && gridSelector)
{
gridSelector.DragMove = true;
moving = true;
var selectedObjData = selectedObj.GetComponent<GridObject>().data;
objectRemover.UnblockCells(selectedObjData.CheckPositions, selectedObjData.GridSquare);
if (objectPlacer.HideCellsUnderPlacedObj)
{
objectPlacer.ShowRemovedObjCells(selectedObjData.GridSquare, selectedObjData.CheckPositions);
}
gridSelector.SetGameObjectToPlace(selectedObj.GetComponent<Building>());
CloseMenu();
}
}
}
public void DragMoveEnd()
{
if (objectPlacer && objectRemover && gridSelector)
{
gridSelector.PlaceObjectIfEmpty(gridSelector.CurrentGrid);
if (selectedObj && objectSelector.SelectedMaterial != null)
{
var selectedObject = selectedObj.GetComponent<GridObject>();
selectedObject.ReapplyOriginalMaterials();
}
objectSelector.DeselectObject();
moving = false;
gridSelector.DragMove = false;
}
}
public void StartUpgrade()
{
StartCoroutine(Upgrade());
}
private IEnumerator Upgrade()
{
if (objectPlacer && objectRemover && gridSelector)
{
if (selectedObj && selectedObj.GetComponent<UpgradeData>())
{
UpgradeData upgradeData = selectedObj.GetComponent<UpgradeData>();
//This prevents from upgrading if there is no upgrade available
if (upgradeData.UpgradePrefabs.Count > upgradeData.CurrentUpgradeLevel - 1)
{
//Gets the next upgrade object
GameObject nextUpgradeGO = upgradeData.UpgradePrefabs[upgradeData.CurrentUpgradeLevel - 1];
//Current level mesh and mats
MeshFilter meshFilter = selectedObj.GetComponent<MeshFilter>();
MeshRenderer meshRend = selectedObj.GetComponent<MeshRenderer>();
MeshFilter upgradeMeshFilter = null;
MeshRenderer upgradeMeshRend = null;
if (upgradeData.UpgradePrefabs[upgradeData.CurrentUpgradeLevel - 1])
{
//Next level mesh and mats
upgradeMeshFilter = nextUpgradeGO.GetComponent<MeshFilter>();
upgradeMeshRend = nextUpgradeGO.GetComponent<MeshRenderer>();
}
CloseMenu();
GameObject timerCanvas = null;
//If the time to wait is greater than 0
if (upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1] > 0)
{
//There is a canvas ready to add
if (objectPlacer.TimerCanvas)
{
//If building on a timer to begin with
if (selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining == -1 || selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining == 0)
{
selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining = upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1];
}
timerCanvas = objectPlacer.CreateTimerCanvas(
upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1],
selectedObj,
selectedObj.GetComponent<GridObject>());
}
}
//Swaps object before it has upgraded
if (swapMeshBeforeUpgrade)
{
if (selectedObj != null)
{
if (upgradeData.UpgradePrefabs[upgradeData.CurrentUpgradeLevel - 1])
{
meshFilter.sharedMesh = upgradeMeshFilter.sharedMesh;
meshRend.sharedMaterials = upgradeMeshRend.sharedMaterials;
}
}
if (upgradeMaterial)
{
gridSelector.ChangeObjMat(selectedObj, upgradeMaterial);
}
//Upgrading was saved, and midway through
if(selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining < upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1])
{
//Waits for the remaining upgrade time
yield return new WaitForSeconds(selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining);
}
else
{
//Waits for the full upgrade time
yield return new WaitForSeconds(upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1]);
}
if (timerCanvas != null)
{
Destroy(timerCanvas);
}
if (selectedObj != null)
{
//Gets the previous object and sets it build time so it can be selected again
meshRend.gameObject.GetComponent<GridObject>().data.BuildTimeRemaining = -1;
meshRend.gameObject.GetComponent<GridObject>().ReapplyOriginalMaterials();
}
}
//Swaps object after upgrading
else
{
if(upgradeMaterial)
{
gridSelector.ChangeObjMat(selectedObj, upgradeMaterial);
}
if (selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining < upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1])
{
//Waits for the remaining upgrade time
yield return new WaitForSeconds(selectedObj.GetComponent<GridObject>().data.BuildTimeRemaining);
}
else
{
//Waits for the full upgrade time
yield return new WaitForSeconds(upgradeData.UpgradeTimes[upgradeData.CurrentUpgradeLevel - 1]);
}
if (timerCanvas != null)
{
Destroy(timerCanvas);
}
//Check to see if the object has not been removed during upgrade time
if (selectedObj != null)
{
//Gets the previous object and sets it build time so it can be selected again
meshRend.gameObject.GetComponent<GridObject>().data.BuildTimeRemaining = -1;
if (upgradeData.UpgradePrefabs[upgradeData.CurrentUpgradeLevel - 1])
{
meshFilter.sharedMesh = upgradeMeshFilter.sharedMesh;
meshRend.sharedMaterials = upgradeMeshRend.sharedMaterials;
}
}
}
if(meshRend.gameObject == selectedObj)
{
objectSelector.DeselectObject();
}
upgradeData.CurrentUpgradeLevel += 1;
meshRend.gameObject.GetComponent<GridObject>().data.UpgradeLevel += 1;
}
}
}
//Add/Remove/Change any classes relevant to upgrading here
}
}