Skip to content

Commit 280cd23

Browse files
committed
Added static event example to Observer
1 parent 0bf2fd1 commit 280cd23

13 files changed

+565
-2
lines changed

Assets/Patterns/3. Observer/Different events/DifferentEvents.cs renamed to Assets/Patterns/3. Observer/Different events/DifferentEventAlternatives.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace Observer.DifferentEvents
88
{
99
//A summary of all different events alternatives
10-
public class DifferentEvents : MonoBehaviour
10+
public class DifferentEventAlternatives : MonoBehaviour
1111
{
1212
//
1313
// Built-in event handling

Assets/Patterns/3. Observer/Static events.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1 &3795548911032069199
4+
GameObject:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
serializedVersion: 6
10+
m_Component:
11+
- component: {fileID: 5170567254207206714}
12+
- component: {fileID: 958802086957748505}
13+
- component: {fileID: 4635099428496446250}
14+
- component: {fileID: 2981133933446519919}
15+
- component: {fileID: 6019547679234711328}
16+
m_Layer: 0
17+
m_Name: Enemy
18+
m_TagString: Untagged
19+
m_Icon: {fileID: 0}
20+
m_NavMeshLayer: 0
21+
m_StaticEditorFlags: 0
22+
m_IsActive: 1
23+
--- !u!4 &5170567254207206714
24+
Transform:
25+
m_ObjectHideFlags: 0
26+
m_CorrespondingSourceObject: {fileID: 0}
27+
m_PrefabInstance: {fileID: 0}
28+
m_PrefabAsset: {fileID: 0}
29+
m_GameObject: {fileID: 3795548911032069199}
30+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
31+
m_LocalPosition: {x: 0, y: 0, z: 0}
32+
m_LocalScale: {x: 1, y: 1, z: 1}
33+
m_Children: []
34+
m_Father: {fileID: 0}
35+
m_RootOrder: 0
36+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
37+
--- !u!33 &958802086957748505
38+
MeshFilter:
39+
m_ObjectHideFlags: 0
40+
m_CorrespondingSourceObject: {fileID: 0}
41+
m_PrefabInstance: {fileID: 0}
42+
m_PrefabAsset: {fileID: 0}
43+
m_GameObject: {fileID: 3795548911032069199}
44+
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
45+
--- !u!23 &4635099428496446250
46+
MeshRenderer:
47+
m_ObjectHideFlags: 0
48+
m_CorrespondingSourceObject: {fileID: 0}
49+
m_PrefabInstance: {fileID: 0}
50+
m_PrefabAsset: {fileID: 0}
51+
m_GameObject: {fileID: 3795548911032069199}
52+
m_Enabled: 1
53+
m_CastShadows: 1
54+
m_ReceiveShadows: 1
55+
m_DynamicOccludee: 1
56+
m_MotionVectors: 1
57+
m_LightProbeUsage: 1
58+
m_ReflectionProbeUsage: 1
59+
m_RenderingLayerMask: 1
60+
m_RendererPriority: 0
61+
m_Materials:
62+
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
63+
m_StaticBatchInfo:
64+
firstSubMesh: 0
65+
subMeshCount: 0
66+
m_StaticBatchRoot: {fileID: 0}
67+
m_ProbeAnchor: {fileID: 0}
68+
m_LightProbeVolumeOverride: {fileID: 0}
69+
m_ScaleInLightmap: 1
70+
m_PreserveUVs: 0
71+
m_IgnoreNormalsForChartDetection: 0
72+
m_ImportantGI: 0
73+
m_StitchLightmapSeams: 0
74+
m_SelectedEditorRenderState: 3
75+
m_MinimumChartSize: 4
76+
m_AutoUVMaxDistance: 0.5
77+
m_AutoUVMaxAngle: 89
78+
m_LightmapParameters: {fileID: 0}
79+
m_SortingLayerID: 0
80+
m_SortingLayer: 0
81+
m_SortingOrder: 0
82+
--- !u!65 &2981133933446519919
83+
BoxCollider:
84+
m_ObjectHideFlags: 0
85+
m_CorrespondingSourceObject: {fileID: 0}
86+
m_PrefabInstance: {fileID: 0}
87+
m_PrefabAsset: {fileID: 0}
88+
m_GameObject: {fileID: 3795548911032069199}
89+
m_Material: {fileID: 0}
90+
m_IsTrigger: 0
91+
m_Enabled: 1
92+
serializedVersion: 2
93+
m_Size: {x: 1, y: 1, z: 1}
94+
m_Center: {x: 0, y: 0, z: 0}
95+
--- !u!114 &6019547679234711328
96+
MonoBehaviour:
97+
m_ObjectHideFlags: 0
98+
m_CorrespondingSourceObject: {fileID: 0}
99+
m_PrefabInstance: {fileID: 0}
100+
m_PrefabAsset: {fileID: 0}
101+
m_GameObject: {fileID: 3795548911032069199}
102+
m_Enabled: 1
103+
m_EditorHideFlags: 0
104+
m_Script: {fileID: 11500000, guid: 1f3193e44b9e9474c9ce8a40cc272d0a, type: 3}
105+
m_Name:
106+
m_EditorClassIdentifier:

Assets/Patterns/3. Observer/Static events/Enemy.prefab.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Patterns/3. Observer/Static events/Scripts.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using UnityEngine;
5+
6+
namespace Observer.StaticEvents
7+
{
8+
public class Enemy : MonoBehaviour
9+
{
10+
//Because this is static we only need to subscribe to this event once
11+
public static event Action<Enemy> onAnyEnemyDie;
12+
//What the enemy is worth
13+
public int enemyValue { get; private set; }
14+
15+
16+
void Start()
17+
{
18+
19+
}
20+
21+
22+
void Update()
23+
{
24+
25+
}
26+
27+
28+
private void OnDisable()
29+
{
30+
enemyValue = UnityEngine.Random.Range(0, 5);
31+
32+
//Debug.Log(enemyValue);
33+
34+
//Invoke the event and to each method that subscribes to the event we will send a reference to this object
35+
onAnyEnemyDie?.Invoke(this);
36+
37+
//This is also working, but is less clear
38+
//onAnyEnemyDie(this);
39+
}
40+
}
41+
}

Assets/Patterns/3. Observer/Static events/Scripts/Enemy.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
namespace Observer.StaticEvents
6+
{
7+
//Will illustrate static events
8+
//Basic idea is that when an enemy dies, we add to the score
9+
public class StaticEventsController : MonoBehaviour
10+
{
11+
public Enemy enemyPrefab;
12+
13+
private int score;
14+
15+
private int enemiesKilled = 0;
16+
17+
18+
void Awake()
19+
{
20+
//Subscribe to the event that's happening each time an enemy dies
21+
//Multiple things may happen when an enemy dies, so better to have the event in the enemy class!
22+
//Because this is a static event we only need to subscribe once and not to each enemy instance
23+
Enemy.onAnyEnemyDie += AddToScore;
24+
}
25+
26+
27+
void Update()
28+
{
29+
//Spawn new enemies that will die after some time
30+
if (Input.GetKeyDown(KeyCode.Space))
31+
{
32+
GameObject newEnemy = Instantiate(enemyPrefab.gameObject, Random.insideUnitSphere, Quaternion.identity) as GameObject;
33+
34+
//Kill the enemy automatically after 3 seconds which will trigger the event
35+
Destroy(newEnemy, 3f);
36+
}
37+
}
38+
39+
40+
//This method subscribes to the event
41+
void AddToScore(Enemy enemyScript)
42+
{
43+
score += enemyScript.enemyValue;
44+
45+
enemiesKilled += 1;
46+
47+
Debug.Log($"You've killed {enemiesKilled} enemies and the score is: {score}");
48+
}
49+
}
50+
}

Assets/Patterns/3. Observer/Static events/Scripts/StaticEventsController.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)