using System; using System.Collections.Generic; using System.Linq; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; namespace SLSUtilities.AllInOneAssistance { public partial class General3DObject : SerializedMonoBehaviour { public List renderers; public List materials; protected virtual void Reset() { CollectRenderersAndMaterials(); } [Button("Collect Renderers and Materials")] private void CollectRenderersAndMaterials() { renderers = new List(GetComponentsInChildren()); materials = new List(); foreach (var renderer in renderers) { materials.AddRange(renderer.sharedMaterials); } } } public partial class General3DObject { private static readonly int FadeAmount = Shader.PropertyToID("_FadeAmount"); private static readonly int FadeOn = Shader.PropertyToID("_FadeOn"); private Sequence fadeSequence; public void SetFadeAmount(float value) { foreach (var material in materials.Where(material => material.HasProperty(FadeAmount))) { material.SetFloat(FadeAmount, value); } } public void SetFadeAnim(float duration, float startValue = 1f, float endValue = 0f) { fadeSequence?.Kill(); fadeSequence = DOTween.Sequence(); foreach (var material in materials.Where(material => material.HasProperty(FadeAmount))) { if (!material.HasFloat(FadeOn)) { Debug.LogWarning($"{material.name} 没有 _FadeOn 属性,无法进行淡入淡出效果。"); continue; } fadeSequence.Join(material.DOFloat(endValue, FadeAmount, duration).From(startValue)); } fadeSequence.Play(); } } }