View difference between Paste ID: GuGMQSrL and V5TEH7Z5
SHOW: | | - or go back to the newest paste.
1
public class SpellLogic : MonoBehaviour
2
{
3
    public SpellData SpellData;
4
    SpellEffect SpellEffect;
5
    // Use this for initialization
6
    void Start ()
7
    {
8
        SpellEffect = SpellData.Effect;
9
        SpellEffect.OnStart();
10
        StartCoroutine(SpellEffect.OnTick());
11
        Instantiate(SpellData.ParticleSystem, gameObject.transform);
12
    }
13
	
14
	// Update is called once per frame
15
	void Update ()
16
    {
17
		
18
	}
19
}
20
21
public class SpellData : ScriptableObject
22
{
23
    private string name;
24
    private ResourceType resourceType;
25
    private float resourceCost;
26
    private ParticleSystem particleSystem;
27
    private SpellEffect effect;
28
29
    public string Name
30
    {
31
        get
32
        {
33
            return name;
34
        }
35
36
        set
37
        {
38
            name = value;
39
        }
40
    }
41
    public ResourceType ResourceType
42
    {
43
        get
44
        {
45
            return resourceType;
46
        }
47
48
        set
49
        {
50
            resourceType = value;
51
        }
52
    }
53
    public float ResourceCost
54
    {
55
        get
56
        {
57
            return resourceCost;
58
        }
59
60
        set
61
        {
62
            resourceCost = value;
63
        }
64
    }
65
    public ParticleSystem ParticleSystem
66
    {
67
        get
68
        {
69
            return particleSystem;
70
        }
71
72
        set
73
        {
74
            particleSystem = value;
75
        }
76
    }
77
    public SpellEffect Effect
78
    {
79
        get
80
        {
81
            return effect;
82
        }
83
84
        set
85
        {
86
            effect = value;
87
        }
88
    }
89
}
90
91
using System.Collections;
92
using System.Collections.Generic;
93
using UnityEngine;
94
95
[CreateAssetMenu(fileName = "New Spell Effect", menuName = "Spell Effect")]
96
public abstract class SpellEffect : ScriptableObject
97
{
98
    public GameObject Spell;
99
    public float Duration = 1f;
100
    public List<GameObject> Targets;
101
    public List<StatusEffect> StatusEffects;
102
    public CharacterController Caster;
103
104
    public abstract void OnStart();
105
    public abstract IEnumerator OnTick();
106
}
107
108
public class HealSpellEffect : SpellEffect
109
{
110
    public override void OnStart()
111
    {
112
        Destroy(Spell,Duration);
113
    }
114
    public override IEnumerator OnTick()
115
    {
116
        do
117
        {
118
            foreach (GameObject item in Targets)
119
            {
120
                item.GetComponent<IDamagable>().ApplyDamage(HealAmount, DamageType);
121
            }
122
            yield return new WaitForSeconds(Interval);
123
        }
124
        while (true);
125
    }
126
127
    public float HealAmount;
128
    public DamageType DamageType;
129
    public float Interval;
130
}
131
132
public class PoisonSpellEffect : SpellEffect
133
{
134
    public float Interval;
135
    public float Damage;
136
    public DamageType DamageType;
137
    private StatusEffect statusEffect = new StatusEffect { Name = "Poisoned", Description = "Deals damage repeatedly"};
138
    public override void OnStart()
139
    {
140
        statusEffect.Duration = Duration;
141
        statusEffect.Interval = Interval;
142
        Destroy(Spell, Duration);
143
        foreach (GameObject member in Targets)
144
        {
145
            statusEffect.OnProc += delegate { member.GetComponent<IDamagable>().ApplyDamage(Damage, DamageType); };
146
            member.GetComponent<IAfflictable>().Afflict(statusEffect);
147
        }
148
    }
149
    public override IEnumerator OnTick()
150
    {
151
        yield return null;
152
    }
153
}
154
155
public class StatusEffect : ScriptableObject
156
{
157
    public delegate void OnProcDelegate();
158
    public delegate void OnExpireDelegate(StatusEffect target);
159
160
    private string name;
161
    private string description;
162
    private float duration;
163
    private float interval;
164
    private OnProcDelegate onProc;
165
    private OnExpireDelegate onExpire;
166
167
    public string Name
168
    {
169
        get
170
        {
171
            return name;
172
        }
173
174
        set
175
        {
176
            name = value;
177
        }
178
    }
179
    public string Description
180
    {
181
        get
182
        {
183
            return description;
184
        }
185
186
        set
187
        {
188
            description = value;
189
        }
190
    }
191
    public float Duration
192
    {
193
        get
194
        {
195
            return duration;
196
        }
197
198
        set
199
        {
200
            duration = value;
201
            if (duration <= 0) OnExpire(this);
202
        }
203
    }
204
    public float Interval
205
    {
206
        get
207
        {
208
            return interval;
209
        }
210
211
        set
212
        {
213
            interval = value;
214
        }
215
    }
216
    public OnProcDelegate OnProc
217
    {
218
        get
219
        {
220
            return onProc;
221
        }
222
223
        set
224
        {
225
            onProc = value;
226
        }
227
    }
228
    public OnExpireDelegate OnExpire
229
    {
230
        get
231
        {
232
            return onExpire;
233
        }
234
235
        set
236
        {
237
            onExpire = value;
238
        }
239
    }
240
241
    public IEnumerator Proc()
242
    {
243
        OnProc();
244
        yield return new WaitForSeconds(Interval);
245
    }
246
} 
247
248
public class CharacterController : MonoBehaviour, IAfflictable, IDamagable
249
{
250
    List<SpellData> spellList = new List<SpellData>();
251
    List<StatusEffect> statusEffects = new List<StatusEffect>();
252
253
    public List<SpellData> SpellList
254
    {
255
        get
256
        {
257
            return spellList;
258
        }
259
260
        set
261
        {
262
            spellList = value;
263
        }
264
    }
265
    public List<StatusEffect> StatusEffects
266
    {
267
        get
268
        {
269
            return statusEffects;
270
        }
271
272
        set
273
        {
274
            statusEffects = value;
275
        }
276
    }
277
    
278
    #region Methods
279
    void Start()
280
    {
281
282
    }
283
284
    void Update()
285
    {
286
287
    }
288
289
    public void Afflict(StatusEffect statusEffect)
290
    {
291
        statusEffect.OnExpire += RemoveStatusEffect;
292
        StartCoroutine(statusEffect.Proc());
293
        StatusEffects.Add(statusEffect);
294
    }
295
    public void RemoveStatusEffect(StatusEffect Target)
296
    {
297
        StatusEffects.Remove(Target);
298
    }
299
300
    public float ApplyDamage(float Damage, DamageType DamageType)
301
    {
302
        return 0f;
303
    }
304
    #endregion
305
}