Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Philou231 · Jun 01, 2015 at 05:17 AM · c#scripting problemtriggereventdelegate

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

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

2 People are following this question.

avatar image avatar image

Related Questions

Parametrize generic event system (DRY it) 1 Answer

Sharing delegate types across scripts 1 Answer

Will UnityEvent wait for completion of listeners ? 0 Answers

calling a function when any variable in an array changes 1 Answer

Movement script not working properly 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges