Текстуры Unity Assetbundle выглядят черными - PullRequest
0 голосов
/ 10 июня 2018

Я пытался исправить это в течение нескольких дней, и я не совсем уверен, как.Сначала я создаю AssetBundles, которые имеют префабы и объекты GameObject с текстурами.После создания AssetBundle он загружается на сервер, а в другом приложении для Android я извлекаю его и выгружаю его активы.Все отлично работает на редакторе Unity «Game View», но на телефоне Android текстуры динамических GameObjects выглядят черными.Статические текстуры, такие как текстуры, которые я использую для фона, обычно отображаются в редакторе и на устройстве Android.Черные текстуры - это те, что я извлекаю из AssetBundles.

Когда я искал об этом, я наткнулся на следующие предложения:

  1. Возможно, это связано со сжатием.Проблема в том, что эти текстуры извлекаются из AssetBundles на сервере динамически.Я не могу «собрать» проект с предложенными настройками после того, как выгрузу их из комплекта.Я попытался автоматически сжать изображения до «Compressed ETC 4 Bits» перед загрузкой их в AssetBundle, но это не решило проблему.https://forum.unity.com/threads/black-textures-on-some-devices-android-versions.195328/
  2. Я также попытался сделать это вручную, загрузив текстуру (и материал) из AssetBundle и присвоив ее загруженному объекту, но она все еще появляется только в редакторе, а не в телефоне.https://answers.unity.com/questions/238109/problem-with-materials-after-creating-asset-bundle.html
  3. Я попытался сохранить изображение в виде спрайта перед загрузкой в ​​AssetBundle.И в приложении я попытался создать новую текстуру с этим спрайтом, но этот подход также не сработал.https://answers.unity.com/questions/651984/convert-sprite-image-to-texture.html

Сначала я перетаскиваю изображение для текстуры, и оно автоматически сжимается с помощью этой функции:

// Automatically Compress all imported textures to the project to ETC_RGBA
void OnPreprocessTexture(Texture2D t)
{
    EditorUtility.CompressTexture(t, TextureFormat.ETC_RGBA8_3DS, TextureCompressionQuality.Normal);
}

Затем я вручную добавляю текстуру в 3D GameObject.в редакторе и создайте префаб и добавьте к нему тот GameObject.Я добавляю сам сборный материал, материал и изображение в AssetBundle и делаю это для экспорта AssetBundle: (Теперь AssetBundle содержит всего 3 ресурса. Я загружаю его на сервер)

//Creates a new menu (Build Asset Bundles) and item (Normal) in the Editor
[MenuItem("Assets/Build Asset Bundles/Normal")]
static void BuildABsNone()
{
    BuildPipeline.BuildAssetBundles("Assets/AssetBundle", BuildAssetBundleOptions.None, BuildTarget.Android);
}

ВВ приложении я динамически загружаю AssetBundle с сервера и хочу показать его поверх ImageTarget с помощью Vuforia.Это часть функции IEnumerator DownloadAndCache () в классе CloudHandler, которая загружает материальный актив и создает экземпляр GameObject "mBundleInstance".Затем я отображаю «mBundleInstance» на целевом изображении:

            bundle = www.assetBundle;

            var materials = bundle.LoadAllAssets(typeof(Material));
            containsMaterial = (materials.Length > 0);

            if (AssetName == "")
            {
                mBundleInstance = Instantiate(getMainAsset(bundle)) as GameObject;
            }
            else
            { 
                mBundleInstance = Instantiate(bundle.LoadAsset(AssetName, typeof(GameObject))) as GameObject;
            }
            Debug.Log(mBundleInstance.GetComponent<Renderer>().material.mainTexture.name);
            //returns the correct name of the compressed png image
            if (containsMaterial)
            {
                foreach (Material m in materials)
                {
                    var shaderName = "Standard";
                    var newShader = Shader.Find(shaderName);

                    if (newShader != null)
                    {
                        m.shader = newShader;

                        mBundleInstance.GetComponent<Renderer>().material = m;
                        Debug.Log("actual texture name: " + mBundleInstance.GetComponent<Renderer>().material.mainTexture.name);
                        //returns the correct name of the png image
                    }
                    else
                    {
                        Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + m.name);
                    }
                 }
              }

Вот как это выглядит в GameView редактора: Появляется текстура GameObject: (изображение King of Diamonds)

И вот как это выглядит на устройстве Android: Текстура Gameobject не отображается.

Поскольку видимой ошибки нет, я не совсем уверен, почемуэта ошибка случается.Любая помощь или предложение, почему это происходит или что я могу сделать, чтобы это исправить?

...