Search Unity

Full Inspector: Inspector and serialization for structs, dicts, generics, interfaces

Discussion in 'Assets and Asset Store' started by sient, Jan 23, 2014.

  1. makeshiftwings

    makeshiftwings

    Joined:
    May 28, 2011
    Posts:
    3,350
    I'm still wondering about this. Is there some kind of magical [ListOfPropertyAttributeTypes(typeof(Proptype)] attribute or anything like that? Or should I write a custom editor?
     
  2. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Can you post a code sample? I'm also not sure what you mean by the EnumBuilder class.

    This sounds like it is feasible, but it is a bit painful at the moment and not very extendable (basically write a custom property editor, or tie this closely into the reflected property editor). I'm planning on rewriting the attribute drawer system so that it is significantly more powerful/flexible - the new APIs should in theory be able to handle a case like this pretty easily (but I haven't started work on it yet!)
     
  3. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Oops! Sorry about that :*(

    No such attribute exists right now, sorry :(. The best that would be doable is something like this:

    [InspectorCollectionItemAttributeProvider(
    new InspectorDisabledAttribute(false),
    /* ... */)]

    However, I have not investigated implementing such a feature yet, and it may simply not be easily doable. I have an issue here that you can use to track progress.

    If this does get implemented, it will likely be in 2.7. I'm currently in the process of preparing 2.6.1 - the last major issue is making it work really well on Unity 4 (the serialization pipeline has been modified to support multithreaded deserialization in Unity 5 (just Full Serializer for now, possibly Json.NET in the future)).

    The current solution is to wrap your List<int> so it is actually List<WrappedInt> where you have something like

    Code (csharp):
    1. struct WrappedInt {
    2.     public int Value;
    3. }
    Then you can modify either the WrappedInt editor or the Value editor. Not ideal for the moment, sorry :(.
     
  4. Hugbot

    Hugbot

    Joined:
    Jul 10, 2013
    Posts:
    10
    Hi there,

    I love your asset Full Inspector. However I am having some issues with it.

    I just recently upgraded to Unity 5.0.0f4 and upon doing so decided to upgrade to the newest version of FullInspect (2.6) as well. Upon doing so I'm met with repeated errors stating this:

    I'm not doing anything different, I'm importing the library with:
    Is there something I'm not taking into account?
     
  5. stevethorne

    stevethorne

    Joined:
    Apr 8, 2013
    Posts:
    16
    Hey sient,

    After upgrading to the latest version of FI, the tool I made that relies on FI is now throwing errors whenever something new is added to it ( aka whenever it needs to serialize ). I keep getting this error:

    Code (CSharp):
    1. ArgumentNullException: Argument cannot be null.
    2. Parameter name: collection
    3. System.Collections.Generic.List`1[System.String].CheckCollection (IEnumerable`1 collection) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:435)
    4. System.Collections.Generic.List`1[System.String]..ctor (IEnumerable`1 collection) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:58)
    5. FullInspector.Internal.fiEditorSerializationManager+SerializedObjectSnapshot..ctor (ISerializedObject obj) (at Assets/FullInspector2/Core/fiEditorSerializationManager.cs:112)
    6. FullInspector.Internal.fiEditorSerializationManager.DoSerialize (ISerializedObject obj) (at Assets/FullInspector2/Core/fiEditorSerializationManager.cs:61)
    7. FullInspector.Internal.fiEditorSerializationManager.SubmitSerializeRequest (ISerializedObject obj) (at Assets/FullInspector2/Core/fiEditorSerializationManager.cs:193)
    8. FullInspector.BaseBehavior`1[TSerializer].UnityEngine.ISerializationCallbackReceiver.OnBeforeSerialize () (at Assets/FullInspector2/Core/BaseBehavior.cs:139)
    9.  
    This is a tool that is displayed using EditorWindow so I may have been calling to serialize that object improperly before and it was only working by luck. This is what I'm calling whenever I need to serialize:

    Code (CSharp):
    1. EditorUtility.SetDirty( m_Object );
    2. fiEditorSerializationManager.SetDirty( m_Object );
     
  6. makeshiftwings

    makeshiftwings

    Joined:
    May 28, 2011
    Posts:
    3,350
    Ah ok, no problem. Yeah I thought about wrapping the int but that's not doable in my case. I'll see if I can figure out something with InspectorCollectionItemAttributeProvider. Thanks!
     
  7. Deleted User

    Deleted User

    Guest

    Does FI support polymorphism for custom classes?
     
  8. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Please see this section of the guide. Let me know if there is anything else I can do to help.
     
  9. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Hmm, strange. I've rewritten the editor serialization pipeline in 2.6.1 to work a bit better, but it isn't currently available in Unity 4. I should have that done (hopefully) in a couple of hours. I can PM you a build when it's done or I can send you the Unity 5 version now if you'd like.
     
  10. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Please note that InspectorCollectionItemAttributeProvider does not actually exist right now :(
     
  11. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    I'm 99% confident the answer is yes, but I can tell you for sure if you send a code snippet.

    Code (csharp):
    1. interface IFace {}
    2. class Hello : IFace {}
    3. class Two : IFace {}
    If the code is somewhere along those lines, then I think you'll really like how FI works. You can also try out the demo to see it in action yourself.
     
  12. makeshiftwings

    makeshiftwings

    Joined:
    May 28, 2011
    Posts:
    3,350
    Oh, lol, I misread. Well, no worries, I'll try and figure something out.
     
  13. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Here is an example:
    Code (csharp):
    1. private List<string> list = new List<string>();
    2. list.Add("Option 1");
    3. list.Add("Option 2");
    4.  
    5. public string selectedListItem = "Option 1";
    The list is created dynamically. FI should show me selectedListItem in the Inspector as a dropdown with values from list.

    Think of list as an Enum which is dynamically generated. Generated Enums are possible in C# (see the mentioned EnumBuilder-class).
     
  14. stevethorne

    stevethorne

    Joined:
    Apr 8, 2013
    Posts:
    16
    I'm still working in Unity 4, so a build for that would be great!
     
  15. Deleted User

    Deleted User

    Guest

    For example:
    Code (CSharp):
    1. [Serializable]
    2. public class A{
    3. public float x;
    4. }
    5. [Serializable]
    6. public class B: A {
    7. }
    Will B serialize x?
     
  16. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Great news! Turned out this was a pretty easy feature to add so I've gone ahead and added it for 2.6.1.

    Usage is a bit wonky because annotations in C# are not very expressive.

    We can use this code

    Code (csharp):
    1. public class OOOO : BaseBehavior {
    2.     class ObjectsItemAttrs : fiICollectionAttributeProvider {
    3.         public IEnumerable<object> GetAttributes() {
    4.             yield return new InspectorCommentAttribute("Hi!");
    5.         }
    6.     }
    7.     [InspectorCollectionItemAttributes(typeof(ObjectsItemAttrs))]
    8.     public List<object> Objects;
    9. }
    to make this inspector

    upload_2015-4-3_22-58-6.png

    I've gone ahead and PM'ed you a build with this feature.
     
    psxcode likes this.
  17. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    This is going to be a bit difficult to do with only attributes. I'm planning on rewriting the attribute system in 2.7 to make this much easier. This is also something you could do by writing a property editor for the type (which is much easier using the toolkit), but it wouldn't be a general solution that you could apply universally across multiple behaviors.

    The EnumBuilder looks interesting. Too bad AOT platforms forbid codegen :(
     
    rakkarage likes this.
  18. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    PM'ed :)
     
  19. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Yep, that'll be handled without any issue with FullSerializer, Json.NET, and BinaryFormatter. You'd need to add some annotations for protobuf-net.

    You can also drop the [Serializable] annotations.

    Let me know if you have any other questions.
     
  20. mcmorry

    mcmorry

    Joined:
    Dec 2, 2012
    Posts:
    580
    hi, could you please add more details about this? I can't understand for what is this.
    What is the use case?
    Thanks
     
  21. makeshiftwings

    makeshiftwings

    Joined:
    May 28, 2011
    Posts:
    3,350
    The new InspectorCollectionItemAttributes is very cool; I'm testing it out now and it works like a charm.

    In my case I'm using it because I have some custom attributes that I use like this:
    Code (csharp):
    1. public class WeaponData
    2. {
    3.     [ItemId] public int itemId;
    4.     [EffectId] public int impactEffectId;
    5.     [StringTableName] public string nameGeneration;
    6. }
    where each of those attributes has an editor to draw something like a dropdown menu of usable id's etc. But I had some classes like this:
    Code (csharp):
    1. public class StorageChest
    2. {
    3.     public List<int> itemIds;
    4. }
    where I wanted to be able to use the [ItemId] attribute for each item in the list so that I would get a list of the custom inspectors. Previously it wasn't possible, and now it is!
    Code (csharp):
    1. public class StorageChest
    2. {
    3.     [InspectorCollectionItemAttributes(typeof(ItemIdAttributeProvider))]
    4.     public List<int> itemIds;
    5. }
     
  22. mcmorry

    mcmorry

    Joined:
    Dec 2, 2012
    Posts:
    580
    Thank you very much. It's very interesting indeed.
    I always used Enums instead of custom editor to choose a value from a list, but of course is not applicable to all cases.
     
  23. mcmorry

    mcmorry

    Joined:
    Dec 2, 2012
    Posts:
    580
    What level of stripping is supported using Full Inspector, specifically for Android and iOS?
     
  24. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    I believe byte code, but it has been quite awhile since I tested. The serialization/player/runtime path only throws exceptions if there is a serialization exception (ie, you changed the type of a field from a string to a bool), so you might also be able to get away with turning exception handling off as well.
     
  25. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Thanks, the property editor toolkit looks promising! I tried to add some controls to the default ones like this:

    Code (csharp):
    1. tkControlEditor tkCustomEditor.GetEditor()
    2. {
    3.   return new tkControlEditor(
    4.     new tk.VerticalGroup
    5.     {
    6.       new tk.DefaultInspector(),
    7.       new tk.Label("FOO")
    8.     }
    9.   );
    10. }
    But then I get some NullReferenceExceptions in PropertyEditorChain.SkipUntilNot ...

    EDIT:

    Ok as a workaround I figured out that I can use tk.PropertyEditor("Name of Property") to recreate all properties. But now I would like to use a tk.Popup. In general it works (I can populate it with values, select an entry and the correct callback is called with the selected entry) but it does not update the current selected index in the inspector. Can you give an example?
     
    Last edited: Apr 7, 2015
  26. Remiel

    Remiel

    Joined:
    Oct 17, 2012
    Posts:
    105
    I am having trouble with drop down menus. Often randomly they stop working, and no matter how much I try to select something, nothing happens. I have to select some other object, and go back to the old one, forcing inspector to refresh, and then HOPE it works this time. When I say nothing happens, I mean nothing happens as if I weren't trying to select something at all (doing it with keyboard instead of mouse also doesn't work) - selection doesn't change. And by checking the actual data on the object, the value of the field represented by the dropdown didn't change no matter so it isn't an issue of dropdowns not reflecting the actual state of the underlying field.
    And sometimes when I select something in the dropdown, some other unrelated dropdown is affected instead the one that should have been affected. (When I say unrelated, then I mean not even of the same item type.)

    This applies for all types of drop down menus - abstract type selectors, enum drop downs,...
    I wrote a custom PropertyEditor for a custom type that uses EditorGUI.Popup to draw a dropdown. It too suffers from the same ailment.

    Also I am having issues with editing list items - sometimes when I edit one item, instead of that item being changed, some other item further up in the list is edited instead.

    Do you have any idea why this might be happening or how to fix it?
    I am not having any issues with serialization and deserialization, that works fine. just the inspector side is driving me crazy.

    (I am using the asset store version - 2.6)
     
  27. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Oops, sorry. tk.DefaultInspector does not currently work and it shouldn't have been released :/ What does your current code for the popup look like?
     
  28. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Sorry, this bug has been fixed in 2.6.1. I can PM you a build or you can go into FullInspector2\Modules\Collections\Rotorz\Editor\Internal\RotorzGUIHelper.cs and change VisibleRectEnabled at line 42 so it always returns false.
     
  29. zee_ola05

    zee_ola05

    Joined:
    Feb 2, 2014
    Posts:
    166
    Hi @sient !

    Can you teach me how to use JSON.Net serializer or (FullSerializer) to serialize a class?

    say, a simple class like:

    public class Foo
    {
    public string name;
    public int age;
    }
     
  30. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Sure, see this file.
     
  31. zee_ola05

    zee_ola05

    Joined:
    Feb 2, 2014
    Posts:
    166
    YES! I was just looking for this. I was sure I saw this before. Hehe.

    It worked! Does this support iOS and Android?
     
  32. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Here it is (VtkAlgorithm is the class name this belongs to):

    Code (csharp):
    1. protected GUIContent[] uarrays = {new GUIContent("a"), new GUIContent("b"), };
    2. protected VtkAlgorithm OnSelectedArrayChange(VtkAlgorithm algorithm, tkEmptyContext context, int index)
    3. {
    4.      Debug.Log("Selected array: " + uarrays[index].text);
    5.      return algorithm;
    6. }
    7.  
    8. tkControlEditor tkCustomEditor.GetEditor()
    9. {
    10.     return new tkControlEditor(
    11.         new tk.Popup(new fiGUIContent("Selected Array"), uarrays, 0, OnSelectedArrayChange)
    12.     );
    13. }
    The problem is that in the inspector the selected index never changes, although the correct index is passed to the callback.
     
  33. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Yep, it should work on every platform the serializer supports.
     
  34. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Okay, it is because you are passing 0 as the value for the selected index. Here is a simple way to fix it:

    Code (csharp):
    1.  
    2. protected int selected;
    3. protected GUIContent[] uarrays = {new GUIContent("a"), new GUIContent("b"), };
    4. protected VtkAlgorithm OnSelectedArrayChange(VtkAlgorithm algorithm, tkEmptyContext context, int index)
    5. {
    6.      Debug.Log("Selected array: " + uarrays[index].text);
    7.      selected = index;
    8.      return algorithm;
    9. }
    10.  
    11. tkControlEditor tkCustomEditor.GetEditor()
    12. {
    13.     return new tkControlEditor(
    14.         new tk.Popup(new fiGUIContent("Selected Array"), uarrays, (o, c) => o.selected, OnSelectedArrayChange)
    15.     );
    16. }
    Please note I haven't tested the code.
     
  35. Vorren

    Vorren

    Joined:
    Oct 24, 2014
    Posts:
    19
    Hey sient,
    I was having an issue with launching FI-based application on iOS in fiSettings.cs file:

    Code (CSharp):
    1. ArgumentException: get_isEditor can only be called from the main thread.
    2. Constructors and field initializers will be executed from the loading thread when loading a scene.
    3. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
    4. at FullInspector.fiSettings..cctor () [0x0007f] in /Users/fateev/git/matr/Assets/FullInspector2/Core/fiSettings.cs:145
    5. Rethrow as TypeInitializationException: An exception was thrown by the type initializer for FullInspector.fiSettings
    6. at FullInspector.InspectedType..ctor (System.Type type) [0x00136] in /Users/fateev/git/matr/Assets/FullInspector2/Core/Utility/InspectedType.cs:267
    7. at FullInspector.InspectedType.Get (System.Type type) [0x00012] in /Users/fateev/git/matr/Assets/FullInspector2/Core/Utility/InspectedType.Caching.cs:20
    8. at FullInspector.InspectedType.RemoveProperty[IntPtr] (System.String propertyName) [0x00000] in /Users/fateev/git/matr/Assets/FullInspector2/Core/Utility/InspectedType.PropertyRemoval.cs:38
    9. at FullInspector.InspectedType.InitializePropertyRemoval () [0x00000] in /Users/fateev/git/matr/Assets/FullInspector2/Core/Utility/InspectedType.PropertyRemoval.cs:18
    10. at FullInspector.InspectedType..cctor () [0x0000a] in /Users/fateev/git/matr/Assets/FullInspector2/Core/Utility/InspectedType.cs:38
    Swapping Application.isEditor with ifUtility.IsEditor fixed the problem. I suppose it's a bug.
     
  36. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    I tried this already but I noticed that tkPopup does not allow this syntax because the current selection index is a simple Value<int> but e.g. in tkSlider there are Func<..> and Action<..> to get and set the value. It should be easy to add this to tkPopup.

    EDIT:

    Ok, I've got it!

    Code (csharp):
    1.  
    2. tkControlEditor tkCustomEditor.GetEditor()
    3. {
    4.     return new tkControlEditor(
    5.         new tk.Popup(new fiGUIContent("Selected Array"), uarrays, tk.Val(o => o.selected), OnSelectedArrayChange)
    6.     );
    7. }
     
    Last edited: Apr 8, 2015
  37. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Next question: How can extend a custom editor in subclass of my custom-editor class? How to implement GetEditor() in the subclass? E.g.:

    Code (csharp):
    1. using FullInspector;
    2. using UnityEngine;
    3. using tk = FullInspector.tk<Minimal>;
    4. public class Minimal : MonoBehaviour, tkCustomEditor {
    5.     tkControlEditor tkCustomEditor.GetEditor() {
    6.         return new tkControlEditor(
    7.              new tk.Label("Hello World from the toolkit!"));
    8.      }
    9. }
    10.  
    11. public class Subclass : Minimal, tkCustomEditor {
    12.     ...
    13.     // (Additional inspector code here)
    14. }
     
  38. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Your best bet would be something like:

    Code (csharp):
    1. class Base : tkCustomEditor {
    2.     public virtual tkControlEditor GetEditor() { /* ... */ }
    3. }
    4.  
    5. class Derived : Base {
    6.     public override tkControlEditor GetEditor() {
    7.         var parentEditor = base.GetEditor();
    8.         // incorporate parentEditor.Control into the child editor
    9.     }
    10. }
     
    Last edited: Apr 9, 2015
  39. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Yep, I wish the Unity method calls worked off the main thread :(. Thanks for the report, this should be fixed in 2.6.1.
     
  40. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Thanks but now I am stuck on incorporating parentEditor.Control correctly. I guess I have to add the parent control to a new e.g vertical group like this:

    Code (csharp):
    1. using tk = FullInspector.tk<Derived>;
    2. ...
    3. // In GetEditor():
    4. var parentEditor = base.GetEditor();
    5. return new tkControlEditor(
    6.     new tk.VerticalGroup {
    7.         (tkControl<Base, tkEmptyContext>)parentEditor.Control,
    8.         new tk.Label("Hello World from Derived")
    9.     });
    The problem here is that the parent control type (Base) is not compatible with the Derived control type. Is there some workaround?
     
  41. SimonW

    SimonW

    Joined:
    Feb 20, 2012
    Posts:
    13
    I've tried importing FullInspector into my project, and it's having some sort of dll issue. I'm using Unity 4.6.2f1, and targeting WebPlayer.

    Here's the editor log:

     
  42. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    The built-in Json.NET library does not support WebPlayer. Please use Json.NET from the asset store instead (or just switch to Full Serializer).
     
  43. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Ouch. I just wrote the following class which should hopefully make it technically possible:

    Code (csharp):
    1. using UnityEngine;
    2.  
    3. namespace FullInspector {
    4.     public class tkTypeProxy<TFrom, TContextFrom, TTo, TContextTo> : tkControl<TTo, TContextTo> {
    5.         private tkControl<TFrom, TContextFrom> _control;
    6.  
    7.         public tkTypeProxy(tkControl<TFrom, TContextFrom> control) {
    8.             _control = control;
    9.         }
    10.  
    11.         private static T Cast<T>(object val) {
    12.             return (T)val;
    13.         }
    14.  
    15.         public override bool ShouldShow(TTo obj, TContextTo context, fiGraphMetadata metadata) {
    16.             return _control.ShouldShow(Cast<TFrom>(obj), Cast<TContextFrom>(context), metadata);
    17.         }
    18.  
    19.         protected override TTo DoEdit(Rect rect, TTo obj, TContextTo context, fiGraphMetadata metadata) {
    20.             return Cast<TTo>(_control.Edit(rect, Cast<TFrom>(obj), Cast<TContextFrom>(context), metadata));
    21.         }
    22.  
    23.         protected override float DoGetHeight(TTo obj, TContextTo context, fiGraphMetadata metadata) {
    24.             return _control.GetHeight(Cast<TFrom>(obj), Cast<TContextFrom>(context), metadata);
    25.         }
    26.     }
    27. }
    To use it, replace

    Code (csharp):
    1. (tkControl<Base, tkEmptyContext>)parentEditor.Control,
    with

    Code (csharp):
    1. new tkTypeProxy<Base, tkEmptyContext, Derived, tkEmptyContext>((tkControl<Base, tkEmptyContext>)parentEditor.Control),
    Please note that I didn't have a chance to test the actual usage out, but it should work.
     
  44. Deleted User

    Deleted User

    Guest

    How do I save statics? I have a class with static fields that has nothing to do with Unity or FullInspector. I can inspect it just fine with the Static editor but when I quit the editor the saves are lost.
     
    Last edited by a moderator: Apr 13, 2015
  45. Alec-Slayden

    Alec-Slayden

    Joined:
    Dec 16, 2008
    Posts:
    101
    I'm adding my emailed feature request here per your suggestion:
    Currently multiple objects can't be dropped into a collection field, which slows down workflow when a lot of objects need to be added at once. I look forward to this option in the future, thanks!
     
  46. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    You can inspect statics but serialization is not supported - there just isn't a practical way to do it (ie, where does the data get stored, who owns it, when does it get deserialized, etc).
     
  47. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Sure, but I meant here, ha.
     
  48. bilke

    bilke

    Joined:
    Jul 13, 2012
    Posts:
    54
    Thanks this works perfectly!
     
  49. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Great! That's good to hear :)
     
  50. sient

    sient

    Joined:
    Aug 9, 2013
    Posts:
    602
    Hey everyone,

    I've submitted 2.6.1 to the asset store. It contains some new features and polish but also fixes many bugs. One little thing that I rewrote is control alignment - they will all now nicely align vertically. This update also contained quite a few Full Serializer updates.

    Despite being just a minor version bump, I would recommend backing up before updating to this release. I completely rewrote the in-editor serialization pipeline and enabled concurrent serialization (just for Full Serializer for now - though Json.NET can probably support it as well). This rewrite should also remove any need to worry about calling SetDirty/SaveState - everything should serialize properly.

    Hopefully you will also notice better performance when loading scenes, as the concurrent deserialization pipeline will greatly help there. I also made a few nice optimizations for deserialization when running in the player (unfortunately they make assumptions which are not valid when in the editor).

    As always, if you want the build now just send me a PM or email.

    Here's the changelog:

    Code (csharp):
    1. For v2.6.1 (4/13/2015)
    2.  
    3. - Added [InspectorCollapsedFoldout] to collapse a field or property by default in the inspector.
    4. - Added [InspectorCollectionItemAttributes] and [InspectorCollectionAddItemAttributes] which allow you to specify which attributes to use when rendering collection items.
    5. - Added fiSettings.PrettyPrintSerializedJson to serialize pretty JSON, which may assist teams when merging assets that contain FI serialized data.
    6. - You can now change the default comment type for [InspectorComment] via fiSettings.DefaultCommentType.
    7. - Added fiSettings.ForceDisplayInlineObjectEditor which will force the inline object editor to always appear.
    8. - Editor serialization logic has been completely rewritten. It should now just work in every scenario.
    9.  
    10. Changes:
    11. - Full Inspector windows will now be centered on the screen.
    12. - The JSON editor is now disabled by default (as it makes the default TextAsset editor unusable).
    13. - Labels are now aligned in the inspector.
    14. - Optimized initialization time in deployed players.
    15. - [InspectorShowIf] now works on methods.
    16. - Many Full Serializer updates.
    17.  
    18. Fixes:
    19. - Fixed rendering glitch with attribute editors and foldouts being rendered at the same time.
    20. - Fixed scriptable object manager when there are no derived ScriptableObject types.
    21. - Fixed [fiInspectorOnly] and tkCustomEditor for ScriptableObjects.
    22. - Fixed [ShowInInspector] not working when [NotSerialized] was also present.
    23. - The JSON inspector will only activate when the JSON is successfully parsed.
    24. - Fixes for Unity 4.3 build
    25. - Fixed issue on Windows editor where large editors that scrolled with lists would act strangely
    26. - Various other fixes
     
    Last edited: Apr 14, 2015
    rakkarage likes this.