Hey @ChuanXin ! Thanks for your clear answer! Your name is displayed all over my IDE because it seems you have worked on the 2d-techdemos git repo
Congratulation for your work, i have a couple of questions and YOU are the man I need 
I’m working on a Tower Defense game, the levels are designed in Photoshop in plain illustration, so I do not use Tilemaps to render tiles. I want to use Tilemap to be be data containers for path finding or to know if I can build on this particular tile / square.
I’ve spend a lot of time to read the code of 2d extra and 2d tech demos to learn about custom tiles and custom brushes and I want to experiment more 
I made test with a basic CustomTile class like this one :
[CreateAssetMenu(fileName = "Custom Tile", menuName = "Tiles/CustomTile")]
public class CustomTile : TileBase
{
public bool Walkable;
public bool Swimmable;
public bool Buildable;
public int Height;
}
Then I made a Tile Palette with only my custom tile in it.
And I made a Custom brush to edit the properties of the Tile I wanted to place on the Tilemap with an exemple in the following script that just invert the walkable bollean just for test purpose.
public override void Paint(GridLayout grid, GameObject brushTarget, Vector3Int position)
{
// Do not allow editing palettes
if (brushTarget.layer == 31)
return;
Tilemap tilemap = brushTarget.GetComponent<Tilemap>();
if (tilemap != null)
{
SetWalkable(tilemap, position);
}
}
private static void SetWalkable(Tilemap tilemap, Vector3Int position)
{
CustomTile tile = tilemap.GetTile(position) as CustomTile;
if (tile != null)
{
tile.Walkable = !tile.Walkable;
tilemap.RefreshTile(position);
}
}
The thing is that it changes the value of the Tile asset itself so all the Tiles placed on the Tilemap are impacted… I thought it would change the “tile instance”, but it is a reference to an asset. Sounds totally logical but I was a little too optimist ^^ Maybe I’m thinking wrong about Tilemaps and they are not made to handle data that can change over time ?
Do I have to create a custom Tile for every tile combination possible and then the brush will automatically select the right tile?
Regarding the Height int value of my tiles, I was thinking using the Z value but if I do that I will not able to simply get tiles with GetTile(new Vector3(x, y, 0)) as long as tiles will be on three different Z (0, 1, and 2). Some tile can be climbed depending of the height value.
I do not know what is the smartest way to go, and I’m sure you’re the best person I can ask that question to 
I know it is a lot of questions totally out of the main topic subject but I’m so happy you answered me that I can’t miss this opportunity 
Here is a preview of the very first level, so it is quite simple to make a game tutorial.
See, Tiles are not used for their rendering capabilities.
Have a nice day and keep up the good work, you’re awesome Unity teams!