campfire/Assets/Scripts/Torch.cs

113 lines
4.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class Torch : MonoBehaviour {
public Transform FirePoint;
public ParticleSystem Particles;
public Light Light;
public Color NormalColor;
public Color PanicColor;
public float Lifetime;
public float PanicLifetimeThreshold;
public float PassTorchAnimationDuration;
public float IgniteDuration;
[Header("No lights in camp -effect")]
public Transform NoEffectReferencePoint;
public float NoEffectRadius;
[Header("Sound effects")]
public AudioSource TorchSound;
public AudioClip[] FireClips;
public bool Burning {
get {
return Lifetime > 0;
}
}
private Rigidbody Body;
private Quaternion PassRotation = Quaternion.LookRotation(Vector3.forward, (Vector3.right + Vector3.forward).normalized);
private bool PassingTorch = false;
private float TorchPassStarted = 0;
private Transform PassTo;
private Vector3 PassStartPosition;
private Quaternion PassStartRotation;
private Vector3 BaseScale;
private float StartLifetime;
private float BaseIntensity;
private void Awake() {
Body = GetComponent<Rigidbody>();
BaseScale = transform.localScale;
StartLifetime = Lifetime;
BaseIntensity = Light.intensity;
Light.intensity = 0;
NoEffectReferencePoint = GameObject.FindGameObjectWithTag("Campfire").transform;
}
private void Update() {
if (PassingTorch) {
if (PassTo != null) {
// Move to other, to-be-enflamed torch
transform.position = Vector3.Lerp(
PassStartPosition,
PassTo.position - transform.rotation * FirePoint.localPosition,
(Time.time - TorchPassStarted) / PassTorchAnimationDuration);
transform.localRotation = Quaternion.Slerp(
PassStartRotation,
PassRotation,
(Time.time - TorchPassStarted) / PassTorchAnimationDuration * 2f);
}
if (Time.time - TorchPassStarted >= IgniteDuration) {
Lifetime = 0;
}
} else if (Burning) {
// Move to origin
transform.localPosition = Vector3.Lerp(transform.localPosition, Vector3.zero, 12f * Time.deltaTime);
transform.localRotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(Vector3.forward, Vector3.up), 12f * Time.deltaTime);
}
Lifetime -= Time.deltaTime;
if (Lifetime <= 0) {
Particles.Stop();
Light.color = Color.Lerp(Light.color, Color.black, 4f * Time.deltaTime);
TorchSound.volume = Mathf.Lerp(TorchSound.volume, 0, 8f * Time.deltaTime);
if (Light.color == Color.black) {
Light.enabled = false;
}
if (TorchSound.volume == 0) {
TorchSound.enabled = false;
}
} else {
bool Panic = Lifetime <= PanicLifetimeThreshold;
Light.color = Color.Lerp(Light.color, Panic ? PanicColor : NormalColor, 4f * Time.deltaTime);
Light.intensity = BaseIntensity * Mathf.Clamp((transform.position - NoEffectReferencePoint.position).magnitude / NoEffectRadius, 0.4f, 1);
if ((TorchSound.clip.length - TorchSound.time) <= Time.deltaTime || !TorchSound.isPlaying) {
TorchSound.clip = FireClips[Random.Range(0, FireClips.Length)];
TorchSound.time = 0;
TorchSound.Play();
}
TorchSound.volume = 0.5f + 0.5f * (1f / (Mathf.Max(0, StartLifetime + 0.5f - Lifetime) * 4f + 1)) - (Panic ? 0.3f : 0);
}
}
public void PassTorch(Transform target) {
PassingTorch = true;
PassTo = target;
TorchPassStarted = Time.time;
PassStartPosition = transform.position;
PassStartRotation = transform.localRotation;
}
public void Drop() {
Body.isKinematic = false;
transform.parent = GameObject.FindGameObjectWithTag("World").transform;
}
}