- Home /
Generic Triggers and Actions
Hi, I'm trying to develop generic scripts. There would be two different types. The first type is a trigger script and the second one is a action script. What I want is that those two scripts are perfectly generic and can be match with one another without problems.
Example: I have two trigger scripts (TrigWhenNoAudio and TrigWhenClick) and two action scripts (DoChangeScene and DoNotRender)
In this example I want to have only 4 scripts and still be able to make the 4 arrangements (NoAudio-ChangeScene,NoAudio-NotRender,Click-ChangeScene,Click-NotRender) without creating any extra script.
My idea was to use events and delegates. In the trig scripts I would create a delegate and an event and then in the action scripts I would create a function that does the action and also add that function to the appropriate event.
This is where the problem is; I don't want to write any specific event/delegate in any of the action scripts. So I tried to create a generic class of trigger that each trigger script would inherit from. In my action script I could use the mother class trig to define the event to which will be added the function.
If the scripts were functional, I would then want the event to be set by the user as a public member.
Here is what I tried:
Trig.cs
using UnityEngine;
using System.Collections;
public abstract class Trig : MonoBehaviour
{
public delegate void Action();
public static event Action trig;
}
TrigWhenNoAudio.cs
using UnityEngine;
using System.Collections;
public class TrigWhenNoAudio : Trig
{
//public delegate void NoSoundAction();
public static new event Action trig;
private AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
void Update()
{
if (!audioSource.isPlaying)
{
if(trig != null)
trig();
}
}
}
DoChangeScene.cs
using UnityEngine;
using System.Collections;
public class DoChangeScene : MonoBehaviour
{
public event TrigWhenNoAudio.Action m_trigger;//I want this to be set by the user
public string sceneName="";
void OnEnable()
{
m_trigger += ChangeScene;
//TrigWhenNoAudio.trig += ChangeScene; //This works if decommented but it's not generic
}
void OnDisable()
{
m_trigger -= ChangeScene;
//TrigWhenNoAudio.trig -= ChangeScene; //This works if decommented but it's not generic
}
// Use this for initialization
void ChangeScene()
{
Application.LoadLevel(sceneName);
}
}
This code doesn't work because the member m_trigger is not set (and doesn't appear as a parameter for the user). If I try to initialize it like so:
public event TrigWhenNoAudio.Action m_trigger = TrigWhenNoAudio.trig;
it still doesn't work because "The event TrigWhenNoAudio.trig' can only appear on the left hand side of += or -= when used outside of the type
TrigWhenNoAudio'". I also tried with pointers but with no luck "Cannot take the address of, get the size of, or declare a pointer to a managed type `Trig.Action'"
Maybe there is a radically different way to do what I'm trying to do. If you have any idea, let me know. Thanks in advance for any help!
Philou231