This commit is contained in:
2024-06-12 21:03:42 +02:00
parent 4685d9942b
commit aef3b3ab97
1548 changed files with 5615 additions and 72 deletions

View 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;
}
}

View 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
}

View 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
}