元のマテリアルがまだ残っていて、何も置き換えられていないということでしょうか? ビルドされた実行可能ファイルで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;
}