コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Gradient クラスから部分範囲を切り出すメソッド

ソースコード

using System.Collections.Generic;
using UnityEngine;

namespace Kogane
{
    public static class GradientExtensionMethods
    {
        public static Gradient GetSubGradient
        (
            this Gradient self,
            float         min,
            float         max
        )
        {
            min = Mathf.Clamp01( min );
            max = Mathf.Clamp01( max );

            var gradient = new Gradient();

            var colorKeys = new List<GradientColorKey>
            {
                new( self.Evaluate( min ), 0 ),
            };

            foreach ( var key in self.colorKeys )
            {
                if ( key.time <= min ) continue;
                if ( max <= key.time ) continue;

                var time     = Mathf.InverseLerp( min, max, key.time );
                var colorKey = new GradientColorKey( key.color, time );

                colorKeys.Add( colorKey );
            }

            colorKeys.Add( new( self.Evaluate( max ), 1 ) );

            var alphaKeys = new List<GradientAlphaKey>
            {
                new( self.Evaluate( min ).a, 0 ),
            };

            foreach ( var key in self.alphaKeys )
            {
                if ( key.time <= min ) continue;
                if ( max <= key.time ) continue;

                var time     = Mathf.InverseLerp( min, max, key.time );
                var alphaKey = new GradientAlphaKey( key.alpha, time );

                alphaKeys.Add( alphaKey );
            }

            alphaKeys.Add( new( self.Evaluate( max ).a, 1 ) );

            gradient.SetKeys
            (
                colorKeys: colorKeys.ToArray(),
                alphaKeys: alphaKeys.ToArray()
            );

            return gradient;
        }
    }
}