Search Unity

UltEvents - The Ultimate Event System For The Ultimate Price - FREE

Discussion in 'Assets and Asset Store' started by Kybernetik, Jun 1, 2019.

  1. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    title.png
    [itch.io] [Asset Store] [Documentation] [Forum] [mail@kybernetik.com.au]

    UltEvents allows you to easily setup and configure persistent event callbacks via the Inspector. It serves the same purpose as the inbuilt UnityEvents, but has superior features with fewer restrictions and an improved Inspector interface which requires fewer clicks to perform individual tasks.

    Download it for FREE from itch.io (recommended) or the Unity Asset Store and check out the Documentation to get started.

    trigger-event.png

    UltEvents have superior features with fewer restrictions than UnityEvents:
    • Supports more parameter types: Enum (regular and flags), Vector (2, 3, 4), Quaternion, Rect, Color, Color32.
    • Call methods with multiple parameters (UnityEvents can only do 0 or 1).
    • Call methods with non-void return types and use the returned value as a parameter in subsequent calls.
    • Call non-public and static methods.
    • Full source code is included and well documented so it is easy to modify if necessary.
    UltEvents have an improved Inspector:
    • Collapse the event into a single line to occupy less screen space.
    • Parameter-less functions only take a single line.
    • Function parameter names are displayed. You can see the full method signature instead of only the name.
    • Select a listener on a specific Component when there is more than one of the same type on the target object.
    • Drag listeners around to reorder them.
    • Keyboard shortcuts and context menu functions allow you to easily Copy, Paste, Add, Delete, and even Invoke events.
    • Better organised method selection menus which can be customised to suit your needs.
    • Button to quickly find a similarly named method if the target is missing.
    • Dynamic listeners are displayed in the footer (ones added by code).
    Individual tasks also tend to require fewer clicks with UltEvents:
    • Instead of needing to add a new listener then drag in a target, you can just drag the target onto the event header.
    • Instead of needing to select a listener then press the remove button in the footer, each listener has its own remove button.
    • If you assign a specific Component as the target, it will immediately open the method selection menu which will let you select methods directly from that component instead of going through a sub-menu every time.
    See the documentation for the full feature comparison.

    If you like this asset, please consider supporting me by donating on itch.io or buying some of my other assets which are listed in my signature.
     
    Last edited: Mar 6, 2020
  2. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    UltEvents v2.0 is now up on the Asset Store:
    • Moved everything out of the precompiled DLL to make it easier to access and modify the source code.
    Warning: when upgrading from an earlier version you must delete the old version before importing the new one. This will also cause all of the Premade Event Scripts in your project to go missing so you will need to set them all up again. This is an unfortunate side effect of the way Unity handles references to scripts inside a DLL compared to regular script files.
    • Replaced PDF user manual with a website hosted at https://kybernetikgames.github.io/ultevents.
    • Added support for constructors.
    • Added interfaces corresponding to all UltEvent types so that the ability to add and remove listeners can be exposed without exposing the ability to invoke, clear, or access other members of the event.
    • Fixed cached PersistentArgument values to be cleared properly when the user modifies the argument in the Inspector.
    • Removed the Parameter Constructors sub-menu because it isn't particularly useful now that actual constructors are supported.
     
  3. skytow2003

    skytow2003

    Joined:
    Feb 9, 2014
    Posts:
    30
    hi Kibernetik,
    your plugin is fantastic, it made my workflow much faster. I have used it "chaining" responses
    I wanted to know if there is a way to pause execution of event responses.
     
  4. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    I'm glad you like it.

    There isn't currently any way to pause execution. What exactly did you have in mind?
     
  5. skytow2003

    skytow2003

    Joined:
    Feb 9, 2014
    Posts:
    30
    Sorry, My question got cut off.
    I had added a brief example.
    With a Trigger 3d event from your build-in events I would chain a SetActive(false) response to deactivate a game object and then I would like to pause for x amount of time and then SetActive(true) to activate a second object.
    Instead of calling a specific method in a script that does this I wanted to know if it was possible to create a pause in the execution of the responses to the event.
    thanks in advance for your answer and again for the great plugin.
    Pietro
     
  6. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Yeah, that isn't currently possible. It's on my list of ideas I might try to add if I do any significant work on the plugin in the future, but that's not likely to happen any time soon.
     
  7. skytow2003

    skytow2003

    Joined:
    Feb 9, 2014
    Posts:
    30
    Ok, thanks anyways. Your plugin is already great as it is.
     
  8. James-Sullivan

    James-Sullivan

    Joined:
    Jun 15, 2015
    Posts:
    128
    @Kybernetik Hey, love your plugin, it has saved me a lot of suffering. Is there anyway to get Unity's button's to use UltEvents instead of UnityEvents? I poked around the docs but couldn't find anything on it.
     
  9. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Unfortunately that's not possible, but you could eiter:
     
    James-Sullivan likes this.
  10. unity_7PljJ4sqTncHsQ

    unity_7PljJ4sqTncHsQ

    Joined:
    Aug 7, 2019
    Posts:
    2
    I was wondering if you would support fields considering properties are supported as well. (Similar to UnityEvents)
    Also, do you have any plans of supporting multi-scene invocations?
     
  11. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    UnityEvents don't support fields though. Supporting properties is easy because they are literally just methods in disguise, but adding support for fields would have a performance cost for everyone even if they don't use that feature so I decided against it.

    No plans, but I'm open to suggestions if it can be done without forcing a significant performance cost on all events. How would you envision such a feature working?
     
  12. Storm4_

    Storm4_

    Joined:
    Mar 2, 2016
    Posts:
    14
    Hi! UltEvents is so absolutely amazing I can't imagine Unity without it, but I'm wondering if you have thought about this feature.
    I want to use a return value from a previous call not as a parameter, but as a target of another call. This would allow for even less ugly scripts to be created. Or maybe I missed something and it's already possible somehow?
     
  13. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    That's something I've got on my list of ideas to consider if I ever want to turn UltEvents into a proper visual scripting tool, but at this point it's unlikely to happen since I rarely even use UltEvents for anything more than simple function calls and I'm not a fan of visual scripting.
     
  14. Storm4_

    Storm4_

    Joined:
    Mar 2, 2016
    Posts:
    14
    Okay, and huge thanks for the work, I think your assets deserve to be a native part of Unity. Keep it up!
     
    Kybernetik likes this.
  15. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    UltEvents v2.1 is now available on itch.io (should get approved on the Asset Store in a few days). Most of the changes are pretty minor bug fixes.
     
  16. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Just started playing with UltEvents and, so far, I really like what I see; nice tool.

    I have a question, that I'm sure is obvious, but....
    I have a singleton in the scene, which contains my event to change the game status with an enum argument.
    When I instantiate a prefab programmatically, I want to add to the event on the singleton to trigger a method on the prefab. I have it working except that, I don't know how to set the argument as "linked".

    Here is the relevant code in my prefab script:
    Code (CSharp):
    1. var call2 = Singleton.Instance.GameStatusChange_Event.AddPersistentCall(
    2.            (System.Action<enTEST_ENUM>)OnStatusChange);
    When the prefab is instantiated, the event is added; I can see it in the inspector; but it is unlinked so the game status parameter does not get passed to the method on the prefab. If I activate the link button, then it all works as desired.

    Thanks for any help.
    -- Paul
     
  17. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    If you are doing that at runtime, you don't need to use persistent calls or linked parameters at all. A dynamic listener could do it much easier:
    Code (CSharp):
    1. Singleton.Instance.GameStatusChange_Event.DynamicCalls += () =>
    2. {
    3.     OnStatusChange(Singleton.Instance.GameStatusOrWhatever);
    4. };
    Doing it in Edit Mode is not currently supported. You could need to add a method to the PersistentArgument class to set its type to PersistentArgumentType.Parameter as well as the other field values explained in the comment above that enum value. I vaguely remember there being an issue that prevented me from implementing such a method, but I can't remember what it was.
     
  18. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Kyb,

    Thanks for the help. I got it working, but it took me awhile due to my ignorance with all but the simplest of lambda coding.

    Interesting side note: I could hook up an UltEvent to a prefab in the editor without the prefab even being in the scene.
    Further, the event method on the prefab gets triggered even without the prefab being instantiated!
    This works within Unity and in a built EXE.
    I don't know what use I would put this to, and it certainly is not sanctioned by the gods of Unity, but it is interesting.

    For posterity (note: The "dummy_argument" text can be anything you want. It is not a defined variable.)
    Code (CSharp):
    1.         My_Singleton.Instance.My_GameStatusChange_Event.DynamicCalls += (dummy_argument) => {
    2.             OnStatusChangeFromSingleton(dummy_argument);
    3.         };
    4.  
     
  19. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Assets are still objects that can have their methods called, fields accessed, etc. even if they aren't in the scene.

    A Material or ScriptableObject is an asset that will never exist in the scene, but you can still reference and use all their members, get their name, set colors, etc.

    A prefab is no different, it's just an asset and will never exist in the scene (only instantiated copies will) so it won't get Updates or collision messages or anything, but that doesn't stop it from being accessed.
     
  20. FabioZocklabs

    FabioZocklabs

    Joined:
    Jul 11, 2019
    Posts:
    17
    UltEvents is a great library, but there's one feature, that might be very useful, which seems not to exist.
    When you call a method, which takes at least one parameter, you can either specifiy the value yourself, or you can use an appropriate linked value, which is either an event parameter or the result of another computation.

    But as the Object, a method belongs to, you can only specify the parameter yourself, not use a linked parameter. It would be nice if this is possible.

    My current usecase is this: I have an `Attackable` class, and an attack event like this `class AttackEvent: UltEvent<Attackable>`. The attackable contains an attack event, but there's another class, which changes the attack event, so it does not have access to that object.
    Now if I want to use the other class to define an event, which destroys the gameObject of the attackable, it's applied to, it's not possible.

    My current workaround is using `UltEvent<Attackable, GameObject>`
     
  21. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Another workaround would be to make a static Destroy method that takes an Attackable so you can use an event to call it or a
    GameObject GetGameObject(Attackable)
    method so you can pass its returned value into Object.Destroy or whatever else you want.

    I briefly tried to implement the ability to call methods on linked parameters rather than only targeting specific Objects, but I wasn't able to come up with a reliable way to do it without notably decreasing performance for all other use cases as well so I decided against it.
     
    Storm4_ likes this.
  22. FabioZocklabs

    FabioZocklabs

    Joined:
    Jul 11, 2019
    Posts:
    17
    I also thought about these workarounds. Maybe that's a better way.
    I guess, `static GameObject GetGameObject(Monobehaviour)` should work as well.
     
  23. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    I have a prefab with a custom UltEvent defined as:
    Code (CSharp):
    1. [Serializable]
    2. public sealed class GameStatus_TestEvent : UltEvents.UltEvent<enPD_TEST_ENUM> { }
    NOTE: The prefab is an asset that is loaded at runtime.

    I also have an object that lives in the scene with a script I want to call when the prefab's custom event is triggered.
    With the prefab selected in the Project view, I drag the scene object to the "target object" in the prefab's UltEvent inspector.
    However, I never see the scene object or any of its methods in the "target method" list.

    The exact same thing happens using a standard UltEvent (no parameters).
    If I drag the prefab into the scene, the result is the same.

    Am I doing something wrong?

    Thanks, Paul
     
  24. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Prefabs cannot reference scene objects because the scene containing that object might not be loaded when the prefab is loaded. You will need to hook up the reference using scripts at runtime.
     
  25. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Doh! Of course.
    Thanks for leading another horse to water.
     
  26. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Another question, with probably an obvious answer ...
    I am storing the names of my UltEvents in a string array.
    I would like to be able to add a dynamic call to an event when I only have its name.

    Below is a method that adds a dynamic call for an event to trigger a specific method on a specific class.
    What I want is to be able to get a reference to the UltEvent when I only know its name.
    I am quite ignorant when it comes to using Reflection and it took me a solid day just to get the AddEventHandler() method working as it is (Google to the rescue, but slowly).

    I'm sure it's an obvious reflection call to get the reference, but if you can tell me, I would appreciate it.

    Thanks.
    -- Paul


    Code (CSharp):
    1. public void AddEventHandler (object argClassToReceiveEvent, string argMethodInClassToExecute) {
    2.         Type instanceType = argClassToReceiveEvent.GetType ();
    3.         System.Reflection.MethodInfo methodInfo = instanceType.GetMethod (argMethodInClassToExecute);
    4.  
    5.         Action actionTest = (Action) Delegate.CreateDelegate (typeof (Action), argClassToReceiveEvent, methodInfo);
    6.  
    7.         UltEvents.UltEvent.AddDynamicCall (ref _PDTestEvent, actionTest);
    8.     }
     
  27. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    If you put all your events in a
    Dictionary<string, UltEvent>
    using the names as the keys, then you could use
    var targetEvent = dictionary[name]
    .
     
    hopeful likes this.
  28. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Thanks. The simplest solution is typically the best one.

    -- Paul
     
  29. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Coming back around again after chasing my tail some more.
    My goal is to predefine all my event handlers up front (i.e. in the editor), however, UltEvents only allows me to define events for object that are currently in the scene.

    I have created a custom scriptableobject editor that will allow me to keep a list of events associated with methods on monobehaviors that are in the project but NOT IN THE scene. When the monobehaviors are loaded, I plan to look in the list and create dynamic event calls. This will automate adding/removing handlers.

    The list of scripts/events is stored in a list of custom classes.
    The custom class stores: script name, method name, and UltEvents.UltEvent.
    Code (CSharp):
    1. [System.Serializable]
    2. public class PD_EventCache {
    3.     public string Script;
    4.     public string Method;
    5.     public UltEvents.UltEvent Event;
    6. }
    My scriptableobject looks like this:
    Code (CSharp):
    1. public class SO_EventList : ScriptableObject {
    2.     [SerializeField]
    3.     public List<PD_EventCache> EventCacheList;
    4.  
    5.     [SerializeField]
    6.     public UltEvents.UltEvent _testEvent;
    7.  
    8.     public void AddEventToList() {
    9.         PD_EventCache entry = new PD_EventCache();
    10.  
    11.         entry.Script = "PD_Inherited_For_Events";
    12.         entry.Method = "PD_Inherited_For_Events_METHOD";
    13.         entry.Event = _testEvent;
    14.         this.EventCacheList.Add(entry);
    15.     }
    16.  
    My current issue is that, when I add the event to EventCacheList, it creates a new event.
    What I want is: the event that I put in each "PD_EventCache" item, to point to the "_testEvent" so when I do "_testEvent.Invoke()" it invokes the events on all the scripts in "EventCacheList".

    So, how do I get the event references in each "PD_EventCache" item, to really be references to "_testEvent"?

    Thanks.
    -- Paul
     
  30. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    That's an unfortunate limitation of Unity's serialization system. If a type doesn't inherit from UnityEngine.Object (such as via MonoBehaviour or ScriptableObject) then any references to it will be serialized separately and will become clones of each other when deserialized rather than referencing the same object. The new serialized reference system in 2020.1 might be able to avoid that, but I haven't tried it yet.
     
  31. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Okay, that's valuable info. Thanks.

    So, I'm back to an old question:
    Is there a way to use "AddDynamicCall(<event>, arction)" where all I know about the event is its name?

    Like:
    UltEvents.UltEvent evt = <do magic using event name>;
    AddDynamicCall(ref evt, action);
     
  32. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Generally you would do that sort of thing with a dictionary. Add all events to a dictionary using their name as the key so you can look them up by name later.
     
  33. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Ah, when you suggested that previously, I was adding events (present as properties of my manager class) to my list of custom classes and getting copies of the events. Now, I realize you meant that the dictionary would be a lookup list for the events and would contain the only event references.

    Thanks. I've got my mind right, I hope. ;)
     
  34. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    I can't get my idea to work, but I have a more general question.

    How do I use "AddDynamicCall(...)" to work with an event that passes a parameter?

    Thanks.
    -- Paul
     
  35. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Each of the generic UltEvent classes has its own AddDynamicCall method so if you want to use it with a parameter you need to use
    UltEvent<ParameterType>.AddDynamicCall(...)
    . Or if you don't need to worry about your event being null, you can just use
    yourEvent.DynamicCalls += ...
    .
     
  36. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    I have different events, some with parameters and some without.
    I am trying to store them in an array of this struct:

    Code (CSharp [Serializable):
    1.  
    2. public struct EventListItem {
    3.     public string EventName;
    4.     public UltEvents.UltEvent Event;
    5. }
    6.  
    However, an event with a parameter cannot be stored as a "UltEvents.UltEvent".
    Is there a way to store a generic UltEvent that can be cast to:
    "UltEvents.UltEvent" or
    "UltEvents.UltEvent<int>" later?

    Thanks.
    -- Paul
     
  37. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    They both inherit from UltEventBase so you can use that as long as you aren't trying to serialize that struct.
     
  38. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    Here I go chasing my tail again!

    I tried UltEventBase, but my struct was set to serialize.
    I removed the serialization attribute and now my custom editor fails because it can't see the struct.
    (sigh)

    Sorry, just had to rant. Nothing productive except stress relief before I start work.
     
  39. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    Yeah, that's another limitation of Unity's serialization system which is apparently addressed in 2020.1. It doesn't support inheritance so if you want to do it that way you need to do it all at runtime rather than using serialization.

    Or you could just have two sets of events (with the parameter and without) and keep them separate.
     
  40. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    I have an event that is defined as a custom class:
    Code (CSharp):
    1. [System.Serializable]
    2. public sealed class GameStatus_TestEvent : UltEvents.UltEvent<enTEST_ENUM> { }
    3.  
    I have a private event defined in a test class:
    Code (CSharp):
    1.     [SerializeField]
    2.     private GameStatus_TestEvent SO_GameStatusEvent;
    3.  
    When I want to add a dynamic handler, I can do this:
    SO_GameStatusEvent.DynamicCalls += (Action<enTEST_ENUM>)argumentDelegate;

    QUESTION: If I have several dynamic calls added to SO_GameStatusEvent, how do I remove a specific dynamic call at some later time?

    I saw no way to query the list of dynamic handlers that have been added.

    Thanks.
    -- Paul
     
  41. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    You can use -= to remove delegates.

    It doesn't give you direct access to everything that has been added.
     
  42. imgodot

    imgodot

    Joined:
    Nov 29, 2013
    Posts:
    212
    I am trying to get to a generic dictionary(string, <something>) of delegates (the "<something>").
    When I add a handler to an event, I want to add the delegate to the UltEvent to the dictionary.
    When it comes time to remove the handler, I want to be able to do something like:
    GameStatusEvent.DynamicCalls -= MyDictionary[argMethodName];

    However, I can't get a generic dictionary to hold different types of delegates; <Action>, <Action<MyEnum>>, etc.
    Is this event possible, or do I need a separate dictionary for each different type of UltEvent?

    Thanks.
    -- Paul
     
  43. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    You might be able to do it with System.Delegate since all delegates inherit from that, but I would probably just make separate dictionaries to avoid having to cast anything.
     
  44. AlejMC

    AlejMC

    Joined:
    Oct 15, 2013
    Posts:
    149
    Hello! I have used very briefly UltEvents and it's quite impressive. Thanks for putting this free out there, the base helper classes actually are already very useful, I use them to hack a lot (physics events callbacks, lifecycle callbacks, etc).

    So, onto my situation, going through the documentation, was looking at the 'runtime only', 'editor only', etc lack of support and while I agree (if you don't want the event, don't call it), that UnityEvent feature was useful for exploring, for example:
    • Was recently using LifeCycle events helper script to set some values on Awake a static field of a class (this, is already amazing, may not be the best programming practice, but it has it's uses).
    • Wanted to try OnEnable events, so copied them over, but don't want to lose or clear whatever was on the Awake events list
    • Prefab Chains: sometimes I set up a prefab with tons of calls to say, DOTween play forward inspector binded animations to play OnEnable cycle event. With UnityEvents I leave these events sometimes off and variants act as configurator overrides for these events, turning on those animations needed.

    Is the performance hit still something considerable? Is it even worth it?
    Anyways just wanted to pinpoint this use case out there, thanks a ton.
     
  45. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    When I want to save things for later like that I just make a copy of the GameObject and disable it. And if I might keep it for a while, set its Tag to EditorOnly so Unity will automatically remove it from builds. That way it has no runtime cost and works for anything rather than only UltEvents. And you can always use the context menu functions to copy and paste whatever you need between objects.

    The performance hit was never going to be particularly significant, but since I mainly work on mobile projects I'm always keeping an eye on performance and didn't want to spend time implementing and testing a feature that can be easily worked around.

    Another thing to consider is that there isn't really any room for it in the Inspector since UltEvents are so much more compact than UnityEvents.
     
    Dominus12 and AlejMC like this.
  46. AlejMC

    AlejMC

    Joined:
    Oct 15, 2013
    Posts:
    149
    Thanks for the prompt reply.
    Fair enough, those are good workarounds. I didn’t have idea about the tag option though, you mean on the Tag Manager asset, create a new EditorOnly tag (next to MainCamera, Player and others)? Or you mean the asset tags at the bottom (the one that filters Sound files, textures and other stuff... this one I actually never use).
     
  47. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
    The tag at the top of the Inspector. EditorOnly is one of the inbuilt tags.
     
    AlejMC likes this.
  48. franky_li

    franky_li

    Joined:
    Aug 8, 2016
    Posts:
    163
    Just tried UltEvent and have following problem. When I add an UltEvent without parameter it shows up in the inspector, but when I do something like this :
    Code (CSharp):
    1. public UltEvent<bool> myEvent;
    it's not shown in the inspector anymore.
    Unity 2019.3.13f1 Windows 10 64
     
  49. Kybernetik

    Kybernetik

    Joined:
    Jan 3, 2013
    Posts:
    2,570
  50. franky_li

    franky_li

    Joined:
    Aug 8, 2016
    Posts:
    163