Untitled
unknown
plain_text
a year ago
3.0 kB
9
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.PlayerLoop;
using static UnityEditor.Progress;
public class CoinSpawner : MonoBehaviour
{
private LaneManager lm;
ObjectPooler op;
public GameObject coinPrefab;
[SerializeField] float minDistanceBetweenCoins = 0.5f;
Vector2 spawnPos = Vector2.zero;
bool canSpawnHere = false;
int randomPrefabIndex = 0;
private GameObject selectedPrefab;
[SerializeField] private float minSpawnDistance = 2f; // Minimum allowed distance between colliders
[SerializeField] LayerMask layersEnemyCannotSpawnOn;
[SerializeField] float radius = 1f;
private void Awake()
{
lm = FindObjectOfType<LaneManager>();
}
private void Start()
{
op = ObjectPooler.instance;
StartCoroutine(SpawnCoins());
}
private IEnumerator SpawnCoins()
{
while (true)
{
GetRandomSpawnPosition();
canSpawnHere = CheckForValidPosition(spawnPos);
if (canSpawnHere)
{
//Instantiate(coinPrefab, spawnPos, Quaternion.identity);
op.SpawnFromPool("Coins", spawnPos);
}
float time = Random.Range(0.1f, 0.2f);
yield return new WaitForSeconds(time);
}
}
private Vector2 GetRandomSpawnPosition()
{
int randomLaneIndex = Random.Range(0, lm.GetCurrentLaneCount());
float laneWidth = lm.GetCurrentLaneWidth(randomLaneIndex);
float middleLanePosition = lm.GetLanePosition(randomLaneIndex) + laneWidth / 2f;
spawnPos = new Vector2(middleLanePosition, Random.Range(10.25f, 50f) + minSpawnDistance);
return spawnPos;
}
bool CheckForValidPosition(Vector2 spawnPosition)
{
bool isSpawnPosValid = false;
int attemptCount = 0;
int maxAttempts = 200;
Collider2D[] colliders;
while (!isSpawnPosValid && attemptCount < maxAttempts)
{
bool isInvalidCollision = false;
colliders = Physics2D.OverlapCircleAll(spawnPos, radius);
foreach (Collider2D col in colliders)
{
if (((1 << col.gameObject.layer) & layersEnemyCannotSpawnOn) != 0)
{
// Invalid collision found
isInvalidCollision = true;
break;
}
}
if (!isInvalidCollision)
{
isSpawnPosValid = true;
}
attemptCount++;
}
// If no invalid collisions found, spawn position is valid
if (!isSpawnPosValid)
{
Debug.Log("No valid spawn");
return false;
}
return true;
}
}
Editor is loading...
Leave a Comment