Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

108
Views
Event to detect ActiveSelf

Is there a listener event to detect if an object is set to inactive from active state or to active from inactive state? I do not want to add it in Update as there will be multiple calls and it would affect my game's performance. So is there an alternative for this?

    public GameObject Go_1;
    public GameObject Go_2;

    void Update () {
        if (Go_1.activeSelf) {

        } else if (Go_2.activeSelf) {

        }
    }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Yes, try with OnEnable and OnDisable.

// Implement OnDisable and OnEnable script functions.
// These functions will be called when the attached GameObject
// is toggled.
// This example also supports the Editor.  The Update function
// will be called, for example, when the position of the
// GameObject is changed.

using UnityEngine;

[ExecuteInEditMode]
public class PrintOnOff : MonoBehaviour
{
    void OnDisable()
    {
        Debug.Log("PrintOnDisable: script was disabled");
    }

    void OnEnable()
    {
        Debug.Log("PrintOnEnable: script was enabled");
    }

    void Update()
    {
#if UNITY_EDITOR
        Debug.Log("Editor causes this Update");
#endif
    }
}
over 4 years ago · Santiago Trujillo Report

0

You could implement something using the Update method like e.g.

public class ActiveSelfWatcher : MonoBehaviour
{
    private Dictionary<ActiveSelfProvider, bool> _lastActiveSelfState = new Dictionary<ActiveSelfProvider, bool>();

    private void OnObjectBecameActive(GameObject obj)
    {
        Debug.Log($"{obj.name} became active!", this);
    }

    private void OnObjectBecameInactive(GameObject obj)
    {
        Debug.Log($"{obj.name} became inactive!", this);
    }

    private void Update()
    {
        // Iterate through all registered instances of ActiveSelfProvider
        foreach(var provider in ActiveSelfProvider.Instances)
        {
            // pre-cache the GameObject reference
            var obj = provider.gameObject;
            // pre-cache the current activeSelf state
            var currentActive = obj.activeSelf;

            if(!_lastActiveSelfState.TryGetValue(provider))
            {
                // we don't know this provider until now 

                // TODO here you have to decide whether you want to call the events now once for this provider or not
                // TODO otherwise it is only called for providers you already know and changed their state
            }

            if(currentActive != _lastActiveSelfState[provider])
            {
                // the state is not the one we stored for this instance
                // => it changed its states since the last frame

                // Call the according "event"
                if(currentActive)
                {
                    OnObjectBecameActive(obj);
                }
                else
                {
                    OnObjectBecameInactive(obj);
                }
            }

            // store the current value
            _lastActiveSelfState[provider] = currentActive;
        }
    }
}

This is your watcher class you currently already have anyway.

Then on all the objects you want to be able to watch you use

public class ActiveSelfProvider : MonoBehaviour
{
    private static readonly HashSet<ActiveSelfProvider> instances = new HashSet<ActiveSelfProvider>();
    public static HashSet<ActiveSelfProvider> Instances => new HashSet<ActiveSelfProvider>(instances);

    private void Awake()
    {
        // register your self to the existing instances
        instances.Add(this);
    }

    private void OnDestroy()
    {
        // remove yourself from the existing instances
        instances.Remove(this);
    }
}

If this is "efficient enough" for you use case you would have to test ;)


If you want to go super fancy, someone once made a Transform Interceptor .. a quite nasty hack which on compile time overrules parts of the Unity built-in Transform property setters to hook in callbacks.

One probably could create something like this also for SetActive ;)


Note: Typed on smartphone but I hope the idea gets clear

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!