Я пытался исправить это в течение нескольких дней, и я не совсем уверен, как.Сначала я создаю AssetBundles, которые имеют префабы и объекты GameObject с текстурами.После создания AssetBundle он загружается на сервер, а в другом приложении для Android я извлекаю его и выгружаю его активы.Все отлично работает на редакторе Unity «Game View», но на телефоне Android текстуры динамических GameObjects выглядят черными.Статические текстуры, такие как текстуры, которые я использую для фона, обычно отображаются в редакторе и на устройстве Android.Черные текстуры - это те, что я извлекаю из AssetBundles.
Когда я искал об этом, я наткнулся на следующие предложения:
- Возможно, это связано со сжатием.Проблема в том, что эти текстуры извлекаются из AssetBundles на сервере динамически.Я не могу «собрать» проект с предложенными настройками после того, как выгрузу их из комплекта.Я попытался автоматически сжать изображения до «Compressed ETC 4 Bits» перед загрузкой их в AssetBundle, но это не решило проблему.https://forum.unity.com/threads/black-textures-on-some-devices-android-versions.195328/
- Я также попытался сделать это вручную, загрузив текстуру (и материал) из AssetBundle и присвоив ее загруженному объекту, но она все еще появляется только в редакторе, а не в телефоне.https://answers.unity.com/questions/238109/problem-with-materials-after-creating-asset-bundle.html
- Я попытался сохранить изображение в виде спрайта перед загрузкой в 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 не отображается.
Поскольку видимой ошибки нет, я не совсем уверен, почемуэта ошибка случается.Любая помощь или предложение, почему это происходит или что я могу сделать, чтобы это исправить?