using UnityEngine; [ExecuteAlways] public class AdjustableGlowOrb : MonoBehaviour { [SerializeField] private Color glowColor = new Color(0.1f, 0.65f, 1f, 1f); [SerializeField, Min(0f)] private float emissionIntensity = 2.5f; [SerializeField, Range(0f, 1f)] private float haloAlpha = 0.25f; [SerializeField] private Renderer targetRenderer; [Tooltip("光晕等附属渲染器,留空时自动收集子级(排除主体球)")] [SerializeField] private Renderer[] haloRenderers; private MaterialPropertyBlock propertyBlock; private void OnEnable() { ApplyVisuals(); } private void OnValidate() { ApplyVisuals(); } public void SetGlowColor(Color color) { glowColor = color; ApplyVisuals(); } public Color GetGlowColor() => glowColor; private void ApplyVisuals() { if (targetRenderer == null) { targetRenderer = GetComponent(); } if (haloRenderers == null || haloRenderers.Length == 0) { haloRenderers = GetComponentsInChildren(true); for (int i = 0; i < haloRenderers.Length; i++) { if (haloRenderers[i] == targetRenderer) { haloRenderers[i] = null; } } } if (targetRenderer != null) { propertyBlock ??= new MaterialPropertyBlock(); targetRenderer.GetPropertyBlock(propertyBlock); Color emission = glowColor * emissionIntensity; propertyBlock.SetColor("_BaseColor", glowColor); propertyBlock.SetColor("_Color", glowColor); propertyBlock.SetColor("_EmissionColor", emission); targetRenderer.SetPropertyBlock(propertyBlock); } if (haloRenderers == null) return; propertyBlock ??= new MaterialPropertyBlock(); Color haloTint = new Color(glowColor.r, glowColor.g, glowColor.b, haloAlpha); foreach (Renderer halo in haloRenderers) { if (halo == null) continue; halo.GetPropertyBlock(propertyBlock); // Legacy Shaders/Particles/Additive 用 _TintColor 作为颜色入口 propertyBlock.SetColor("_TintColor", haloTint); propertyBlock.SetColor("_Color", haloTint); halo.SetPropertyBlock(propertyBlock); } } }