using System; using System.Collections; using System.Collections.Generic; using UnityEngine; // 날짜 : 2021-01-18 PM 4:07:08 // 작성자 : Rito public abstract class AfterImageFaderBase : MonoBehaviour { protected AfterImageBase Controller { get; set; } protected List TargetTransformList { get; set; } protected List ChildrenTransformList { get; set; } protected List ChildrenRendererList { get; set; } protected AfterImageData Data { get; set; } protected float CurrentAlpha { get; set; } protected float CurrentElapsedTime { get; set; } /// 현재 알파를 업데이트하는 구간값 protected const float AlphaUpdateInterval = 0.1f; /*********************************************************************** * Unity Events ***********************************************************************/ #region . private void Update() { CurrentElapsedTime += Time.deltaTime; if (CurrentElapsedTime >= Data.duration * AlphaUpdateInterval) { CurrentAlpha -= AlphaUpdateInterval; SetChildrenAlpha(CurrentAlpha); CurrentElapsedTime = 0f; } if (CurrentAlpha <= 0f) { CurrentElapsedTime = 0f; Sleep(); } } #endregion /*********************************************************************** * Methods ***********************************************************************/ #region . public abstract void Setup(Array targetArray, AfterImageData data, AfterImageBase controller); protected abstract void CreateChildImages(); public virtual void WakeUp(in Color color) { gameObject.SetActive(true); SetChildrenColor(color); CurrentAlpha = 1.0f; for (int i = 0; i < ChildrenTransformList.Count; i++) { ChildrenTransformList[i].SetPositionAndRotation( TargetTransformList[i].position, TargetTransformList[i].rotation ); ChildrenTransformList[i].localScale = TargetTransformList[i].localScale; } } public virtual void Sleep() { Controller.SetImageReadyState(this); gameObject.SetActive(false); } protected void SetChildrenColor(in Color color) { foreach (var renderer in ChildrenRendererList) { renderer.material.SetVector(Data.shaderColorName, new Vector4(color.r, color.g, color.b, 1f)); } } protected void SetChildrenAlpha(in float alpha) { foreach (var renderer in ChildrenRendererList) { renderer.material.SetFloat(Data.shaderAlphaName, alpha); } } #endregion }