bdunderscore / ndmf

MIT License
63 stars 20 forks source link

テスクチャベイク(TexTransTool等)を含む設定で別プラットフォームでmanual bake avatarしたものをアップロードするとアバターが黒色になる #164

Open Narazaka opened 6 months ago

Narazaka commented 6 months ago

PCでmanual bakeするとアセット内にDXT5などでTexture2Dアセットが生成される。 これはTexture2DアセットなのでプラットフォームをAndroidにしたときにASTCに自動でならない。 このためエディタ上では正常に動作したまま、アップロードするとテクスチャが黒色などの状態になると思われる。

挙動は仕方ない雰囲気があるので、なんか警告があると嬉しい気がする(どこに?いつ?問題があるがあまりイメージは出来ていない)。

bdunderscore commented 6 months ago

んー… これはNDMFの管轄外な気がするような?

Narazaka commented 6 months ago

どっちかというとTexTransToolなんですかね(雑にNDMFにテクスチャ参照つっこむとこうなるのかなと思ってたのでNDMFにたてたけど

anatawa12 commented 6 months ago

Bake後にアップロードするときに警告するならNDMFにPlatform Dependantなアセットかどうかを伝えてndmf側で警告してほしい気はします。

kurotu commented 5 months ago

参考までですが、生成したテクスチャをPNGで保存してTextureImporterにいい感じプラットフォーム依存を吸収してもらおうとしても、ビルド完了までPNGをインポートできません。ビルド開始時にNDMF側で AssetDatabase.StartAssetEditing() が呼ばれてインポートが止まっているためです。

現状はPass内でテクスチャを生成する場合はTexture2Dのまま扱う(=プラットフォーム依存な形式に自分で圧縮する)必要がありました。

using nadena.dev.ndmf;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;

[assembly: ExportsPlugin(typeof(TextureTestPlugin))]
public class TextureTestPlugin : Plugin<TextureTestPlugin>
{
    protected override void Configure()
    {
        InPhase(BuildPhase.Resolving).Run("Generate png", (ctx) =>
        {
            var tex = Texture2D.redTexture;
            var png = tex.EncodeToPNG();
            var path = "Assets/TextureTestPlugin.png";
            File.WriteAllBytes(path, png);

            AssetDatabase.Refresh();

            var newTex = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
            Assert.IsNotNull(newTex); // ここで例外
        });
    }
}

一応、Passの開始時に AssetDatabase.StopAssetEditing() を、終了時に AssetDatabase.StartAssetEditing() をそれぞれ呼ぶことでPNGをインポートできましたが、NDMFの内部実装の知識を前提にしてしまうので、プラグインの責務でこれをやるのはできれば避けたい感じです。 (開始時にStop, 終了時にStartを呼ぶという入れ替わりもややこしい)

anatawa12 commented 4 months ago

Related?: #225

kurotu commented 4 months ago

225 での圧縮・保存時にフォーマットをチェックして警告を出すとかはできそうな気がしますね。

アップロードで毎回出ても鬱陶しいと思うのでマニュアルベイクの時だけ出せるといいですが、BuildContextでアップロードとマニュアルベイクの区別ってつくんでしたっけ?