前回までの記事では、ポストプロセッシングの活用や、オブジェクトのEmissionを制御し、光の強さや色を変更する方法を紹介してきました。今回は、シーンを再生している時にキーボードの十字キーの操作することで、発光の強弱や色を変化させるような、少し応用的なことをご紹介します。
キーボードで色や強弱が変わるように修正
前回作成したスクリプト「Emission Controller.cs」をベースに下記のようにスクリプトの内容を修正します。
using UnityEngine;
public class EmissionController : MonoBehaviour
{
public Material emissiveMaterial;
public float intensity = 3.0f;
public float intensityChangeRate = 0.1f;
public float hueChangeRate = 0.01f; // 色相の変化率
private float hue = 0.0f; // 初期色相
void Update()
{
// 強度の調整
if (Input.GetKey(KeyCode.UpArrow))
{
intensity += intensityChangeRate;
}
else if (Input.GetKey(KeyCode.DownArrow))
{
intensity -= intensityChangeRate;
if (intensity < 0) intensity = 0;
}
// 色相の変更
if (Input.GetKey(KeyCode.LeftArrow))
{
hue -= hueChangeRate;
if (hue < 0) hue += 1; // 色相が0未満にならないようにする
}
else if (Input.GetKey(KeyCode.RightArrow))
{
hue += hueChangeRate;
if (hue > 1) hue -= 1; // 色相が1を超えないようにする
}
// 現在の色をHSVからRGBに変換
Color activeColor = Color.HSVToRGB(hue, 1f, 1f); // 彩度と明度は最大に設定
// スペースキーで発光のオン/オフ
if (Input.GetKey(KeyCode.Space))
{
Color finalColor = activeColor * Mathf.LinearToGammaSpace(intensity);
emissiveMaterial.SetColor("_EmissionColor", finalColor);
DynamicGI.SetEmissive(GetComponent<Renderer>(), finalColor);
}
else
{
emissiveMaterial.SetColor("_EmissionColor", Color.black);
DynamicGI.SetEmissive(GetComponent<Renderer>(), Color.black);
}
}
}
これで、シーンを再生している時にスペースキーを押すと発光するオブジェクトは、十字キーのいずれかを押すことで発光の強弱や色が変化していくことが確認できました。
ただ、このシーンをよく見ると、キーボードの十字キー入力によってオブジェクトの発光(Emission)の色のみが変更されており、オブジェクトのマテリアル自体の色は変更されていません。(オブジェクトの発光が極端に弱い時、オブジェクト自体の色が白であるため、個人的にちょっと違和感があります。)
マテリアル自体の色が変わるように修正
ということで、キーボードのスペースキーを押した時に、発光(Emission)の色だけでなく、オブジェクトのマテリアル自体の色も変更するようにします。
変更は先ほど使ったスクリプト「Emission Controller.cs」をベースに下記のように修正します。
using UnityEngine;
public class EmissionController : MonoBehaviour
{
public Material emissiveMaterial;
public float intensity = 3.0f;
public float intensityChangeRate = 0.1f;
public float hueChangeRate = 0.01f; // 色相の変化率
private float hue = 0.0f; // 初期色相
void Update()
{
// 強度の調整
if (Input.GetKey(KeyCode.UpArrow))
{
intensity += intensityChangeRate;
}
else if (Input.GetKey(KeyCode.DownArrow))
{
intensity -= intensityChangeRate;
if (intensity < 0) intensity = 0;
}
// 色相の変更
if (Input.GetKey(KeyCode.LeftArrow))
{
hue -= hueChangeRate;
if (hue < 0) hue += 1; // 色相が負の値にならないようにする
}
else if (Input.GetKey(KeyCode.RightArrow))
{
hue += hueChangeRate;
if (hue > 1) hue -= 1; // 色相が1を超えないようにする
}
// HSVからRGBへの変換
Color activeColor = Color.HSVToRGB(hue, 1.0f, 1.0f); // 彩度と明度は最大に設定
// スペースキーで発光のオン/オフ
if (Input.GetKey(KeyCode.Space))
{
Color finalColor = activeColor * Mathf.LinearToGammaSpace(intensity);
emissiveMaterial.SetColor("_EmissionColor", finalColor);
emissiveMaterial.SetColor("_Color", activeColor); // マテリアルの基本色も変更
DynamicGI.SetEmissive(GetComponent<Renderer>(), finalColor);
}
else
{
emissiveMaterial.SetColor("_EmissionColor", Color.black);
emissiveMaterial.SetColor("_Color", Color.white); // マテリアルの基本色を白に戻す
DynamicGI.SetEmissive(GetComponent<Renderer>(), Color.black);
}
}
}
これにより、シーンを再生中にキーボードのスペースキーを押した時、オブジェクトのマテリアル自体の色が変更されました。
発光(Emission)が小さい時は、特にオブジェクト自体の色が変わっているのがしっかり確認できます!
Intensityの数値を修正
ここまでは「PostProcessingVolume」のBloomのIntensityの数値を20にしてシーンを再生してきました。BloomのIntensityの数値が大きければ大きいほど白飛び?してるっぽく見えますね。
そこでBloomのIntensityの数値を5に戻して再度シーンを再生してみようと思います。
結果はこちら↓↓
いかがでしょうか?比べてみると、白っぽくなっていることが分かります。どんなシーンで使いたいかによってIntensityの値を調整する必要がありそうですね。
まとめ
この記事では、Unityでシーンを再生している時にキーボードの十字キーの操作することで発光の強弱や色を変化させる方法を紹介しました。キーボード入力により発光の強弱や色を変えることで、よりダイナミックでインタラクティブなゲームやアプリケーションを作成することが可能です。
コメント