Stories

Detail Return Return

將FGUI的Shader全部預熱後,WebGL平台沒有加載成功 - Stories Detail

1)將FGUI的Shader全部預熱後,WebGL平台沒有加載成功
2)iOS如何確認內存擴展使用生效
3)SpriteAtlasManager.atlasRequested延後一幀回調
4)Unity如何使用Java 17打包


這是第442篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。

UWA社區主頁:community.uwa4d.com
UWA QQ羣:793972859

UI

Q:將FGUI Unity中的Shader全部打包,全部加載預熱後,Shader在WebGL平台沒有加載成功,在WebGL平台FGUI的Shader都沒有顯示加載成功,請問是什麼問題?在編輯器中加載包體預熱,Shader是顯示正常加載的。

A:FGUI添加Shader都是通過Shader.Find操作的,要讓Shader.Find這方法能找到,需要執行以下操作之一:

  1. 從場景中使用的某些材質中引用它;
  2. 將其添加到ProjectSettings/Graphics中的“始終包含的着色器”列表中;
  3. 將着色器或引用它的對象(例如材質)放入“Resources”文件夾中。

感謝題主K了個O@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/689c51b6682c7e5cd61bfaf3


Platform

Q:請問在iOS開發過程中,開啓iOS的應用內存擴展功能後,是如何確認擴展功能生效的?目前我們在開啓打包後進行使用感覺不生效,但是發佈上線對外後又好像生效了。

A:如果是指的是Increased Memory Limit,該功能的生效對蘋果設備和iOS版本都有一定要求。

可參考官網的説法:
An increased memory limit is only available on some device models. Call the os_proc_available_memory function to determine the amount of memory available. Higher memory use can affect system performance.

具體是否生效、效果如何,可能就要看手頭測試機內存加壓測試中閃退閾值的變化;或線上實際閃退率了。

感謝Faust@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/6896bfd4682c7e5cd61bfadd


Editor

Q:實測,觸發SpriteAtlasManager.atlasRequested回調,比加載界面晚了一幀執行,導致會閃一幀白圖。請教有何優化辦法嗎?圖集已勾選Include in build。

A:Unity觸發SpriteAtlasManager.atlasRequested時,AssetBundle系統還沒初始化完畢,導致加載不到圖集,進去後顯示全白塊了。因為我用的是YooAsset插件,這個東西初始化是異步的。只有下次觸發SpriteAtlasManager.atlasRequested,才能再次加載圖集,這可能是加載一個新的SpriteAtlas、或者加載場景時。

解決這個的方法時,在AssetBundle系統還沒初始化時,SpriteAtlasManager.atlasRequested的請求先緩存起來,等初始化結束後再處理。

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;

namespaceGameCore.Unity
{
    //場景一加載就會unity就會觸發atlasRequested,但是這時候AssetBundle系統還沒初始化,無法加載圖集。
    //因此等待AssetBundle初始化後加載。
    //從編輯場景進入遊戲的話,編輯場景裏也掛載這個組件就行了。
    publicclassSpriteAtlasLoader : MonoBehaviour
    {
        //緩存Unity的請求
        privatestatic Dictionary<string, Action<SpriteAtlas>> requestAtlasCallbacks = new();

        private IResManager resManager;

        //AssetBundle系統初始化後, 設置ResManager
        public void SetResManager(IResManager resManager)
        {
            this.resManager = resManager;
            foreach(var kv in requestAtlasCallbacks)
            {
                RequestAtlas(kv.Key, kv.Value);
            }
            requestAtlasCallbacks.Clear();
        }

        private void OnEnable()
        {
            SpriteAtlasManager.atlasRequested += RequestAtlas;
        }

        private void OnDisable()
        {
            SpriteAtlasManager.atlasRequested -= RequestAtlas;
        }

        //AssetBundle系統初始化後,resManager不為null
        protected virtual void RequestAtlas(string atlasName, Action<SpriteAtlas> callback)
        {
            if(resManager != null)
            {
                callback(ResManager.Instance.GetAsset<SpriteAtlas>(atlasName));
            }
            else
            {
                requestAtlasCallbacks.Add(atlasName, callback);
            }
        }
    }
}

因為我有一個專門編輯Prefab的場景,可以直接從這個場景進遊戲,因此單獨做了一個組件,需要的場景裏掛上就行了。

詳情可參考《Unity SpriteAtlasManager.atlasRequested趟坑》。

感謝小澤@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/688757d2244ce21ce9ec08dc


Platform

Q:Unity如何使用Java 17打包,目前設置Java 17後Unity會提示錯誤,如何強制設置Java 17?

A:升級Unity版本或者用Unity導出AndroidStudio工程,在AndroidStudio中使用Java 17出包。

詳情可參考《Unity2022接入Google廣告與支付SDK、導出工程到Android Studio使用JDK17進行打包完整流程與過程中的相關錯誤及處理經驗總結》。

感謝hcg@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/682d72a9682c7e5cd61bfa7d

封面圖來源於網絡


今天的分享就到這裏。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社區願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。

UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:793972859

user avatar xiangjian_659d190d45a7b Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.