The concept of cloning a tile to divorce it from the asset and enable instance data isn't that hard to understand. But say that you want to edit the data: you use your trusty selection inspector to click on one of your new-fangled tiles and .... no good!
It turns out that the Selection Inspector in the default brush will only display the fields in a standard Unity tile. Unlike other inspectors which are fairly general purpose, this one is specific to the Tile class and hard-wired to only display those fields.
Similarly, the inspector seen when using the palette needs updating.
So a custom brush needed to be created with new inspectors.
One thing I really dislike about Unity inspectors for normal objects (as opposed to one you might create for a specific monobehaviour) is that there's no real way of ordering the information unless you use something like Odin Inspector (which is a terrific product).
So I had to roll my own. Without getting too deep into it, you merely decorate your fields and/or properties with specific attributes and a complex chunk of reflection code orders these items in the same class hierarchy as your code. Here, a pic is worth a thousand... well, you know what I mean.
Here's a small block of tile code with attributes:
/// <summary>
/// Play animation on Startup
/// </summary>
[Tooltip("Check this to have the selected animation begin at Startup")]
[TptShowField(0,0,SpaceMode.None,ShowMode.NotInPlay)]
public bool m_PlayOnStart = true;
/// <summary>
/// Default sprite when selected animation sequence is invalid.
/// </summary>
[Tooltip("The default sprite when clip is null or of length 0")]
[TptShowObjectField(typeof(Sprite),false,false,SpaceMode.None,ShowMode.NotInPlay)] //false means no scene objects
public Sprite m_DefaultSprite;
/// <summary>
/// The asset with the animation clips
/// </summary>
[TptShowObjectField(typeof(TpSpriteAnimationClipSet),false,true,SpaceMode.None,ShowMode.NotInPlay,"",true)]
[Tooltip("A SpriteAnimationClipSet asset.")]
public TpSpriteAnimationClipSet m_ClipSet;
/// <summary>
/// Override clip animation speed if true
/// </summary>
[Tooltip("Check to override the animation speed in clip.")]
[TptShowField()]
public bool m_UseAnimationSpeedOverride;
There are attributes for normal fields like bool, int, float, string, and the various Vector/VectorInt types as well as special ones for object fields (because scene references are possible now), enums, custom GUI for specific tile types, and showing invoke buttons for methods, and more.