Files
2025-06-16 15:14:23 +02:00

87 lines
3.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.");
}
}
}