実際にあなたがしていることもうまくいきます。各 color.Lerp に 0 と 1 の間の値を利用させたいので、コード内の変数 's' を単純に拡大する必要があります。
したがって、Gradient が行うことの単純なバージョンを作成する場合、それはあなたが持っているもののように見えますが、's' 値にスケールの再マッピングを適用します。
主に、各Ifステートメントで(または理想的にはIfステートメントからの関数呼び出しとして)、「s」を0と1の間の値に再スケーリングします。
したがって、<= 0.5
(最初の If ステートメントのように) 's' が想定されている場合、's' は 0 から 0.5 の間であることがわかります。単純に 2 を掛けると 0 と 1 の間の値が得られ、color.Lerp 関数は適切に機能します。
if(s <= 0.5){
s *= 2f;
renderer.material.color = Color.Lerp(colorEnd,colorStart, s);
}
しかし、あなたは後者のためにもう少しMathyである必要があります.
「s」が 0.5 から 1 の間になる場合は、スケールを手動で再マッピングする必要があります。
数式は次のとおりです。
Y = (((X - x1) * (y2 - y1)) / (x2 - x1)) + y1
したがって、「s」は次のようになります。
newS = (((s - sMin) * (newMax - newMn)) / (sMax - sMin)) + newMin;
スクリプトは次のようになります。
//declare variables somewhere before If statements:
color color1, color2, color3;
float newS, sMin, sMax, newMin = 0, newMax = 1;
//your If statements. you can always add more if you want more color ranges.
if(s >= 0 && <= 0.5){
sMin = 0;
sMax = 0.5;
newS = (((s - sMin) * (newMax - newMn)) / (sMax - sMin)) + newMin;
renderer.material.color = Color.Lerp(color2,color1, newS);
}
else if(s>0.5 && s<=1){
sMin = 0.5;
sMax = 1;
newS = (((s - sMin) * (newMax - newMn)) / (sMax - sMin)) + newMin;
renderer.material.color = Color.Lerp(color3,color2, newS);
}