PlayMaker勉強会 第3回 ~ランタイムでマテリアルをいじろう編~
社内のSTYLYシーンクリエイター向けに、PlayMaker勉強会を実施しています!
せっかくなので、資料を公開します!
本記事は、第3回の資料ですが、過去の記事を読んでいなくても問題ありません!
興味があれば、読んでいただけると嬉しいです!
PlayMaker勉強会シリーズ
- PlayMaker勉強会 第1回 ~多対多接続はやめよう編~
- PlayMaker勉強会 第2回 ~大量ファイル処理はArrayでやろう編~
- PlayMaker勉強会 第3回 ~ランタイムでマテリアルをいじろう編~ ← 本記事
ランタイムでマテリアルのパラメーターを変更したい
たとえば、以下のようにユーザーがスライダーを動かしたら、物体の光沢具合が変わるという仕掛けを作りたいとします!
こういうときは、PlayMakerの Set Material Float アクションを使えばいいです!
上記のように、スライダーの値を SetMaterialFloat
でマテリアルの _Metallic
に設定したところ、うまくいきました!
Unityでは動くのにSTYLYでは動かない…
ここまで作ったもの…Unityでは動きますが、実はSTYLYだと動きません!
ためしにSTYLYで動作確認したものがこちらです!
スライダーを動かしているのに、光沢具合が変化しません!
一体なぜでしょう??
Unityでは動く理由
さきほどの処理を確認すると、 SetMaterialFloat
アクションの Material
欄に、マテリアル本体を直に設定しています!
つまり、Unityでは以下のような参照関係になっています。
GameObjectとPlayMaker FSMが同じマテリアルを参照しているので、PlayMakerで直にマテリアルをいじれば、それがそのまま描画に反映されます。
とくに問題はなさそうです…
STYLYでは動かない理由
上記をプレハブにしてSTYLYにアップロードし、それをSTYLYシーンに設置してみたとします。
そのシーンを再生すると、プレハブ1を元にGameObjectやMaterialのインスタンスが生成されます。
しかしこのとき、 PlayMaker FSMの参照しているMaterialは、インスタンスではなくオリジナルのまま なのです!
描画に反映させるためには、MaterialインスタンスをPlayMakerでいじるべきですが、Materialオリジナルの方を参照しているので、いくらいじっても描画に反映されていなかったのでした。
STYLYでも動くようにする
以下のように、 Get Material アクションを使って、Materialインスタンスを変数として取得し、それを SetMaterialFloat
に設定すれば解決します!
STYLYでも無事に動くようになりました!
おまけ: GameObject参照でもいい
実は他にも解決方法があるので、紹介します。
以下のように、 SetMaterialFloat
の Material
欄は None
にして、代わりに対象のGameObjectを GameObject
欄に指定すれば、STYLYでも動きます!
この場合、対象のGameObjectに割り当てられているMaterialインスタンスを自動で見つけてくれるため、正常に動作するんですね!
さいごに
私はSTYLYのエンジニアをやっているのですが、「Unityではマテリアルがランタイムでいじれるのに、STYLYではいじれない!」という問い合わせを、これまでに何度もいただきました。
このままではまずいと思い、本記事に原因や対策をまとめました。
この問題で悩んでいる多くの人のもとに届くよう願いします。
本記事作成にあたり、以下の記事を参考にさせていただきました!
ありがとうございました!
-
プレハブではなくシーンファイルの場合もありますし、内部的にはAssetBundleですが、話を簡単にするためここではプレハブに概念を統一します。 ↩