aha
This commit is contained in:
@ -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 don’t 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.");
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user