So I gave in to nostalgia and made more of the textures green-text-on-black:
I think I’ll leave the base layer like that until I can take the time to make something nice. In the game, each cell is supposed to be 10 feet by 10 feet, but the Z values in the map are in single feet instead of tens of feet. So let’s fix the position and scale of the blocks:
Vector3 position = new Vector3((-1f) * cells[v].X, (-1f) * cells[v].Y, 0.1f * cells[v].Z);
So now the cells are one foot thick and positioned appropriately to the map scale. But that makes it really difficult to see into the dungeon:
What we need is some sort of Z-filter so we can choose what is the highest layer we want to see. Let’s keep track of the Z planes in the MapManager:
public int[] zPlanes; // Array of elevations of Z planes, as copied from Map
public int currentZTopIdx; // Index into zPlanes for highest elevation currently visible
ourMap.ZPlanes.Sort();
zPlanes = ourMap.ZPlanes.ToArray();
currentZTopIdx = zPlanes.Length - 1;
Then add a method to cycle up or down through the layers, turning off the renderers on any block above the current layer.
public void CycleZ(bool up) {
currentZTopIdx += (up ? 1 : -1);
if (currentZTopIdx < 0) currentZTopIdx = 0;
if (currentZTopIdx >= zPlanes.Length) currentZTopIdx = zPlanes.Length - 1;
Renderer currBlockRend;
foreach (Vector3 v in cell_transforms.Keys) {
currBlockRend = cell_transforms[v].GetComponent<Renderer>();
if (v.z > zPlanes[currentZTopIdx]) {
currBlockRend.enabled = false;
} else {
currBlockRend.enabled = true;
}
}
}
Then over in the GUIManager let’s let the A and Z keys cycle the layer up and down, and display the current top layer:
void Update () {
if (Input.GetKeyDown (KeyCode.Z)) {
map_manager.CycleZ(false);
}
if (Input.GetKeyDown (KeyCode.A)) {
map_manager.CycleZ(true);
}
}
GUI.Box (new Rect (0,Screen.height - 50,100,50), "Z top\n" + map_manager.zPlanes[map_manager.currentZTopIdx]);
Despite the fact that we’re touching the renderer on every block, it works pretty fast:
Now we’re ready to try watching a live game world.