An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.3 KiB

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Fungus
{
public class EventHandlerInfoAttribute : Attribute
{
public EventHandlerInfoAttribute(string category, string eventHandlerName, string helpText)
{
this.Category = category;
this.EventHandlerName = eventHandlerName;
this.HelpText = helpText;
}
public string Category { get; set; }
public string EventHandlerName { get; set; }
public string HelpText { get; set; }
}
/**
* A Sequence may have an associated Event Handler which starts executing the sequence when
* a specific event occurs.
* To create a custom Event Handler, simply subclass EventHandler and call the ExecuteSequence() method
* when the event occurs.
* Add an EventHandlerInfo attibute and your new EventHandler class will automatically appear in the
* 'Execute On Event' dropdown menu when a sequence is selected.
*/
[RequireComponent(typeof(Sequence))]
[RequireComponent(typeof(FungusScript))]
[AddComponentMenu("")]
public class EventHandler : MonoBehaviour
{
[HideInInspector]
public Sequence parentSequence;
/**
* Returns the class attribute info for an event handler class.
*/
public static EventHandlerInfoAttribute GetEventHandlerInfo(System.Type eventHandlerType)
{
object[] attributes = eventHandlerType.GetCustomAttributes(typeof(EventHandlerInfoAttribute), false);
foreach (object obj in attributes)
{
EventHandlerInfoAttribute eventHandlerInfoAttr = obj as EventHandlerInfoAttribute;
if (eventHandlerInfoAttr != null)
{
return eventHandlerInfoAttr;
}
}
return null;
}
/**
* The Event Handler should call this method when the event is detected.
*/
public virtual bool ExecuteSequence()
{
if (parentSequence == null)
{
return false;
}
FungusScript fungusScript = parentSequence.GetFungusScript();
return fungusScript.ExecuteSequence(parentSequence);
}
/**
* Returns a custom summary for the event handler.
* If the string is empty, the editor will use the EventHandlerName property of
* the EventHandlerInfo attribute instead.
*/
public virtual string GetSummary()
{
EventHandlerInfoAttribute info = GetEventHandlerInfo(this.GetType());
if (info == null)
{
return "";
}
return info.EventHandlerName;
}
}
}