F3DFXController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. // Weapon types
  5. public enum F3DFXType
  6. {
  7. Vulcan,
  8. SoloGun,
  9. Sniper,
  10. ShotGun,
  11. Seeker,
  12. RailGun,
  13. PlasmaGun,
  14. PlasmaBeam,
  15. PlasmaBeamHeavy,
  16. LightningGun,
  17. FlameRed,
  18. LaserImpulse
  19. }
  20. public class F3DFXController : MonoBehaviour
  21. {
  22. // Singleton instance
  23. public static F3DFXController instance;
  24. // GUI captions
  25. string[] fxTypeName = { "Vulcan", "Sologun", "Sniper", "Shotgun", "Seeker", "Railgun", "Plasmagun", "Plasma beam", "Heavy plasma beam", "Lightning gun", "Flamethrower", "Pulse laser" };
  26. // Current firing socket
  27. int curSocket;
  28. // Timer reference
  29. int timerID = -1;
  30. [Header("Turret setup")]
  31. public Transform[] TurretSocket; // Sockets reference
  32. public ParticleSystem[] ShellParticles; // Bullet shells particle system
  33. public F3DFXType DefaultFXType; // Default starting weapon type
  34. [Header("Vulcan")]
  35. public Transform vulcanProjectile; // Projectile prefab
  36. public Transform vulcanMuzzle; // Muzzle flash prefab
  37. public Transform vulcanImpact; // Impact prefab
  38. [Header("Solo gun")]
  39. public Transform soloGunProjectile;
  40. public Transform soloGunMuzzle;
  41. public Transform soloGunImpact;
  42. [Header("Sniper")]
  43. public Transform sniperBeam;
  44. public Transform sniperMuzzle;
  45. public Transform sniperImpact;
  46. [Header("Shotgun")]
  47. public Transform shotGunProjectile;
  48. public Transform shotGunMuzzle;
  49. public Transform shotGunImpact;
  50. [Header("Seeker")]
  51. public Transform seekerProjectile;
  52. public Transform seekerMuzzle;
  53. public Transform seekerImpact;
  54. [Header("Rail gun")]
  55. public Transform railgunBeam;
  56. public Transform railgunMuzzle;
  57. public Transform railgunImpact;
  58. [Header("Plasma gun")]
  59. public Transform plasmagunProjectile;
  60. public Transform plasmagunMuzzle;
  61. public Transform plasmagunImpact;
  62. [Header("Plasma beam")]
  63. public Transform plasmaBeam;
  64. [Header("Plasma beam heavy")]
  65. public Transform plasmaBeamHeavy;
  66. [Header("Lightning gun")]
  67. public Transform lightningGunBeam;
  68. [Header("Flame")]
  69. public Transform flameRed;
  70. [Header("Laser impulse")]
  71. public Transform laserImpulseProjectile;
  72. public Transform laserImpulseMuzzle;
  73. public Transform laserImpulseImpact;
  74. void Awake()
  75. {
  76. // Initialize singleton
  77. instance = this;
  78. // Initialize bullet shells particles
  79. for (int i = 0; i < ShellParticles.Length; i++)
  80. {
  81. ShellParticles[i].enableEmission = false;
  82. ShellParticles[i].gameObject.SetActive(true);
  83. }
  84. }
  85. // Display GUI
  86. void OnGUI()
  87. {
  88. GUIStyle caption = new GUIStyle(GUI.skin.label);
  89. caption.fontSize = 25;
  90. caption.fontStyle = FontStyle.Bold;
  91. caption.wordWrap = false;
  92. GUIStyle tooltip = new GUIStyle(GUI.skin.label);
  93. tooltip.fontSize = 11;
  94. tooltip.wordWrap = false;
  95. GUILayout.BeginArea(new Rect(Screen.width / 2 - 150, Screen.height - 150, 300, 120));
  96. GUILayout.BeginVertical();
  97. GUILayout.FlexibleSpace();
  98. GUILayout.BeginHorizontal();
  99. GUILayout.FlexibleSpace();
  100. GUILayout.Label(fxTypeName[(int)DefaultFXType], caption);
  101. GUILayout.FlexibleSpace();
  102. GUILayout.EndHorizontal();
  103. GUILayout.FlexibleSpace();
  104. GUILayout.BeginHorizontal();
  105. GUILayout.FlexibleSpace();
  106. GUILayout.Label("Press Left / Right arrow keys to switch", tooltip);
  107. GUILayout.FlexibleSpace();
  108. GUILayout.EndHorizontal();
  109. GUILayout.FlexibleSpace();
  110. GUILayout.BeginHorizontal();
  111. GUILayout.FlexibleSpace();
  112. if (GUILayout.Button("Previous", GUILayout.Width(90), GUILayout.Height(30)))
  113. PrevWeapon();
  114. GUILayout.FlexibleSpace();
  115. if (GUILayout.Button("Next", GUILayout.Width(90), GUILayout.Height(30)))
  116. NextWeapon();
  117. GUILayout.FlexibleSpace();
  118. GUILayout.EndHorizontal();
  119. GUILayout.FlexibleSpace();
  120. GUILayout.EndVertical();
  121. GUILayout.EndArea();
  122. }
  123. void Update()
  124. {
  125. // Switch weapon types using keyboard keys
  126. if (Input.GetKeyDown(KeyCode.RightArrow))
  127. NextWeapon();
  128. else if(Input.GetKeyDown(KeyCode.LeftArrow))
  129. PrevWeapon();
  130. }
  131. // Switch to next weapon type
  132. void NextWeapon()
  133. {
  134. if ((int)DefaultFXType < Enum.GetNames(typeof(F3DFXType)).Length - 1)
  135. {
  136. Stop();
  137. DefaultFXType++;
  138. }
  139. }
  140. // Switch to previous weapon type
  141. void PrevWeapon()
  142. {
  143. if (DefaultFXType > 0)
  144. {
  145. Stop();
  146. DefaultFXType--;
  147. }
  148. }
  149. // Advance to next turret socket
  150. void AdvanceSocket()
  151. {
  152. curSocket++;
  153. if (curSocket > 3)
  154. curSocket = 0;
  155. }
  156. // Fire turret weapon
  157. public void Fire()
  158. {
  159. switch (DefaultFXType)
  160. {
  161. case F3DFXType.Vulcan:
  162. // Fire vulcan at specified rate until canceled
  163. timerID = F3DTime.time.AddTimer(0.05f, Vulcan);
  164. // Invoke manually before the timer ticked to avoid initial delay
  165. Vulcan();
  166. break;
  167. case F3DFXType.SoloGun:
  168. timerID = F3DTime.time.AddTimer(0.2f, SoloGun);
  169. SoloGun();
  170. break;
  171. case F3DFXType.Sniper:
  172. timerID = F3DTime.time.AddTimer(0.3f, Sniper);
  173. Sniper();
  174. break;
  175. case F3DFXType.ShotGun:
  176. timerID = F3DTime.time.AddTimer(0.3f, ShotGun);
  177. ShotGun();
  178. break;
  179. case F3DFXType.Seeker:
  180. timerID = F3DTime.time.AddTimer(0.2f, Seeker);
  181. Seeker();
  182. break;
  183. case F3DFXType.RailGun:
  184. timerID = F3DTime.time.AddTimer(0.2f, RailGun);
  185. RailGun();
  186. break;
  187. case F3DFXType.PlasmaGun:
  188. timerID = F3DTime.time.AddTimer(0.2f, PlasmaGun);
  189. PlasmaGun();
  190. break;
  191. case F3DFXType.PlasmaBeam:
  192. // Beams has no timer requirement
  193. PlasmaBeam();
  194. break;
  195. case F3DFXType.PlasmaBeamHeavy:
  196. // Beams has no timer requirement
  197. PlasmaBeamHeavy();
  198. break;
  199. case F3DFXType.LightningGun:
  200. // Beams has no timer requirement
  201. LightningGun();
  202. break;
  203. case F3DFXType.FlameRed:
  204. // Flames has no timer requirement
  205. FlameRed();
  206. break;
  207. case F3DFXType.LaserImpulse:
  208. timerID = F3DTime.time.AddTimer(0.15f, LaserImpulse);
  209. LaserImpulse();
  210. break;
  211. default:
  212. break;
  213. }
  214. }
  215. // Stop firing
  216. public void Stop()
  217. {
  218. // Remove firing timer
  219. if (timerID != -1)
  220. {
  221. F3DTime.time.RemoveTimer(timerID);
  222. timerID = -1;
  223. }
  224. }
  225. // Fire vulcan weapon
  226. void Vulcan()
  227. {
  228. // Get random rotation that offset spawned projectile
  229. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  230. // Spawn muzzle flash and projectile with the rotation offset at current socket position
  231. F3DPool.instance.Spawn(vulcanMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  232. F3DPool.instance.Spawn(vulcanProjectile, TurretSocket[curSocket].position + TurretSocket[curSocket].forward, offset * TurretSocket[curSocket].rotation, null);
  233. // Emit one bullet shell
  234. ShellParticles[curSocket].Emit(1);
  235. // Play shot sound effect
  236. F3DAudioController.instance.VulcanShot(TurretSocket[curSocket].position);
  237. // Advance to next turret socket
  238. AdvanceSocket();
  239. }
  240. // Spawn vulcan weapon impact
  241. public void VulcanImpact(Vector3 pos)
  242. {
  243. // Spawn impact prefab at specified position
  244. F3DPool.instance.Spawn(vulcanImpact, pos, Quaternion.identity, null);
  245. // Play impact sound effect
  246. F3DAudioController.instance.VulcanHit(pos);
  247. }
  248. // Fire sologun weapon
  249. void SoloGun()
  250. {
  251. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  252. F3DPool.instance.Spawn(soloGunMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  253. F3DPool.instance.Spawn(soloGunProjectile, TurretSocket[curSocket].position + TurretSocket[curSocket].forward, offset * TurretSocket[curSocket].rotation, null);
  254. F3DAudioController.instance.SoloGunShot(TurretSocket[curSocket].position);
  255. AdvanceSocket();
  256. }
  257. // Spawn sologun weapon impact
  258. public void SoloGunImpact(Vector3 pos)
  259. {
  260. F3DPool.instance.Spawn(soloGunImpact, pos, Quaternion.identity, null);
  261. F3DAudioController.instance.SoloGunHit(pos);
  262. }
  263. // Fire sniper weapon
  264. void Sniper()
  265. {
  266. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  267. F3DPool.instance.Spawn(sniperMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  268. F3DPool.instance.Spawn(sniperBeam, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  269. F3DAudioController.instance.SniperShot(TurretSocket[curSocket].position);
  270. ShellParticles[curSocket].Emit(1);
  271. AdvanceSocket();
  272. }
  273. // Spawn sniper weapon impact
  274. public void SniperImpact(Vector3 pos)
  275. {
  276. F3DPool.instance.Spawn(sniperImpact, pos, Quaternion.identity, null);
  277. F3DAudioController.instance.SniperHit(pos);
  278. }
  279. // Fire shotgun weapon
  280. void ShotGun()
  281. {
  282. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  283. F3DPool.instance.Spawn(shotGunMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  284. F3DPool.instance.Spawn(shotGunProjectile, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  285. F3DAudioController.instance.ShotGunShot(TurretSocket[curSocket].position);
  286. ShellParticles[curSocket].Emit(1);
  287. AdvanceSocket();
  288. }
  289. // Fire seeker weapon
  290. void Seeker()
  291. {
  292. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  293. F3DPool.instance.Spawn(seekerMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  294. F3DPool.instance.Spawn(seekerProjectile, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  295. F3DAudioController.instance.SeekerShot(TurretSocket[curSocket].position);
  296. AdvanceSocket();
  297. }
  298. // Spawn seeker weapon impact
  299. public void SeekerImpact(Vector3 pos)
  300. {
  301. F3DPool.instance.Spawn(seekerImpact, pos, Quaternion.identity, null);
  302. F3DAudioController.instance.SeekerHit(pos);
  303. }
  304. // Fire rail gun weapon
  305. void RailGun()
  306. {
  307. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  308. F3DPool.instance.Spawn(railgunMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  309. F3DPool.instance.Spawn(railgunBeam, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  310. F3DAudioController.instance.RailGunShot(TurretSocket[curSocket].position);
  311. ShellParticles[curSocket].Emit(1);
  312. AdvanceSocket();
  313. }
  314. // Spawn rail gun weapon impact
  315. public void RailgunImpact(Vector3 pos)
  316. {
  317. F3DPool.instance.Spawn(railgunImpact, pos, Quaternion.identity, null);
  318. F3DAudioController.instance.RailGunHit(pos);
  319. }
  320. // Fire plasma gun weapon
  321. void PlasmaGun()
  322. {
  323. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  324. F3DPool.instance.Spawn(plasmagunMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  325. F3DPool.instance.Spawn(plasmagunProjectile, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  326. F3DAudioController.instance.PlasmaGunShot(TurretSocket[curSocket].position);
  327. AdvanceSocket();
  328. }
  329. // Spawn plasma gun weapon impact
  330. public void PlasmaGunImpact(Vector3 pos)
  331. {
  332. F3DPool.instance.Spawn(plasmagunImpact, pos, Quaternion.identity, null);
  333. F3DAudioController.instance.PlasmaGunHit(pos);
  334. }
  335. // Fire plasma beam weapon
  336. void PlasmaBeam()
  337. {
  338. F3DPool.instance.Spawn(plasmaBeam, TurretSocket[0].position, TurretSocket[0].rotation, TurretSocket[0]);
  339. F3DPool.instance.Spawn(plasmaBeam, TurretSocket[2].position, TurretSocket[2].rotation, TurretSocket[2]);
  340. }
  341. // Fire heavy beam weapon
  342. void PlasmaBeamHeavy()
  343. {
  344. F3DPool.instance.Spawn(plasmaBeamHeavy, TurretSocket[0].position, TurretSocket[0].rotation, TurretSocket[0]);
  345. F3DPool.instance.Spawn(plasmaBeamHeavy, TurretSocket[2].position, TurretSocket[2].rotation, TurretSocket[2]);
  346. }
  347. // Fire lightning gun weapon
  348. void LightningGun()
  349. {
  350. F3DPool.instance.Spawn(lightningGunBeam, TurretSocket[0].position, TurretSocket[0].rotation, TurretSocket[0]);
  351. F3DPool.instance.Spawn(lightningGunBeam, TurretSocket[2].position, TurretSocket[2].rotation, TurretSocket[2]);
  352. }
  353. // Fire flames weapon
  354. void FlameRed()
  355. {
  356. F3DPool.instance.Spawn(flameRed, TurretSocket[0].position, TurretSocket[0].rotation, TurretSocket[0]);
  357. F3DPool.instance.Spawn(flameRed, TurretSocket[2].position, TurretSocket[2].rotation, TurretSocket[2]);
  358. }
  359. // Fire laser pulse weapon
  360. void LaserImpulse()
  361. {
  362. Quaternion offset = Quaternion.Euler(UnityEngine.Random.onUnitSphere);
  363. F3DPool.instance.Spawn(laserImpulseMuzzle, TurretSocket[curSocket].position, TurretSocket[curSocket].rotation, TurretSocket[curSocket]);
  364. F3DPool.instance.Spawn(laserImpulseProjectile, TurretSocket[curSocket].position, offset * TurretSocket[curSocket].rotation, null);
  365. F3DAudioController.instance.LaserImpulseShot(TurretSocket[curSocket].position);
  366. AdvanceSocket();
  367. }
  368. // Spawn laser pulse weapon impact
  369. public void LaserImpulseImpact(Vector3 pos)
  370. {
  371. F3DPool.instance.Spawn(laserImpulseImpact, pos, Quaternion.identity, null);
  372. F3DAudioController.instance.LaserImpulseHit(pos);
  373. }
  374. }