fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】Light の Halo はランタイム操作できない?

【Unity】【C#】Light の Halo はランタイム操作できない?  


 現在 VRMLiveViewer v3.8 に入れるカスタムなライトを実装中…。せっかくなので、Light コンポーネントの細かい機能も操作できるようにしたいと思って、色々調べていたが、どうやらインスペクタにある DrawHalo はスクリプトから操作できないようだ…(プロパティ自体が無い)。

 不思議に思ってググっていたら、なぜか Halo は public な機能ではないらしいね。予め設定したものをビルドして使うだけのものなのか…?

 また、Light 内の DrawHalo ではなく、別コンポーネントの Halo (インスペクタで個別にアタッチするやつ) でオン/オフするコードが出てきた。しかしそれもやはり少し変わっていて、Behaviour クラスを用いて enabled を true/false してるね。まぁ、一応成功したので、コードだけ載せておこう。

(※) Unity 2020.3.34f1 / Windows11(x64) で確認

●アタッチした Halo コンポーネントをオン/オフするコード
using System;
using UnityEngine;

public static partial class Extensions //※クラス名は任意
{
public static void SetEnableHalo(this Light light, bool isOn)
{
if (light == null)
return;

var halo = (Behaviour)light.gameObject.GetComponent("Halo"); //Behaviour 型
//var halo = light.gameObject.GetComponent("Halo"); //Component 型
if (halo != null)
{
halo.enabled = isOn; //Behaviour 型
//halo.GetType().GetProperty("enabled")?.SetValue(halo, isOn, null); //Component 型
}
}
}

●スクリプトからの使用例
using UnityEngine;

public class SetEnableHaloTest : MonoBehaviour
{
public Light _light; //インスペクタでアタッチしておく

//Button の OnClick 等からコールバックする
public void HaloOnClick()
{
_light.SetEnableHalo(true);
}

//Button の OnClick 等からコールバックする
public void HaloOffClick()
{
_light.SetEnableHalo(false);
}
}

 SetEnableHalo 内ではコメントアウトで Component 型のコードも書いてあるが、どちらでもいけるようだ。ただこれはインスペクタで予め Halo コンポーネントを追加しておくか、コードで AddComponent("Halo") しなければならない。型指定にはジェネリック型 <Halo> は使えないようだ。GetComponent も同じ。なぜか名前(文字列)でしか指定できないらしい。以下の参考資料(UnityCsReference)に「internal sealed partial class Halo : Behaviour」となっているので(public ではないので)、そのせいか?

(参考資料)
UnityCsReference/Runtime/Export/GraphicsComponents.bindings.cs
Getting the Halo property of a point light in Unity
How can I change the value of 'Draw Halo' inside Point Light - Unity3D
Enable Draw Halo in Light Component via Script



 結局、オン/オフはできても色や距離の変更はできないので(やはり public なプロパティが無いので)、実装自体をやめた。また、リフレクションでプライベートメンバーを取得するような方法もググってたら出てきたが、そもそも public でない時点でランタイム動作は保証されないので、使わない方が良い気がする。

 また同じ様な効果なら、Volumetric Light の方が綺麗だったしね。無理矢理やろうと思えば、予めビルドにオンとオフの2つの状態を別GameObjectにアタッチしておき、切り替える方法もあるが、それなら Light の DrawHalo でやった方が良いか気がする(Color と Range が自動的に連動するので)。ただそれほど有用でもないし、使い勝手も悪いので(コードが無駄に複雑になるので)、Halo 自体のランタイム操作は諦めた方が良いかな…。



(関連記事)
【Unity】Standard Assets の Flare (レンズフレア) は Gamma 用だった?
【Unity】【C#】指定ワールド位置がカメラに映っているか調べる
【Unity】【C#】ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  Unityライブラリ  グラフィックス 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/432-db5750d8
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop