77 lines
3.1 KiB
C#
77 lines
3.1 KiB
C#
using Cinemachine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class BombController : MonoBehaviour, IPooledObject{
|
|
|
|
[SerializeField, Range(0, 5f)] float timeToExplode = 1.5f;
|
|
float currentTime;
|
|
[SerializeField, Range(1, 10)] int maxDistance = 5;
|
|
|
|
[Space]
|
|
[SerializeField, Range(0, .3f)] float timeBetweenExplosions = .05f;
|
|
bool exploded;
|
|
|
|
[SerializeField] LayerMask whatIsWall = -1;
|
|
bool canRightSpawn, canLeftSpawn, canForwardSpawn, canBackSpawn;
|
|
|
|
public void OnObjectSpawn(){
|
|
currentTime = 0;
|
|
exploded = false;
|
|
canRightSpawn = canLeftSpawn = canForwardSpawn = canBackSpawn = true;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update(){
|
|
currentTime += Time.deltaTime;
|
|
if(currentTime >= timeToExplode && !exploded){
|
|
StartCoroutine(Explode());
|
|
ScreenShakeCall.instance.ShakeCamera(10f, .4f);
|
|
exploded = true;
|
|
}
|
|
}
|
|
|
|
IEnumerator Explode(){
|
|
for (int i = 0; i < maxDistance; i++){
|
|
yield return new WaitForSeconds(timeBetweenExplosions);
|
|
if (i == 0){
|
|
ObjectPooler.instance.SpawnFromPool("Explosion", transform.position, Quaternion.identity);
|
|
}else{
|
|
if(!Physics.CheckSphere(transform.position + Vector3.right * i, .3f, whatIsWall) && canRightSpawn){
|
|
ObjectPooler.instance.SpawnFromPool("Explosion", transform.position + Vector3.right * i, Quaternion.identity);
|
|
}else{
|
|
canRightSpawn = false;
|
|
}
|
|
|
|
if (!Physics.CheckSphere(transform.position + Vector3.left * i, .3f, whatIsWall) && canLeftSpawn){
|
|
ObjectPooler.instance.SpawnFromPool("Explosion", transform.position + Vector3.left * i, Quaternion.identity);
|
|
}else{
|
|
canLeftSpawn = false;
|
|
}
|
|
|
|
if (!Physics.CheckSphere(transform.position + Vector3.forward * i, .3f, whatIsWall) && canForwardSpawn){
|
|
ObjectPooler.instance.SpawnFromPool("Explosion", transform.position + Vector3.forward * i, Quaternion.identity);
|
|
}else{
|
|
canForwardSpawn = false;
|
|
}
|
|
|
|
if (!Physics.CheckSphere(transform.position + Vector3.back * i, .3f, whatIsWall) && canBackSpawn){
|
|
ObjectPooler.instance.SpawnFromPool("Explosion", transform.position + Vector3.back * i, Quaternion.identity);
|
|
}else{
|
|
canBackSpawn = false;
|
|
}
|
|
}
|
|
AudioManager.instance.PlayWithRandomPitch("Explode");
|
|
}
|
|
gameObject.SetActive(false);
|
|
}
|
|
|
|
void OnDrawGizmos(){
|
|
Gizmos.color = Color.red;
|
|
Gizmos.DrawLine(transform.position, transform.position + Vector3.right * maxDistance);
|
|
Gizmos.DrawLine(transform.position, transform.position + Vector3.left * maxDistance);
|
|
Gizmos.DrawLine(transform.position, transform.position + Vector3.forward * maxDistance);
|
|
Gizmos.DrawLine(transform.position, transform.position + Vector3.back * maxDistance);
|
|
}
|
|
}
|