builds
This commit is contained in:
162
Scripts/Spawners/LevelSpawner.cs
Normal file
162
Scripts/Spawners/LevelSpawner.cs
Normal file
@@ -0,0 +1,162 @@
|
||||
using Assets.Scripts;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using static GameHandler;
|
||||
|
||||
public class LevelSpawner : SingletonMB<LevelSpawner>
|
||||
{
|
||||
|
||||
#region PROPERTIES
|
||||
#endregion
|
||||
#region VARIABLES
|
||||
private GameHandler _gameHandler;
|
||||
|
||||
|
||||
[SerializeField] private GameObject[] patternsPrefabs;
|
||||
[SerializeField] private Transform levelSpawner;
|
||||
[SerializeField] private float patternInterval;
|
||||
[SerializeField] private GameObject PlayersContainer;
|
||||
[SerializeField] private GameObject missilePrefab;
|
||||
[SerializeField] private GameObject missileAlertPrefab;
|
||||
[SerializeField] private float dangerMinX = -25f;
|
||||
|
||||
private List<MissileAlertInfo> missileAlertList = new List<MissileAlertInfo>();
|
||||
private List<Transform> spawnedGameElements = new List<Transform>();
|
||||
private GameObject prefabParent;
|
||||
private float patternLength;
|
||||
private ObstaclePatternBehaviour lastSpawnedPattern;
|
||||
private float rewardValue = 0f;
|
||||
|
||||
#endregion
|
||||
#region EVENTS
|
||||
|
||||
public event EventHandler<PrefabSpawnedEventArgs> OnPrefabSpawned;
|
||||
|
||||
|
||||
public class PrefabSpawnedEventArgs : EventArgs
|
||||
{
|
||||
public ObstaclePatternBehaviour pattern;
|
||||
public PrefabSpawnedEventArgs(ObstaclePatternBehaviour pattern)
|
||||
{
|
||||
this.pattern = pattern;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetLevel_OnAttemptEnding(object sender, AttemptEventArgs e)
|
||||
{
|
||||
foreach (Transform gameElement in spawnedGameElements)
|
||||
{
|
||||
if (gameElement != null)
|
||||
{
|
||||
Destroy(gameElement.gameObject);
|
||||
}
|
||||
}
|
||||
if(lastSpawnedPattern)Destroy(lastSpawnedPattern.gameObject);
|
||||
lastSpawnedPattern = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region METHODS
|
||||
|
||||
void PrefabSpawnerBehaviour()
|
||||
{
|
||||
if (lastSpawnedPattern == null)
|
||||
{
|
||||
SpawnObstacle();
|
||||
}
|
||||
}
|
||||
|
||||
void SpawnObstacle()
|
||||
{
|
||||
GameObject obstacleToSpawn = patternsPrefabs[UnityEngine.Random.Range(0, patternsPrefabs.Length)];
|
||||
patternLength = obstacleToSpawn.transform.lossyScale.x;
|
||||
lastSpawnedPattern = Instantiate(obstacleToSpawn, transform.position, Quaternion.identity, prefabParent.transform)
|
||||
.GetComponent<ObstaclePatternBehaviour>();
|
||||
|
||||
OnPrefabSpawned?.Invoke(this, new PrefabSpawnedEventArgs(lastSpawnedPattern));
|
||||
}
|
||||
|
||||
//IEnumerator SpawnMissileAfterDelay(GameObject missileAlert, GameObject player)
|
||||
//{
|
||||
// yield return new WaitForSeconds(3f);
|
||||
// Vector3 missileSpawnPosition = missileAlert.transform.position + new Vector3(2.5f, 0, 0);
|
||||
// Destroy(missileAlert);
|
||||
// GameObject newMissile = Instantiate(missilePrefab, missileSpawnPosition, Quaternion.identity, prefabParent.transform);
|
||||
// MissileScript missileScript = newMissile.GetComponent<MissileScript>();
|
||||
// missileScript.Target = player;
|
||||
// spawnedGameElements.Add(newMissile.transform);
|
||||
//}
|
||||
|
||||
private void RemoveExpiredGameElements()
|
||||
{
|
||||
List<Transform> gameElementToRemove = new List<Transform>();
|
||||
|
||||
foreach (Transform gameElementTransform in spawnedGameElements)
|
||||
{
|
||||
if (gameElementTransform == null)
|
||||
{
|
||||
gameElementToRemove.Add(gameElementTransform);
|
||||
continue;
|
||||
}
|
||||
if (gameElementTransform.position.x < dangerMinX)
|
||||
{
|
||||
gameElementToRemove.Add(gameElementTransform);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (Transform gameElement in gameElementToRemove)
|
||||
{
|
||||
if (gameElement != null)
|
||||
{
|
||||
Destroy(gameElement.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//private void UpdateMissileAlertPositions()
|
||||
//{
|
||||
// missileAlertList.RemoveAll(item => item.alertTransform == null);
|
||||
// foreach (MissileAlertInfo Element in missileAlertList)
|
||||
// {
|
||||
// Vector3 newPosition = new Vector3(Element.alertTransform.position.x, Element.player.transform.position.y + 0.544f, 0);
|
||||
// Element.alertTransform.position = newPosition;
|
||||
// }
|
||||
//}
|
||||
|
||||
#endregion
|
||||
#region LIFECYCLE
|
||||
|
||||
void Start()
|
||||
{
|
||||
prefabParent = GameObject.Find("prefab");
|
||||
}
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
_gameHandler = GameHandler.Instance;
|
||||
|
||||
_gameHandler.OnAttemptEnding += ResetLevel_OnAttemptEnding;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (!GameController.Instance.IsExiting)
|
||||
{
|
||||
PrefabSpawnerBehaviour();
|
||||
RemoveExpiredGameElements();
|
||||
|
||||
}
|
||||
//UpdateMissileAlertPositions();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public struct MissileAlertInfo
|
||||
{
|
||||
public Transform alertTransform;
|
||||
public GameObject player;
|
||||
}
|
||||
|
||||
}
|
120
Scripts/Spawners/MissileSpawnerScript.cs
Normal file
120
Scripts/Spawners/MissileSpawnerScript.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using Assets.Scripts;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using static LevelSpawner;
|
||||
|
||||
public class MissileSpawnerScript : MonoBehaviour
|
||||
{
|
||||
#region PROPERTIES
|
||||
#endregion
|
||||
#region VARIABLES
|
||||
public float alertDuration = 5f;
|
||||
private int baseCountdown = 2;
|
||||
private int countdown = 0;
|
||||
|
||||
private bool renderSprite;
|
||||
private MissileAlertScript missileAlertScript;
|
||||
private PlayerScript playerScript;
|
||||
|
||||
private GameHandler _gameHandler;
|
||||
private DataBearer _dataBearer;
|
||||
private PlayersHandler _playersHandler;
|
||||
private LevelSpawner _leverSpawner;
|
||||
|
||||
[SerializeField] private GameObject missileAlertRef;
|
||||
[SerializeField] private GameObject missilePrefab;
|
||||
|
||||
#endregion
|
||||
#region EVENTS
|
||||
|
||||
public event EventHandler<MissileEventArgs> OnMissileAlert;
|
||||
public event EventHandler<MissileEventArgs> OnMissileLaunched;
|
||||
|
||||
public class MissileEventArgs : EventArgs
|
||||
{
|
||||
//todo : eventContent
|
||||
}
|
||||
|
||||
private void MissileLaunchCountdown_OnPrefab(object sender, PrefabSpawnedEventArgs args)
|
||||
{
|
||||
if (countdown == baseCountdown)
|
||||
{
|
||||
StartCoroutine(MissileLaunchSequence());
|
||||
countdown = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
countdown++;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region METHODS
|
||||
private IEnumerator MissileLaunchSequence()
|
||||
{
|
||||
|
||||
if(renderSprite)
|
||||
missileAlertScript.enabled = true;
|
||||
|
||||
yield return new WaitForSeconds(alertDuration);
|
||||
missileAlertScript.enabled = false;
|
||||
SpawnMissile();
|
||||
|
||||
}
|
||||
private void SpawnMissile()
|
||||
{
|
||||
var position = new Vector3(20, transform.position.y, -2);
|
||||
var instance = Instantiate(missilePrefab, position, missilePrefab.transform.rotation);
|
||||
instance.GetComponent<MissileScript>().SetTarget(playerScript.Id);
|
||||
instance.GetComponent<MissileScript>().SetRenderSprite(renderSprite);
|
||||
|
||||
if (!renderSprite)
|
||||
{
|
||||
DestroyImmediate(instance.GetComponent<SpriteRenderer>(), true);
|
||||
instance.GetComponent<MissileScript>().StopParticles();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region LIFECYCLE
|
||||
protected void Awake()
|
||||
{
|
||||
|
||||
_dataBearer = DataBearer.Instance;
|
||||
_gameHandler = GameHandler.Instance;
|
||||
_playersHandler = PlayersHandler.Instance;
|
||||
_leverSpawner = LevelSpawner.Instance;
|
||||
|
||||
if (!_dataBearer.Rules.Missiles)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
}
|
||||
|
||||
_leverSpawner.OnPrefabSpawned += MissileLaunchCountdown_OnPrefab;
|
||||
|
||||
missileAlertScript = missileAlertRef.GetComponent<MissileAlertScript>();
|
||||
playerScript = GetComponentInParent<PlayerScript>();
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
renderSprite = !(_gameHandler.HaveHumanPlayer && !playerScript.IsHuman); // false if game has human and script is not human
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
|
||||
private void Clean()
|
||||
{
|
||||
StopAllCoroutines();
|
||||
|
||||
LevelSpawner.Instance.OnPrefabSpawned -= MissileLaunchCountdown_OnPrefab;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
125
Scripts/Spawners/TileSpawner.cs
Normal file
125
Scripts/Spawners/TileSpawner.cs
Normal file
@@ -0,0 +1,125 @@
|
||||
using Assets.Scripts;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
using static GameHandler;
|
||||
|
||||
public class TileSpawner : SingletonMB<TileSpawner>
|
||||
{
|
||||
#region PROPERTIES
|
||||
#endregion
|
||||
#region VARIABLES
|
||||
|
||||
private GameHandler _gameHandler;
|
||||
|
||||
[SerializeField] private int maxTile = 6;
|
||||
[SerializeField] private GameObject tilePrefab;
|
||||
[SerializeField] private float tileLength = 15f;
|
||||
[SerializeField] private float tileMinX = 15f;
|
||||
|
||||
private List<Transform> tileList = new List<Transform>();
|
||||
|
||||
private GameObject tilesParent;
|
||||
private bool attemptStarted;
|
||||
private float startPositionX;
|
||||
|
||||
#endregion
|
||||
#region EVENTS
|
||||
private void StartAttempt_OnAttemptStarted(object sender, AttemptEventArgs args)
|
||||
{
|
||||
attemptStarted = true;
|
||||
}
|
||||
private void EndAttempt_OnAttemptEnded(object sender, AttemptEventArgs args)
|
||||
{
|
||||
attemptStarted = false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region METHODS
|
||||
|
||||
private void SpawnAllTiles()
|
||||
{
|
||||
for (int i = 1; i <= maxTile; i++)
|
||||
{
|
||||
SpawnTile(i);
|
||||
}
|
||||
}
|
||||
|
||||
private void SpawnTile(int tileNumber)
|
||||
{
|
||||
GameObject newTile = Instantiate(tilePrefab, transform.position-new Vector3((tileNumber*tileLength),0,0), Quaternion.identity, transform);
|
||||
//transform.position += new Vector3(tileLength, 0, 0);
|
||||
tileList.Add(newTile.transform);
|
||||
}
|
||||
|
||||
private void ResetBackgroundPosition()
|
||||
{
|
||||
transform.position += new Vector3(tileLength, transform.position.y, transform.position.z);
|
||||
}
|
||||
private void MoveTilesHorizontally()
|
||||
{
|
||||
transform.position += new Vector3(-GameHandler.Instance.FrameDistance, 0, 0);
|
||||
if(startPositionX- transform.position.x > tileLength)
|
||||
{
|
||||
ResetBackgroundPosition();
|
||||
}
|
||||
|
||||
//List<Transform> tilesToRemove = new List<Transform>();
|
||||
|
||||
//foreach (Transform tileTransform in tileList)
|
||||
//{
|
||||
// tileTransform.position += new Vector3(GameHandler.Instance.TotalDistance,0,0);;
|
||||
// if (tileTransform.position.x < tileMinX)
|
||||
// {
|
||||
// tilesToRemove.Add(tileTransform);
|
||||
// }
|
||||
//}
|
||||
|
||||
//// Remove tiles that have gone off screen
|
||||
//foreach (Transform tileToRemove in tilesToRemove)
|
||||
//{
|
||||
// tileList.Remove(tileToRemove);
|
||||
// Destroy(tileToRemove.gameObject);
|
||||
// SpawnTile();
|
||||
//}
|
||||
}
|
||||
|
||||
private float GetStartPosition()
|
||||
{
|
||||
Camera mainCamera = Camera.main;
|
||||
float screenRight = mainCamera.ScreenToWorldPoint(new Vector3(Screen.width, 0, mainCamera.nearClipPlane)).x;
|
||||
return screenRight+2*tileLength;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region LIFECYCLE
|
||||
|
||||
void Start()
|
||||
{
|
||||
attemptStarted = false;
|
||||
|
||||
_gameHandler = GameHandler.Instance;
|
||||
_gameHandler.OnAttemptStarted += StartAttempt_OnAttemptStarted;
|
||||
_gameHandler.OnAttemptEnding += EndAttempt_OnAttemptEnded;
|
||||
|
||||
startPositionX = GetStartPosition();
|
||||
transform.position = new Vector3(startPositionX, transform.position.y, transform.position.z);
|
||||
|
||||
|
||||
SpawnAllTiles();
|
||||
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if(attemptStarted)
|
||||
{
|
||||
MoveTilesHorizontally();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
Reference in New Issue
Block a user