63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
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<Renderer> renderers;
|
|
public List<Material> materials;
|
|
|
|
protected virtual void Reset()
|
|
{
|
|
CollectRenderersAndMaterials();
|
|
}
|
|
|
|
[Button("Collect Renderers and Materials")]
|
|
private void CollectRenderersAndMaterials()
|
|
{
|
|
renderers = new List<Renderer>(GetComponentsInChildren<Renderer>());
|
|
materials = new List<Material>();
|
|
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();
|
|
}
|
|
}
|
|
} |