99 lines
2.6 KiB
C#
99 lines
2.6 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
#if FUSION2
|
|
using Fusion;
|
|
#endif
|
|
|
|
namespace BulletHellTemplate
|
|
{
|
|
public class BoxSpawner : MonoBehaviour
|
|
{
|
|
[Header("Spawner Settings")]
|
|
public int maxBoxes = 5;
|
|
public float spawnCooldown = 5f;
|
|
public GameObject boxPrefab;
|
|
public float spawnRadius = 10f;
|
|
public LayerMask blockMask = 0;
|
|
|
|
[Header("Network")]
|
|
public bool useNetworkIfAvailable = true;
|
|
|
|
private readonly List<GameObject> currentBoxes = new();
|
|
private float cooldownTimer;
|
|
|
|
#if FUSION2
|
|
private NetworkRunner Runner =>
|
|
GameplaySync.Instance ? GameplaySync.Instance.Runner : null;
|
|
|
|
private bool NetActive =>
|
|
useNetworkIfAvailable &&
|
|
GameplaySync.Instance && GameplaySync.Instance.RunnerActive;
|
|
|
|
private bool IAmHost =>
|
|
NetActive && GameplaySync.Instance.IsHost;
|
|
#endif
|
|
|
|
void OnEnable() => cooldownTimer = spawnCooldown;
|
|
|
|
void Update()
|
|
{
|
|
if (GameplayManager.Singleton.IsPaused()) return;
|
|
|
|
#if FUSION2
|
|
if (NetActive && !IAmHost) return;
|
|
#endif
|
|
|
|
cooldownTimer -= Time.deltaTime;
|
|
currentBoxes.RemoveAll(go => !go);
|
|
|
|
if (cooldownTimer > 0f) return;
|
|
if (currentBoxes.Count >= maxBoxes)
|
|
{
|
|
cooldownTimer = spawnCooldown;
|
|
return;
|
|
}
|
|
|
|
if (TryGetSpawnPoint(out var pos))
|
|
{
|
|
#if FUSION2
|
|
if (NetActive)
|
|
{
|
|
var nob = Runner.Spawn(boxPrefab, pos, Quaternion.identity);
|
|
currentBoxes.Add(nob.gameObject);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
var go = Instantiate(boxPrefab, pos, Quaternion.identity);
|
|
currentBoxes.Add(go);
|
|
}
|
|
}
|
|
|
|
cooldownTimer = spawnCooldown;
|
|
}
|
|
|
|
private bool TryGetSpawnPoint(out Vector3 spawnPoint)
|
|
{
|
|
for (int attempts = 0; attempts < 10; attempts++)
|
|
{
|
|
var p = transform.position + Random.insideUnitSphere * spawnRadius;
|
|
p.y = transform.position.y;
|
|
|
|
if (!Physics.CheckSphere(p, 0.3f, blockMask))
|
|
{
|
|
spawnPoint = p;
|
|
return true;
|
|
}
|
|
}
|
|
spawnPoint = Vector3.zero;
|
|
return false;
|
|
}
|
|
|
|
private void OnDrawGizmosSelected()
|
|
{
|
|
Gizmos.color = Color.blue;
|
|
Gizmos.DrawWireSphere(transform.position, spawnRadius);
|
|
}
|
|
}
|
|
}
|