125 lines
3.9 KiB
C#
125 lines
3.9 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
using UHFPS.Input;
|
|
using UHFPS.Tools;
|
|
|
|
namespace UHFPS.Runtime
|
|
{
|
|
public class CandleItem : PlayerItemBehaviour
|
|
{
|
|
public Light FlameLight;
|
|
public MeshRenderer FlameRenderer;
|
|
|
|
public float NormalLightMultiplier = 1f;
|
|
public float FocusLightMultiplier = 2f;
|
|
|
|
public float FlameLightIntensity = 1f;
|
|
public float FlameIntensityChangeSpeed = 1f;
|
|
public MinMax FlameFlickerLimits;
|
|
public float FlameFlickerSpeed;
|
|
|
|
public string CandleDrawState = "CandleDraw";
|
|
public string CandleHideState = "CandleHide";
|
|
public string CandleIdleState = "CandleIdle";
|
|
public string CandleFocusState = "CandleFocus";
|
|
public string CandleUnfocusState = "CandleUnfocus";
|
|
|
|
public string CandleFocusTrigger = "Focus";
|
|
public string CandleBlowTrigger = "Blow";
|
|
|
|
public SoundClip FlameBlow;
|
|
|
|
private AudioSource audioSource;
|
|
private float newIntensity;
|
|
private bool isEquipped;
|
|
private bool isBusy;
|
|
|
|
public override string Name => "Candle";
|
|
|
|
public override bool IsBusy() => !isEquipped || isBusy;
|
|
|
|
private void Awake()
|
|
{
|
|
audioSource = GetComponent<AudioSource>();
|
|
newIntensity = FlameLightIntensity;
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
if (isEquipped)
|
|
{
|
|
float intensityMultiplier = NormalLightMultiplier;
|
|
|
|
if (CanInteract && InputManager.ReadButton(Controls.ADS))
|
|
{
|
|
Animator.SetBool(CandleFocusTrigger, true);
|
|
intensityMultiplier = FocusLightMultiplier;
|
|
}
|
|
else
|
|
{
|
|
Animator.SetBool(CandleFocusTrigger, false);
|
|
}
|
|
|
|
float flicker = Mathf.PerlinNoise(Time.time * FlameFlickerSpeed, 0);
|
|
newIntensity = Mathf.MoveTowards(newIntensity, FlameLightIntensity * intensityMultiplier, Time.deltaTime * FlameIntensityChangeSpeed);
|
|
FlameLight.intensity = Mathf.Lerp(FlameFlickerLimits.RealMin, FlameFlickerLimits.RealMax, flicker) * newIntensity;
|
|
}
|
|
}
|
|
|
|
public override void OnItemSelect()
|
|
{
|
|
ItemObject.SetActive(true);
|
|
FlameRenderer.gameObject.SetActive(true);
|
|
StartCoroutine(ShowCandle());
|
|
isEquipped = false;
|
|
}
|
|
|
|
IEnumerator ShowCandle()
|
|
{
|
|
yield return new WaitForAnimatorClip(Animator, CandleDrawState);
|
|
isEquipped = true;
|
|
}
|
|
|
|
public override void OnItemDeselect()
|
|
{
|
|
StopAllCoroutines();
|
|
StartCoroutine(HideCandle());
|
|
Animator.SetTrigger(CandleBlowTrigger);
|
|
isBusy = true;
|
|
}
|
|
|
|
IEnumerator HideCandle()
|
|
{
|
|
yield return new WaitForAnimatorClip(Animator, CandleHideState);
|
|
ItemObject.SetActive(false);
|
|
isBusy = false;
|
|
isEquipped = false;
|
|
}
|
|
|
|
public void BlowOutFlame()
|
|
{
|
|
FlameRenderer.gameObject.SetActive(false);
|
|
audioSource.PlayOneShotSoundClip(FlameBlow);
|
|
}
|
|
|
|
public override void OnItemActivate()
|
|
{
|
|
ItemObject.SetActive(true);
|
|
FlameRenderer.gameObject.SetActive(true);
|
|
Animator.Play(CandleIdleState);
|
|
|
|
StopAllCoroutines();
|
|
isBusy = false;
|
|
isEquipped = true;
|
|
}
|
|
|
|
public override void OnItemDeactivate()
|
|
{
|
|
StopAllCoroutines();
|
|
FlameRenderer.gameObject.SetActive(true);
|
|
ItemObject.SetActive(false);
|
|
isEquipped = false;
|
|
isBusy = false;
|
|
}
|
|
}
|
|
} |