This repository has been archived by the owner on Dec 17, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GunBase.cs
206 lines (179 loc) · 4.58 KB
/
GunBase.cs
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//Author: Raul Rojas
//CSE 1302
//Project One
//6-23-2017
public abstract class GunBase: MonoBehaviour, System.IEquatable<GunBase>
{
#region Fields
#region Public
public string gunName = "";
public float fireRate = 1;
public GameObject bulletPreFab;
public bool isAutomatic;
public int maxAmmo;
public int clipSize;
public float reloadTime = 1;
//public ParticleSystem gunFireParticles;
#endregion
#region Protected
protected float lastShot;
protected bool canShoot;
protected int ammo;
protected int clipAmmo;
protected float reloadFinishTime;
protected bool isReloading;
#endregion
#region Private
private int reloadState;
private bool pressedReload;
#endregion
#endregion
#region Properties
public int Ammo
{
get { return this.ammo; }
set { this.ammo = value; }
}
public int ClipAmmo
{
get { return this.clipAmmo; }
}
public bool IsReloading
{
get { return this.isReloading; }
}
public float ReloadFinishTime
{
get { return this.reloadFinishTime; }
}
public bool PressedReload
{
get { return this.pressedReload; }
set { this.pressedReload = value; }
}
#endregion
#region MonoBehaviours
private void Start()
{
lastShot = -fireRate;
canShoot = true;
isReloading = false;
ammo = 0;
clipAmmo = clipSize;
reloadState = 0;
}
private void Update()
{
if (((Time.time - lastShot) >= fireRate) && clipAmmo > 0 && !isReloading)
{
canShoot = true;
}
else
{
canShoot = false;
}
reloadControl();
}
#endregion
#region Public Methods
public bool Equals(GunBase other)
{
if (this.gunName == other.gunName)
{
return true;
}
else
{
return false;
}
}
public virtual void shoot()
{
GameController gameControl = GameObject.Find("GameController").GetComponent<GameController>();
gameControl.ShotsFired++;
playFireSound();
//Debug.Log("Incrimented ShotsFired: " + gameControl.ShotsFired);
}
public void rotate()
{
this.gameObject.transform.Rotate(new Vector3(0, 1, 0), Space.World);
}
public void reload()
{
int diff = clipSize - clipAmmo;
if (diff > ammo)
{
clipAmmo += ammo;
ammo = 0;
}
else
{
clipAmmo = clipSize;
ammo -= diff;
}
}
public void reloadControl()
{
switch(reloadState)
{
case 0:
if ((clipAmmo <= 0 || pressedReload) && ammo > 0 && (clipAmmo < clipSize))
{
isReloading = true;
canShoot = false;
reloadFinishTime = Time.time + reloadTime;
reloadState = 1;
playReloadSound();
}
else pressedReload = false;
break;
case 1:
if (Time.time >= reloadFinishTime)
{
isReloading = false;
canShoot = true;
pressedReload = false;
reloadState = 0;
reload();
}
break;
default:
reloadState = 0;
break;
}
}
#endregion
#region Private Methods
private void playReloadSound()
{
if(this is Gun_Shotgun)
{
AudioManager.instance.Play(GameStructs.ClipName.ShotgunReload);
}
else
{
AudioManager.instance.Play(GameStructs.ClipName.SmgReload);
}
}
private void playFireSound()
{
if (this is Gun_Pistol)
{
AudioManager.instance.Play(GameStructs.ClipName.PistolFire);
}
else if(this is Gun_Shotgun)
{
AudioManager.instance.Play(GameStructs.ClipName.ShotgunFire);
}
else
{
AudioManager.instance.Play(GameStructs.ClipName.PistolFire);
}
}
#endregion
}