kenjizenki

お世話になっています。

UnityにてSkeletonRendererCustomMaterialsを使っています。
Unityエディター上では正常にマテリアルの置換が行われるのですが、ゲームをビルド後にマテリアルの置き換えが行われないようです。

こちら原因などわかりますでしょうか。
また、意図的にエディタ上でしか動かないようにしているようでしたら何を懸念してそういった処理をしているのかと、他のスクリプトでも同様に「実はビルド後に動かない」スクリプトがあるのかも教えていただけると幸いです。
アバター
kenjizenki
  • 記事: 85

Harald

元のマテリアルがまだ残っていて、何も置き換えられていないということでしょうか? ビルドされた実行可能ファイルでSkeletonRendererCustomMaterialsコンポーネントが機能しない明確な理由は分かりません。しかしビルドで何かがうまくいかない場合に最初に考えられる原因は、シェーダーまたはマテリアルが、アセットバンドルまたはダウンロードされていない同様のダウンロードリソースの一部であるということです。 もう 1 つ考えられるのは、シェーダーがシーンから直接参照されていない場合に Project Settings の "Always included shaders" リストに含まれていないことです。 問題が起きているのはメインマテリアル(置き換えられる方) ですか? それともアセットバンドル、または同様のものの一部になっている置換マテリアルですか?

上記のいずれも問題解決の参考にならない場合は、この問題を実演できる最小限のUnityプロジェクトをzipパッケージとして contact@esotericsoftware.com に送信していただけますか? (前後の流れがわかるように、このフォーラム スレッドのURLをいつものように簡単に言及してください。) そうしていただいたらこちらで確認することができます。
-----
I assume that you see the original material still and nothing being replaced, right? We know of no obvious reason why the SkeletonRendererCustomMaterials component would not work in the built executable. The first guess when something is not working in a build is when shaders or materials are part of an asset bundle or a similar downloaded resource which is not downloaded. Another guess is that a shader is not included in the "Always included shaders" list in Project Settings when there is no direct reference to it from your scenes. Is the main material (the one that shall be replaced) or the replacement material part of an asset bundle or similar?

If none of the above helps resolve the issue, could you please send us a minimal Unity project that still demonstrates this issue as a zip package to contact@esotericsoftware.com (briefly mentioning this forum thread URL as usual, so that we know the context)? Then we can have a look at it.

========

この問題は、Addressablesからロードされたときのマテリアルアセット参照が等しくないことに基づいています。 実際、Unityエディター内であっても、Adressable Groups の設定を Use Asset Database (fastest) の代わりに Play Mode Script - Use Existing Build に設定すると機能しません。

SkeletonRendererCustomMaterials コンポーネントを含む (Addressablesからロードされていない) シーンに、置換されるアセット 01Slime_Material への直接参照が含まれているようですが、問題は、マテリアル 01Slime_Material は残念ながらコードによってAddressablesからロードされていることです。
Addressables.LoadAssetsAsync<SkeletonDataAsset>("Test",..)
は別のオブジェクトであり、参照と material.GetHashCode() でさえ等しくありません。 これらのマテリアルは等しくないものとして扱われるため、何も置き換えられません。

Addressablesとシーンの分離をそのまま維持したい場合、考えられる最も簡単な解決策は、以下のように最初のマテリアル (またはN個のマテリアル) を置き換えるだけの SkeletonRendererCustomMaterials 置換用の独自のスクリプトを作成することです:
public Material replacementMaterial;
...
void OnEnable() {
Material srcMaterial = Anim.skeletonDataAsset.atlasAssets[0].PrimaryMaterial;
Anim.CustomMaterialOverride[srcMaterial] = replacementMaterial;
}
-----

The problem is based on unequal Material asset references when loaded from addressables. In fact it's not working in the Unity Editor either with the Adressable Groups setting Play Mode Script - Use Existing Build instead of Use Asset Database (fastest).

The problem unfortunately seems to be that the scene (not loaded from an addressable) with the SkeletonRendererCustomMaterials component contains a direct reference to the asset 01Slime_Material which shall be replaced, but the material 01Slime_Material loaded from adressables via code
Addressables.LoadAssetsAsync<SkeletonDataAsset>("Test",..)
is a different object, where references and even material.GetHashCode() are not equal. Since these materials are then treated as not equal, nothing is replaced.

If you want to keep the separation of addressables and scenes as is, potentially the easiest solution would be to create your own script replacing SkeletonRendererCustomMaterials which just replaces the first material (or N materials) roughly as follows:
public Material replacementMaterial;
...
void OnEnable() {
Material srcMaterial = Anim.skeletonDataAsset.atlasAssets[0].PrimaryMaterial;
Anim.CustomMaterialOverride[srcMaterial] = replacementMaterial;
}
アバター
Harald

Harri
  • 記事: 4451

kenjizenki

Thank you very much.
Using Addressables seems to be too complicated, so I will look for another way.
Thank you very much for your help.

ありがとうございます。
Addressablesを使うと複雑になりそうなので、別の方法を探したいと思います。
たすかりました、ありがとうございました。
アバター
kenjizenki
  • 記事: 85

Harald

お役に立てたようで良かったです。ご返信いただきありがとうございました。
Glad to hear it helped, thanks for getting back to us.
アバター
Harald

Harri
  • 記事: 4451


Return to 日本のSpine ユーザー