MainLogic

 avatar
unknown
plain_text
a year ago
12 kB
6
Indexable
using UnityEngine;
using UnityEngine.UI;
using TouchScript.Gestures;
using System.Collections;
using System.Collections.Generic;
using PathCreation;
using TMPro;

public class FishSpawner : MonoBehaviour
{
    public SaveLoadSettings saveLoadSettings;
    private int _mode;
    private int timer;

    public GameObject fishPrefab;
    public Camera mainRaycastCamera;
    public GameObject submarine;
    public GameObject entireSubmarine;
    public PathCreator pathCreator;
    public ParticleSystem hitParticles;
    public ParticleSystem deathParticles;
    public ParticleSystem biteParticles;

    public AudioSource hitSound;
    public AudioSource deathSound;
    public AudioSource biteSound1;
    public AudioSource biteSound2;
    public AudioSource startMusic;
    public AudioSource gameMusic;
    public float spawnDistance = 10f;
    public int maxFishCount = 8;
    public float swimSpeed = 2f;
    public float spawnInterval = 2.5f;
    public float minDistanceBetweenFish = 2f;
    public int maxSpawnAttempts = 10;
    public float speed = 5;

    private List<Fish> activeFish = new List<Fish>();
    private float distanceTravelled;
    public Camera startCamera;
    public Camera gameCamera;
    private bool isGameStarted = false;
    public Canvas menu;
    
    // New variables for timer
    public Canvas gameCanvas;
    public TextMeshProUGUI timerText;
    private float currentTime;

    void Start()
    {
        Debug.Log("FishSpawner Start method called");
        if (startCamera != null) startCamera.gameObject.SetActive(true);
        else Debug.LogError("Start camera is not assigned");
        
        if (gameCamera != null) gameCamera.gameObject.SetActive(false);
        else Debug.LogError("Game camera is not assigned");
        
        if (startMusic != null) startMusic.Play();
        else Debug.LogError("Start music is not assigned");

        saveLoadSettings.LoadData();

        _mode = saveLoadSettings.getDataIntById(0);
        if (_mode == 160) {
            timer = 160;
        } else if (_mode == 300) {
            timer = 300;
        } else if (_mode == 600) {
            timer = 600;
        }
        currentTime = timer;

        Debug.Log($"Mode: {_mode}, Timer set to: {timer} seconds");
        
        if (timerText != null)
        {
            timerText.text = FormatTime(currentTime);
        }
        else
        {
            Debug.LogError("Timer Text is not assigned");
        }
        
        if (gameCanvas != null)
        {
            gameCanvas.gameObject.SetActive(false);
        }
        else
        {
            Debug.LogError("Game Canvas is not assigned");
        }

        if (menu == null)
        {
            Debug.LogError("Menu Canvas is not assigned");
        }

        
    }



    void RemoveUnwantedMeshColliders()
    {
        MeshCollider[] allMeshColliders = FindObjectsOfType<MeshCollider>();
        foreach (MeshCollider collider in allMeshColliders)
        {
            if (!IsPartOfImportantObject(collider.gameObject))
            {
                Destroy(collider);
            }
        }
    }

    bool IsPartOfImportantObject(GameObject obj)
    {
        if (obj == submarine || obj == entireSubmarine || 
            (submarine != null && obj.transform.IsChildOf(submarine.transform)) ||
            (entireSubmarine != null && obj.transform.IsChildOf(entireSubmarine.transform)) ||
            obj.CompareTag("Wall"))
        {
            return true;
        }

        foreach (Fish fish in activeFish)
        {
            if (fish != null && (obj == fish.gameObject || obj.transform.IsChildOf(fish.transform)))
            {
                return true;
            }
        }

        return false;
    }

    public void StartGame()
    {
        Debug.Log("StartGame method called");
        if (!isGameStarted)
        {
            isGameStarted = true;
            Debug.Log("Game started: " + isGameStarted);
            SwitchToGameCamera();
            RemoveUnwantedMeshColliders();
            StartCoroutine(SpawnFishRoutine());
            if (menu != null)
            {
                menu.gameObject.SetActive(false);
                Debug.Log("Menu deactivated");
            }
            if (startMusic != null)
            {
                startMusic.Stop();
                Debug.Log("Start music stopped");
            }
            if (gameMusic != null)
            {
                gameMusic.Play();
                Debug.Log("Game music started");
            }
            if (gameCanvas != null)
            {
                gameCanvas.gameObject.SetActive(true);
                Debug.Log("Game canvas activated");
            }
            currentTime = timer;
            Debug.Log("Timer reset to: " + currentTime);
        }
        else
        {
            Debug.LogWarning("Attempted to start the game, but it's already running");
        }
    }

    void SwitchToGameCamera()
    {
        Debug.Log("Switching to game camera");
        if (startCamera != null)
        {
            startCamera.gameObject.SetActive(false);
            Debug.Log("Start camera deactivated");
        }
        if (gameCamera != null)
        {
            gameCamera.gameObject.SetActive(true);
            Debug.Log("Game camera activated");
        }
    }

    void Update()
    {
        if (!isGameStarted) return;

        distanceTravelled += speed * Time.deltaTime;
        entireSubmarine.transform.position = pathCreator.path.GetPointAtDistance(distanceTravelled);
        entireSubmarine.transform.rotation = pathCreator.path.GetRotationAtDistance(distanceTravelled);

        foreach (Fish fish in activeFish)
        {
            if (fish != null)
            {
                fish.UpdateTargetPosition(submarine.transform.position);
            }
        }

        // Update timer
        currentTime -= Time.deltaTime;
        if (timerText != null)
        {
            timerText.text = FormatTime(currentTime);
        }

        // Check if timer has reached zero
        if (currentTime <= 0)
        {
            Debug.Log("Timer reached zero, ending game");
            EndGame();
        }
    }

    void EndGame()
    {
        isGameStarted = false;
        if (gameMusic != null) gameMusic.Stop();
        if (startMusic != null) startMusic.Play();
        if (gameCanvas != null) gameCanvas.gameObject.SetActive(false);
        if (menu != null) menu.gameObject.SetActive(true);
        SwitchToStartCamera();
        ClearActiveFish();
        ResetGame();
    }

    void SwitchToStartCamera()
    {
        if (startCamera != null) startCamera.gameObject.SetActive(true);
        if (gameCamera != null) gameCamera.gameObject.SetActive(false);
    }

    void ClearActiveFish()
    {
        foreach (Fish fish in activeFish)
        {
            if (fish != null)
            {
                Destroy(fish.gameObject);
            }
        }
        activeFish.Clear();
    }

    void ResetGame()
    {
        distanceTravelled = 0;
        currentTime = timer;
        if (timerText != null)
        {
            timerText.text = FormatTime(currentTime);
        }
    }

    string FormatTime(float timeInSeconds)
    {
        int minutes = Mathf.FloorToInt(timeInSeconds / 60);
        int seconds = Mathf.FloorToInt(timeInSeconds % 60);
        return string.Format("{0:00}:{1:00}", minutes, seconds);
    }

    IEnumerator SpawnFishRoutine()
    {
        while (isGameStarted)
        {
            if (activeFish.Count < maxFishCount)
            {
                SpawnFish();
                yield return new WaitForSeconds(spawnInterval);
            }
            else
            {
                yield return new WaitForSeconds(1f);
            }
        }
    }
    void SpawnFish()
    {
        Vector3 spawnPosition = GetValidSpawnPosition();
        if (spawnPosition != Vector3.zero)
        {
            GameObject fishObject = Instantiate(fishPrefab, spawnPosition, Quaternion.identity, transform);
            Fish fishScript = fishObject.GetComponent<Fish>();
            if (fishScript == null)
            {
                fishScript = fishObject.AddComponent<Fish>();
            }
            fishScript.Initialize(mainRaycastCamera, submarine.transform.position, swimSpeed, biteSound1, biteSound2, biteParticles, this);

            // Ensure the fish has a collider for TouchScript
            Collider fishCollider = fishObject.GetComponent<Collider>();
            if (fishCollider == null)
            {
                fishObject.AddComponent<BoxCollider>();
            }

            activeFish.Add(fishScript);
        }
        else
        {
            Debug.LogWarning("Could not find a valid spawn position for fish.");
        }
    }

        public void OnFishTapped(Fish fish) 
    {
        if (fish != null && activeFish.Contains(fish) && !fish.IsBeingRemoved)
        {
            ParticleSystem particles = Instantiate(hitParticles, fish.transform.position + new Vector3(0, 0, -1f), Quaternion.identity, entireSubmarine.transform);
            particles.Play();
            Destroy(particles.gameObject, particles.main.duration);

            AudioSource hitSoundInstance = Instantiate(hitSound, fish.transform.position, Quaternion.identity, entireSubmarine.transform);
            hitSoundInstance.pitch = Random.Range(0.8f, 1.2f);
            hitSoundInstance.Play();
            Destroy(hitSoundInstance.gameObject, hitSoundInstance.clip.length);

            StartCoroutine(RemoveFishWithAnimation(fish));
        }
    }

    Vector3 GetValidSpawnPosition()
    {
        for (int i = 0; i < maxSpawnAttempts; i++)
        {
            Vector3 candidatePosition = GetSpawnPosition();
            if (IsPositionValid(candidatePosition))
            {
                return candidatePosition;
            }
        }
        return Vector3.zero;
    }

    Vector3 GetSpawnPosition()
    {
        Vector3 randomDirection = Random.insideUnitSphere;
        randomDirection.x = -Mathf.Abs(randomDirection.x);

        Vector3 spawnPosition = submarine.transform.position;
        spawnPosition += submarine.transform.rotation * (randomDirection * spawnDistance);

        return spawnPosition;
    }

    bool IsPositionValid(Vector3 position)
    {
        foreach (Fish fish in activeFish)
        {
            if (fish != null && Vector3.Distance(fish.transform.position, position) < minDistanceBetweenFish)
            {
                return false;
            }
        }
        return true;
    }

    IEnumerator RemoveFishWithAnimation(Fish fish)
    {
        if (fish == null || !activeFish.Contains(fish))
        {
            yield break;
        }

        fish.IsBeingRemoved = true;
        fish.PlayDeathAnimation();

        yield return new WaitForSeconds(1f);

        if (fish != null && activeFish.Contains(fish))
        {
            activeFish.Remove(fish);
            Destroy(fish.gameObject);
            ParticleSystem particles = Instantiate(deathParticles, fish.transform.position, Quaternion.identity);
            particles.Play();
            Destroy(particles.gameObject, particles.main.duration);
            AudioSource deathSoundInstance = Instantiate(deathSound, fish.transform.position, Quaternion.identity);
            deathSoundInstance.pitch = Random.Range(0.8f, 1.2f);
            deathSoundInstance.Play();
            Destroy(deathSoundInstance.gameObject, deathSoundInstance.clip.length);
        }
    }
}
Editor is loading...
Leave a Comment