using System.Collections; using System.Collections.Generic; using UnityEngine; public class Campfire : MonoBehaviour { public GameState GameState; public Light DynamicLight; [Tooltip("This audiosource will play the clips to indicate that an object has been thrown in the fire.")] public AudioSource BurnEffectSource; public float GoodFuelAmount; [Tooltip("The light turns this color when Fuel < GoodFuelAmount. Otherwise it'll be as it is in the editor.")] public Color TooLowFuelColor; public float RandomVarianceDuration; public float RandomVarianceMagnitude; [Tooltip("How long of a break the campfire takes between eating logs, if multiple are placed on it.")] public float LogBurningCooldown; [Header("Runtime values")] public float Fuel; private Color EnoughFuelColor; private float FullRange; private float RandomVariance = 0; private float NextRandomVariance = 0; private float LastRandomVarianceChange = 0; private List LogQueue = new List(); private float LastLogBurned = 0; private void Awake() { EnoughFuelColor = DynamicLight.color; FullRange = DynamicLight.range; } private void Update() { if (LogQueue.Count > 0 && Time.time - LastLogBurned > LogBurningCooldown) { LastLogBurned = Time.time; BurnLog(LogQueue[0]); LogQueue.RemoveAt(0); } if (Time.time - LastRandomVarianceChange > RandomVarianceDuration) { NextRandomVariance = (Random.value - 0.5f) * 2f * RandomVarianceMagnitude; LastRandomVarianceChange = Time.time; } RandomVariance = Mathf.Lerp(RandomVariance, NextRandomVariance, (Time.time - LastRandomVarianceChange) / RandomVarianceDuration); Fuel -= Time.deltaTime; DynamicLight.range = Mathf.Log(Fuel + 1f, 10) / 2f * FullRange + RandomVariance; DynamicLight.color = Color.Lerp(DynamicLight.color, Fuel < GoodFuelAmount ? TooLowFuelColor : EnoughFuelColor, 10f * Time.deltaTime); if (Fuel <= 0) { GameState.Current = State.GameOver; } } private void BurnLog(Burnable burnable) { Fuel += burnable.Quality.FuelValue; if (Fuel < GoodFuelAmount) { Fuel += 2; } BurnEffectSource.PlayOneShot(burnable.Quality.BurningSound); Destroy(burnable.gameObject); } private void OnCollisionEnter(Collision c) { if (c.collider.attachedRigidbody != null && c.collider.attachedRigidbody) { Burnable Burnable = c.collider.attachedRigidbody.GetComponent(); if (Burnable != null) { LogQueue.Add(Burnable); } } } private void OnCollisionExit(Collision c) { if (c.collider.attachedRigidbody != null && c.collider.attachedRigidbody) { Burnable Burnable = c.collider.attachedRigidbody.GetComponent(); if (Burnable != null) { LogQueue.Remove(Burnable); } } } }