Skip to content

Commit 9e4a95b

Browse files
committed
Adding trigger events for Unity
1 parent da35af8 commit 9e4a95b

5 files changed

+184
-2
lines changed

.DS_Store

6 KB
Binary file not shown.

Distro/.DS_Store

6 KB
Binary file not shown.

Distro/CreatureGameController.cs

+122
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,47 @@
4545
using UnityEditor;
4646
#endif
4747

48+
public class CreatureFrameCallback
49+
{
50+
public CreatureFrameCallback()
51+
{
52+
resetCallback();
53+
}
54+
55+
public void resetCallback()
56+
{
57+
triggered = false;
58+
}
59+
60+
public bool tryTrigger(float frameIn)
61+
{
62+
if(triggered)
63+
{
64+
return false;
65+
}
66+
67+
if((int)Math.Round(frameIn) >= frameIn)
68+
{
69+
triggered = true;
70+
return true;
71+
}
72+
73+
return false;
74+
}
75+
76+
public string name;
77+
public string animClipName;
78+
public int frame = 0;
79+
public bool triggered = false;
80+
}
81+
4882
public class CreatureGameController : MonoBehaviour
4983
{
5084
public CreatureRenderer creature_renderer;
5185
public List<CreatureSwitchItemRenderer> switch_renderer_list;
86+
public delegate void eventTrigger(string event_name);
87+
public static event eventTrigger OnEventTrigger;
88+
public List<CreatureFrameCallback> event_callbacks = new List<CreatureFrameCallback>();
5289
public float colliderHeight;
5390
public float simColliderWidth, simColliderHeight;
5491
public bool noCollisions = false;
@@ -253,13 +290,87 @@ void Start() {
253290
// var cur_switcher = switch_renderer_list [0];
254291
// cur_switcher.AddSwitchItem ("torsoSwitch1", new UnityEngine.Vector2 (136, 4), 481, 569, 2048, 2048);
255292

293+
if(creature_renderer)
294+
{
295+
creature_renderer.SetGameController(this);
296+
}
297+
298+
BuildFrameCallbacks();
299+
ResetFrameCallbacks();
300+
256301
// Call a custom agent if available
257302
if (customAgent)
258303
{
259304
customAgent.initState();
260305
}
261306
}
262307

308+
private void BuildFrameCallbacks()
309+
{
310+
if(creature_renderer)
311+
{
312+
var meta_asset = creature_renderer.creature_asset.creature_meta_data;
313+
if(meta_asset != null)
314+
{
315+
foreach(var cur_data in meta_asset.anim_events_map)
316+
{
317+
foreach(var cur_event in cur_data.Value)
318+
{
319+
var new_callback = new CreatureFrameCallback();
320+
new_callback.animClipName = cur_data.Key;
321+
new_callback.name = cur_event.Value;
322+
new_callback.frame = cur_event.Key;
323+
324+
event_callbacks.Add(new_callback);
325+
}
326+
}
327+
}
328+
}
329+
}
330+
331+
private void ResetFrameCallbacks()
332+
{
333+
foreach(var frame_callback in event_callbacks)
334+
{
335+
frame_callback.resetCallback();
336+
}
337+
}
338+
339+
public void AnimClipChangeEvent()
340+
{
341+
var meta_asset = creature_renderer.creature_asset.creature_meta_data;
342+
if(meta_asset != null)
343+
{
344+
ResetFrameCallbacks();
345+
}
346+
}
347+
348+
public void AnimClipFrameResetEvent()
349+
{
350+
var meta_asset = creature_renderer.creature_asset.creature_meta_data;
351+
if(meta_asset != null)
352+
{
353+
ResetFrameCallbacks();
354+
}
355+
}
356+
357+
private void ProcessFrameCallbacks()
358+
{
359+
var cur_runtime = creature_renderer.creature_manager.getActualRuntime();
360+
foreach(var frame_callback in event_callbacks)
361+
{
362+
if(frame_callback.animClipName == creature_renderer.creature_manager.active_animation_name)
363+
{
364+
var should_trigger = frame_callback.tryTrigger(cur_runtime);
365+
//Debug.Log(frame_callback.name + " " + frame_callback.frame.ToString());
366+
if(should_trigger && (OnEventTrigger != null))
367+
{
368+
OnEventTrigger(frame_callback.name);
369+
}
370+
}
371+
}
372+
}
373+
263374
private void UpdateGameColliders()
264375
{
265376
int i = 0;
@@ -316,6 +427,17 @@ void FixedUpdate() {
316427
customAgent.updateStep();
317428
}
318429

430+
// Call event triggers if required
431+
if(creature_renderer)
432+
{
433+
var meta_asset = creature_renderer.creature_asset.creature_meta_data;
434+
if(meta_asset != null)
435+
{
436+
ProcessFrameCallbacks();
437+
}
438+
}
439+
440+
319441
// The following code demonstrates how to do item switching
320442
/*
321443
CreatureManager cur_manager = creature_renderer.creature_manager;

Distro/CreatureModule.cs

+39
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ namespace CreatureModule
4646
public class CreatureMetaData {
4747
public Dictionary<int, Tuple<int, int>> mesh_map;
4848
public Dictionary<String, Dictionary<int, List<int> >> anim_order_map;
49+
public Dictionary<String, Dictionary<int, String>> anim_events_map;
4950

5051
public CreatureMetaData()
5152
{
5253
mesh_map = new Dictionary<int, Tuple<int, int>>();
5354
anim_order_map = new Dictionary<String, Dictionary<int, List<int> >>();
55+
anim_events_map = new Dictionary<String, Dictionary<int, String>>();
5456
}
5557

5658
public void clear()
@@ -216,6 +218,7 @@ public static void BuildCreatureMetaData(CreatureMetaData meta_data, string json
216218
meta_data.clear();
217219
var json_dict = JsonFx.Json.JsonReader.Deserialize(json_text_in, typeof(Dictionary<string, object>)) as Dictionary<string, object>;
218220

221+
// Build Region Ordering
219222
if(json_dict.ContainsKey("meshes"))
220223
{
221224
var all_meshes = (Dictionary<string, object>)json_dict["meshes"];
@@ -251,6 +254,29 @@ public static void BuildCreatureMetaData(CreatureMetaData meta_data, string json
251254
meta_data.anim_order_map[anim_name] = write_order_dict;
252255
}
253256
}
257+
258+
// Build Event Triggers
259+
if(json_dict.ContainsKey("eventTriggers"))
260+
{
261+
var events_obj = (Dictionary<string, object>)json_dict["eventTriggers"];
262+
foreach(var cur_data in events_obj)
263+
{
264+
var cur_anim_name = cur_data.Key;
265+
var cur_events_map = new Dictionary<int, string>();
266+
var cur_obj_array = (System.Object[])cur_data.Value;
267+
268+
foreach(var cur_events_json in cur_obj_array)
269+
{
270+
var cur_events_obj = (Dictionary<string, object>)cur_events_json;
271+
var cur_event_name = (string)cur_events_obj["event_name"];
272+
var switch_time = Convert.ToInt32(cur_events_obj["switch_time"]);
273+
274+
cur_events_map[switch_time] = cur_event_name;
275+
}
276+
277+
meta_data.anim_events_map[cur_anim_name] = cur_events_map;
278+
}
279+
}
254280
}
255281

256282
public static float[] getFloatArray(System.Object raw_data)
@@ -1349,6 +1375,19 @@ public float getRunTime()
13491375
{
13501376
return run_time;
13511377
}
1378+
1379+
// Returns current run time in consideration of blending
1380+
public float getActualRuntime()
1381+
{
1382+
if(do_auto_blending)
1383+
{
1384+
if(active_blend_run_times.ContainsKey(active_animation_name)) {
1385+
return active_blend_run_times[active_animation_name];
1386+
}
1387+
}
1388+
1389+
return run_time;
1390+
}
13521391

13531392
// Runs a single step of the animation for a given delta timestep
13541393
public void Update(float delta)

Distro/CreatureRenderer.cs

+23-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class CreatureRenderer : MonoBehaviour
6363
public float local_time_scale;
6464
public CreatureAsset creature_asset;
6565
public CreatureManager creature_manager;
66+
private CreatureGameController game_controller = null;
6667
public int animation_choice_index;
6768
public string active_animation_name;
6869
public float blend_rate = 0.1f;
@@ -111,6 +112,11 @@ public virtual void Reset()
111112
local_time = 0;
112113
}
113114

115+
public void SetGameController(CreatureGameController controller_in)
116+
{
117+
game_controller = controller_in;
118+
}
119+
114120
public void InitData()
115121
{
116122
if (creature_asset) {
@@ -179,6 +185,11 @@ public void SetActiveAnimation(string animation_name, bool already_active_check=
179185

180186

181187
local_time = creature_manager.animations [creature_manager.GetActiveAnimationName()].start_time;
188+
189+
if(game_controller)
190+
{
191+
game_controller.AnimClipChangeEvent();
192+
}
182193
}
183194

184195
public void BlendToAnimation(string animation_name)
@@ -190,6 +201,11 @@ public void BlendToAnimation(string animation_name)
190201
active_animation_name = animation_name;
191202
creature_manager.SetAutoBlending (true);
192203
creature_manager.AutoBlendTo (animation_name, blend_rate);
204+
205+
if(game_controller)
206+
{
207+
game_controller.AnimClipChangeEvent();
208+
}
193209
}
194210

195211
// Returns the local playback time
@@ -348,13 +364,18 @@ public void UpdateTime()
348364
return;
349365
}
350366

351-
367+
var old_time = creature_manager.getActualRuntime();
352368
float time_delta = (Time.deltaTime * local_time_scale);
353369

354370
creature_manager.region_offsets_z = region_offsets_z;
355371
creature_manager.should_loop = should_loop;
356372
creature_manager.Update(time_delta);
357-
local_time = creature_manager.getRunTime();
373+
local_time = creature_manager.getActualRuntime();
374+
375+
if((local_time < old_time) && (game_controller != null))
376+
{
377+
game_controller.AnimClipFrameResetEvent();
378+
}
358379
}
359380

360381
public virtual void LateUpdate ()

0 commit comments

Comments
 (0)