LoginSignup
2
1

PlayMaker勉強会 第3回 ~ランタイムでマテリアルをいじろう編~

Posted at

PlayMaker勉強会 第3回 ~ランタイムでマテリアルをいじろう編~

社内のSTYLYシーンクリエイター向けに、PlayMaker勉強会を実施しています!
せっかくなので、資料を公開します!

本記事は、第3回の資料ですが、過去の記事を読んでいなくても問題ありません!
興味があれば、読んでいただけると嬉しいです!

PlayMaker勉強会シリーズ

ランタイムでマテリアルのパラメーターを変更したい

たとえば、以下のようにユーザーがスライダーを動かしたら、物体の光沢具合が変わるという仕掛けを作りたいとします!

correct.gif

こういうときは、PlayMakerの Set Material Float アクションを使えばいいです!

SetMaterialFloat

上記のように、スライダーの値を SetMaterialFloat でマテリアルの _Metallic に設定したところ、うまくいきました!

Unityでは動くのにSTYLYでは動かない…

ここまで作ったもの…Unityでは動きますが、実はSTYLYだと動きません!

ためしにSTYLYで動作確認したものがこちらです!

wrong.gif

スライダーを動かしているのに、光沢具合が変化しません!

一体なぜでしょう??

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 に設定すれば解決します!

GetMaterial

STYLYでも無事に動くようになりました!

correct.gif

おまけ: GameObject参照でもいい

実は他にも解決方法があるので、紹介します。

以下のように、 SetMaterialFloatMaterial 欄は None にして、代わりに対象のGameObjectを GameObject 欄に指定すれば、STYLYでも動きます!

GameObject参照

この場合、対象のGameObjectに割り当てられているMaterialインスタンスを自動で見つけてくれるため、正常に動作するんですね!

さいごに

私はSTYLYのエンジニアをやっているのですが、「Unityではマテリアルがランタイムでいじれるのに、STYLYではいじれない!」という問い合わせを、これまでに何度もいただきました。

このままではまずいと思い、本記事に原因や対策をまとめました。

この問題で悩んでいる多くの人のもとに届くよう願いします。

本記事作成にあたり、以下の記事を参考にさせていただきました!
ありがとうございました!

  1. プレハブではなくシーンファイルの場合もありますし、内部的にはAssetBundleですが、話を簡単にするためここではプレハブに概念を統一します。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1