Unity 2019.4.0f1を使っています。
画像の部分のintensityにスクリプトよりアクセスしたいのですが、
色々調べた結果、以下のコードにたどり着きました。
しかし思った様な結果になりませんでした。
Intensityに直接アクセスする事は出来ないのでしょうか?
public float intensity = 10f;
void Start()
{
mat = GetComponent<LineRenderer>().material;
mat.EnableKeyword("_EMISSION");
float factor = Mathf.Pow(2, intensity);
mat.SetColor("_EmissionColor", new Color(0.0f* factor, 0.0f* factor, 1.0f* factor));
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
ご提示のコードは「指定したIntensityの色をEmissionに設定する」という方向のようですが、そうではなくて逆に「現在のEmissionの色からIntensityを取り出したい」ということでしょうか?
でしたらColor
構造体自体にはIntensityに相当する値は記録されていませんので、計算により求める必要があるかと思います。
UnityのカラーピッカーではColorMutatorがIntensity抽出(それ以外にも各種色変換処理)を担当しているようです。残念ながらこのクラスはinternal
で、なおかつUnityEditor
にあるためビルドしたプログラム上での実行時に使用することはできないでしょう。ですので同等の動作をするコードを自前で書く必要があるかと思います。
試しに下記のようにDecomposeHdrColor
メソッドを丸写しして動かしてみたところ、インスペクター上のIntensityと同じ値が得られているようでした。UnityCsReferenceのコードは参考情報として公開されているだけであり、このように丸ごと拝借するのはライセンス的に問題があるかもしれませんが、あくまでも実験ということでご容赦ください...
C#
1using System; 2using UnityEngine; 3using Random = UnityEngine.Random; 4 5[RequireComponent(typeof(Renderer))] 6public class ColorDecomposer : MonoBehaviour 7{ 8 // specifies the max byte value to use when decomposing a float color into bytes with exposure 9 // this is the value used by Photoshop 10 private const byte k_MaxByteForOverexposedColor = 191; 11 12 private static void DecomposeHdrColor(Color linearColorHdr, out Color32 baseLinearColor, out float exposure) 13 { 14 baseLinearColor = linearColorHdr; 15 var maxColorComponent = linearColorHdr.maxColorComponent; 16 // replicate Photoshops's decomposition behaviour 17 if (maxColorComponent == 0f || maxColorComponent <= 1f && maxColorComponent >= 1 / 255f) 18 { 19 exposure = 0f; 20 21 baseLinearColor.r = (byte)Mathf.RoundToInt(linearColorHdr.r * 255f); 22 baseLinearColor.g = (byte)Mathf.RoundToInt(linearColorHdr.g * 255f); 23 baseLinearColor.b = (byte)Mathf.RoundToInt(linearColorHdr.b * 255f); 24 } 25 else 26 { 27 // calibrate exposure to the max float color component 28 var scaleFactor = k_MaxByteForOverexposedColor / maxColorComponent; 29 exposure = Mathf.Log(255f / scaleFactor) / Mathf.Log(2f); 30 31 // maintain maximal integrity of byte values to prevent off-by-one errors when scaling up a color one component at a time 32 baseLinearColor.r = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.r)); 33 baseLinearColor.g = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.g)); 34 baseLinearColor.b = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.b)); 35 } 36 } 37 38 private void Start() 39 { 40 // 実験用にランダムな色を作り... 41 var randomColor = new Color(Random.Range(0.0f, 10.0f), Random.Range(0.0f, 10.0f), Random.Range(0.0f, 10.0f)); 42 43 // とりあえず確認のため、その色をコンソールに出力してみる 44 Debug.Log($"Random color:{randomColor.ToString("F8")}"); 45 46 // その色をベース色と強度に分解し、結果をコンソールに出力してみる 47 DecomposeHdrColor(randomColor, out var baseColor, out var intensity); 48 Debug.Log($"Base:{baseColor} Intensity:{intensity}"); 49 50 // このランダム色をマテリアルにセットしてやると、インスペクター上のEmission欄の色もその色に置き換わるはず 51 // その状態でEmission欄からカラーピッカーを開くと、うまくいっていればコンソールに表示されたIntensityと 52 // カラーピッカー上のIntensityが一致しているはず 53 var material = this.GetComponent<Renderer>().material; 54 material.SetColor("_EmissionColor", randomColor); 55 56 // ちなみに、現在マテリアルにセットされている色を取得したい場合は 57 // SetColorと対になるGetColorを使えばOK 58 var emissionColor = material.GetColor("_EmissionColor"); 59 Debug.Log($"Emission color:{emissionColor.ToString("F8")}"); 60 } 61}
投稿2020/09/17 10:51
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。