blob: 9e4ae89c894b4811f172feea6eb7bd6602ce5687 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
using UnityEngine;
using System.Collections.Generic;
namespace Pathfinding.Examples.RTS {
[HelpURL("https://arongranberg.com/astar/documentation/stable/rtsbuildingbarracks.html")]
public class RTSBuildingBarracks : MonoBehaviour {
[System.Serializable]
public class UnitItem {
public GameObject prefab;
public int cost;
public float buildingTime;
public RTSUI.MenuItem menuItem;
}
public UnitItem[] items;
public Transform spawnPoint;
public Transform rallyPoint;
public int maxQueueSize = 4;
RTSUnit unit;
RTSUI.Menu menu;
float queueStartTime = 0;
[System.NonSerialized]
public List<UnitItem> queue = new List<UnitItem>();
public float queueProgressFraction {
get {
if (queue.Count == 0) return 0;
return (Time.time - queueStartTime) / queue[0].buildingTime;
}
}
void Awake () {
unit = GetComponent<RTSUnit>();
unit.onMakeActiveUnit += (bool active) => {
if (active) {
menu = RTSUI.active.ShowMenu();
for (int i = 0; i < items.Length; i++) {
var item = items[i];
menu.AddItem(item.menuItem, () => {
if (queue.Count >= maxQueueSize) return;
if (RTSManager.instance.GetPlayer(1).resources.GetResource(RTSUnit.Type.ResourceCrystal) < item.cost) {
RTSManager.instance.audioManager.Play(RTSUI.active.notEnoughResources);
} else {
RTSManager.instance.GetPlayer(1).resources.AddResource(RTSUnit.Type.ResourceCrystal, -item.cost);
AddToQueue(item);
}
});
}
} else if (menu != null) menu.Hide();
};
}
void AddToQueue (UnitItem item) {
queue.Add(item);
if (queue.Count == 1) queueStartTime = Time.time;
}
void Spawn (UnitItem item) {
var go = GameObject.Instantiate(item.prefab, spawnPoint.position, spawnPoint.rotation) as GameObject;
var spawned = go.GetComponent<RTSUnit>();
spawned.team = unit.team;
spawned.SetDestination(rallyPoint.position, MovementMode.AttackMove);
}
void Update () {
if (queue.Count > 0 && Time.time - queueStartTime >= queue[0].buildingTime) {
Spawn(queue[0]);
queue.RemoveAt(0);
queueStartTime = Time.time;
}
}
}
}
|