This commit is contained in:
2025-06-16 15:14:23 +02:00
commit 074e590073
3174 changed files with 428263 additions and 0 deletions

View File

@ -0,0 +1,86 @@
using System;
using UnityEngine;
namespace Mirror.Examples.Hex2D
{
[AddComponentMenu("")]
[RequireComponent(typeof(HexSpatialHash2DInterestManagement))]
public class Hex2DNetworkManager : NetworkManager
{
// Overrides the base singleton so we dont have to cast to this type everywhere.
public static new Hex2DNetworkManager singleton => (Hex2DNetworkManager)NetworkManager.singleton;
[Header("Spawns")]
public GameObject spawnPrefab;
[Range(1, 3000), Tooltip("Number of prefabs to spawn in a flat 2D grid across the scene.")]
public ushort spawnPrefabsCount = 1000;
[Range(1, 10), Tooltip("Spacing between grid points in meters.")]
public byte spawnPrefabSpacing = 3;
[Header("Diagnostics")]
[ReadOnly, SerializeField] HexSpatialHash2DInterestManagement hexSpatialHash2DInterestManagement;
public override void OnValidate()
{
if (Application.isPlaying) return;
base.OnValidate();
if (hexSpatialHash2DInterestManagement == null)
hexSpatialHash2DInterestManagement = GetComponent<HexSpatialHash2DInterestManagement>();
}
public override void OnStartClient()
{
NetworkClient.RegisterPrefab(spawnPrefab);
}
public override void OnStartServer()
{
// Instantiate an empty GameObject to parent spawns
GameObject spawns = new GameObject("Spawns");
Transform spawnsTransform = spawns.transform;
int spawned = 0;
// Spawn prefabs in a 2D grid centered around origin (0,0,0)
int gridSize = (int)Mathf.Sqrt(spawnPrefabsCount); // Square grid size based on count
// Calculate the starting position to center the grid at (0,0,0)
float halfGrid = (gridSize - 1) * spawnPrefabSpacing * 0.5f;
float startX = -halfGrid;
float startZorY = -halfGrid; // Z for XZ, Y for XY
//Debug.Log($"Start Positions: X={startX}, Z/Y={startZorY}, gridSize={gridSize}");
// Use a 2D loop for a flat grid
for (int x = 0; x < gridSize && spawned < spawnPrefabsCount; ++x)
{
for (int zOrY = 0; zOrY < gridSize && spawned < spawnPrefabsCount; ++zOrY)
{
Vector3 position = Vector3.zero;
if (hexSpatialHash2DInterestManagement.checkMethod == HexSpatialHash2DInterestManagement.CheckMethod.XZ_FOR_3D)
{
float xPos = startX + x * spawnPrefabSpacing;
float zPos = startZorY + zOrY * spawnPrefabSpacing;
position = new Vector3(xPos, 0.5f, zPos);
}
else // XY_FOR_2D
{
float xPos = startX + x * spawnPrefabSpacing;
float yPos = startZorY + zOrY * spawnPrefabSpacing;
position = new Vector3(xPos, yPos, -0.5f);
}
GameObject instance = Instantiate(spawnPrefab, position, Quaternion.identity, spawnsTransform);
NetworkServer.Spawn(instance);
++spawned;
}
}
//Debug.Log($"Spawned {spawned} objects in a {gridSize}x{gridSize} 2D grid.");
}
}
}