
This stress test shows how to create a grid that contains 250 000 hexes in Unity.
Instantiation of the game objects is the bottleneck, so objects are instantiated 1000 at at time in a co-routine.
- Use the arrows to move around the map.
- Use the mouse to toggle hexes on or off.
[unity src=”2602″]
Code
using UnityEngine;
using System.Collections;
using System.Linq;
using Gamelogic;
using Gamelogic.Grids;
public class StressTest : GLMonoBehaviour
{
public Block cellPrefab;
public int cellsPerIteration = 1000;
public Camera cam;
public int width = 500;
public int height = 500;
public int totalCellCount;
private PointyHexGrid grid;
private IMap3D map;
public void Start()
{
StartCoroutine(BuildGrid());
}
public void OnGUI()
{
GUILayout.TextField("Hexes: " + totalCellCount);
}
public void Update()
{
if(Input.GetMouseButtonDown(0))
{
Vector3 worldPosition = ExampleUtils.ScreenToWorld(Input.mousePosition);
PointyHexPoint hexPoint = map[worldPosition];
if(grid.Contains(hexPoint))
{
if(grid[hexPoint] != null) //may be null while grid is being built
{
grid[hexPoint].gameObject.active = !grid[hexPoint].gameObject.active;
}
}
}
if(Input.GetKey(KeyCode.UpArrow))
{
cam.transform.position = cam.transform.position + Vector3.up * .1f;
}
if(Input.GetKey(KeyCode.DownArrow))
{
cam.transform.position = cam.transform.position + Vector3.down * .1f;
}
if(Input.GetKey(KeyCode.LeftArrow))
{
cam.transform.position = cam.transform.position + Vector3.left * .1f;
}
if(Input.GetKey(KeyCode.RightArrow))
{
cam.transform.position = cam.transform.position + Vector3.right * .1f;
}
}
public IEnumerator BuildGrid()
{
totalCellCount = 0;
grid = PointyHexGrid.Rectangle(width, height);
map = new PointyHexMap(new Vector2(69, 80))
.Scale(0.004f)//scale factor because of mesh size from SketchUp
.To3DXY();
int cellCount = 0;
var shuffledGrid = grid.ToList();
shuffledGrid.Shuffle();
foreach(var point in grid)
{
var cell = Instantiate(cellPrefab);
Vector3 worldPoint = map[point];
cell.transform.localPosition = worldPoint;
cellCount++;
totalCellCount++;
grid[point] = cell;
if(cellCount >= cellsPerIteration)
{
cellCount = 0;
yield return null;
}
}
}
}
