GameObject InitializeGhost(Tower_V2 tower_to_ghost, Vector3 position) { //clean up old ghost if it hasn't already been done RemoveGhost(); //new gameobjects ghost_tower = new GameObject(); GameObject render_gameobject = new GameObject(); //set transform parent render_gameobject.transform.SetParent(ghost_tower.transform); //init components + copy mesh filter and renderer data from prefab Tower_V2 to render_gameobject MeshFilter init_filter = render_gameobject.AddComponent <MeshFilter>(); MeshFilter tower_to_ghost_filter = tower_to_ghost.GetComponentInChildren <MeshFilter>(); init_filter.mesh = tower_to_ghost_filter.sharedMesh; MeshRenderer init_renderer = render_gameobject.AddComponent <MeshRenderer>(); //init origin worldspace location ghost_tower.transform.position = position; //init tower local transform render_gameobject.transform.localScale = tower_to_ghost_filter.gameObject.transform.localScale; render_gameobject.transform.localRotation = tower_to_ghost_filter.gameObject.transform.localRotation; render_gameobject.transform.localPosition = tower_to_ghost_filter.gameObject.transform.localPosition; //we set material later return(ghost_tower); }
private void StartTowerPlacement(Tower_V2 tower) { if (CheckWaveStart()) //REMOVE THIS TO ALLOW TO TOWER PLACEMENT WHENEVER { OnStartTowerPlacement?.Invoke(this, new TowerPlacementEventArgs(tower.tower_name)); RequestPlacementNodePing?.Invoke(this, System.EventArgs.Empty); } }
//starts the tower placement behavior void StartTowerPlacement(object caller, TowerPlacementEventArgs args) { flag_placement_in_progress = true; //Find a tower with the name matching our argument tower_to_place = Tower_Manager_V2.GetTowerPrefabList().Find(x => x.tower_name == args.tower_name); //fancy predicate using Linq! //Debug.Log("Tower to place is ID of: " + tower_to_place.gameObject.ToString()); }
//Tries to attach tower to this node. Will return false if there is already a tower at this node. public bool TryAttachTower(Tower_V2 tow) { if (attached_tower == null) { attached_tower = tow; tow.transform.position = transform.position; return(true); } else { return(false); } }
void OnNodeSelect(object caller, TowerPlaceSelectEventArgs args) { //Debug.Log("node selected"); //TODO: Have an actual, nonmagical cost //handle placing tower //Can only place if there is no tower already present and we are currently trying to place a tower if (flag_placement_in_progress) { if (!args.node.IsOccupied()) { //Debug.Log("placement attempt"); if (Resource_Inventory.TryTakeResources(tower_to_place.price_list)) { RemoveGhostFade(); Tower_V2 tower_instance = Instantiate(tower_to_place, new Vector3(0, 0, 0), Quaternion.identity); //if the node can't attach the new tower instance, we destroy it if (!args.node.TryAttachTower(tower_instance)) { //Debug.Log("placement attempt failed! destroying instance..."); Destroy(tower_instance); } else { //Debug.Log("placement attempt successful!"); EndTowerPlacement(); } TowerPlacedEvent?.Invoke(this, new TowerV2RefEventArgs(tower_instance)); } else { //Write tower construction failed! code here. //Text bubble explains why placement cant happen. Make sure this isnt spammable!? Text_Bubble.CreateTemporaryTextBubble("Not enough resources!", info_bubble_duration, args.node.gameObject.transform.position); } } else { //TODO: Tower failed! reason: space is already occupied! Text_Bubble.CreateTemporaryTextBubble("Space occuupied!", info_bubble_duration, args.node.gameObject.transform.position); } } }
void OnNodeSelect(object caller, TowerPlaceSelectEventArgs args) { //Debug.Log("node selected"); //handle placing tower if (flag_placement_in_progress) { //Debug.Log("placement attempt"); Tower_V2 tower_instance = Instantiate(tower_to_place, new Vector3(0, 0, 0), Quaternion.identity); //if the node can't attach the new tower instance, we destroy it if (!args.node.TryAttachTower(tower_instance)) { //Debug.Log("placement attempt failed! destroying instance..."); Destroy(tower_instance); } else { //Debug.Log("placement attempt successful!"); flag_placement_in_progress = false; } } }
private void DetachTower(object caller, TowerV2RefEventArgs args) { attached_tower = null; }
public TowerV2RefEventArgs(Tower_V2 tow) { this.tower = tow; }