Unity打包WebGL后 自适应网页分辨率

2024-06-04 5272阅读

使用版本:Unity2022.3.14

效果: 可自适应 ,留白为黑色

视频效果:

2024-03-21-16-46-25-CSDN直播

坑1

top left 无效,无法居中显示游戏内容

原因; position 不能是 static 改为absolute

 

坑2

留白改为黑色

  
    html
    {
      background-color: black;
    }
  

修改步骤

1 自适应代码块('unity-canvas'拼写需要和上发一样 不然无效)

 
      var unityContainer = document.getElementById('unity-canvas');
      function unityContainerResize()
      {
        var w = window.innerWidth || document.body.clientWidth,
                h = window.innerHeight || document.body.clientHeight,
                ratio = 16 / 9,
                r = w/h;
        var setW, setH, setTop, setLeft;
        if (r >= ratio) { // 高度撑满
          setW = h * ratio;
          setLeft = (w - setW) / 2;
        } else { // 宽度撑满
          setH = w / ratio;
          setTop = (h - setH) / 2;
        }
        
        unityContainer.style.width = (setW || w) + 'px';
        unityContainer.style.height = (setH || h) + 'px';
        unityContainer.style.top = (setTop || 0) + 'px';
        unityContainer.style.left = (setLeft || 0) + 'px';
      }
      window.addEventListener('resize', unityContainerResize)
      unityContainerResize()
    

2 修改了positon属性为absolute

 

3 修改默认 留白为留黑

    html
    {
      background-color: black;
    }
  

完整代码

在unity打包后的index.php/tags-522.html" class="superseo">文件夹下面名字是index.html

按照上方修改步骤进行


  
    
    
    Unity WebGL Player | TestWebGL
    
    
    
  
  
    
      
      
        
        
          
        
      
       
    
    
    
      window.addEventListener("load", function () {
        if ("serviceWorker" in navigator) {
          navigator.serviceWorker.register("ServiceWorker.js");
        }
      });
      var container = document.querySelector("#unity-container");
      var canvas = document.querySelector("#unity-canvas");
      var loadingBar = document.querySelector("#unity-loading-bar");
      var progressBarFull = document.querySelector("#unity-progress-bar-full");
      var warningBanner = document.querySelector("#unity-warning");
      // Shows a temporary message banner/ribbon for a few seconds, or
      // a permanent error message on top of the canvas if type=='error'.
      // If type=='warning', a yellow highlight color is used.
      // Modify or remove this function to customize the visually presented
      // way that non-critical warnings and error messages are presented to the
      // user.
      function unityShowBanner(msg, type) {
        function updateBannerVisibility() {
          warningBanner.style.display = warningBanner.children.length ? 'block' : 'none';
        }
        var div = document.createElement('div');
        div.innerHTML = msg;
        warningBanner.appendChild(div);
        if (type == 'error') div.style = 'background: red; padding: 10px;';
        else {
          if (type == 'warning') div.style = 'background: yellow; padding: 10px;';
          setTimeout(function () {
            warningBanner.removeChild(div);
            updateBannerVisibility();
          }, 5000);
        }
        updateBannerVisibility();
      }
      var buildUrl = "Build";
      var loaderUrl = buildUrl + "/TestWebGL.loader.js";
      var config = {
        dataUrl: buildUrl + "/TestWebGL.data",
        frameworkUrl: buildUrl + "/TestWebGL.framework.js",
        codeUrl: buildUrl + "/TestWebGL.wasm",
        streamingAssetsUrl: "StreamingAssets",
        companyName: "DefaultCompany",
        productName: "TestWebGL",
        productVersion: "0.1",
        showBanner: unityShowBanner,
      };
      // By default Unity keeps WebGL canvas render target size matched with
      // the DOM size of the canvas element (scaled by window.devicePixelRatio)
      // Set this to false if you want to decouple this synchronization from
      // happening inside the engine, and you would instead like to size up
      // the canvas DOM size and WebGL render target sizes yourself.
      // config.matchWebGLToCanvasSize = false;
      if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {
        // Mobile device style: fill the whole browser client area with the game canvas:
        var meta = document.createElement('meta');
        meta.name = 'viewport';
        meta.content = 'width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes';
        document.getElementsByTagName('head')[0].appendChild(meta);
      }
      loadingBar.style.display = "block";
      var script = document.createElement("script");
      script.src = loaderUrl;
      script.onload = () => {
        createUnityInstance(canvas, config, (progress) => {
          progressBarFull.style.width = 100 * progress + "%";
        }).then((unityInstance) => {
          loadingBar.style.display = "none";
        }).catch((message) => {
          alert(message);
        });
      };
      document.body.appendChild(script);
    
    
    
      // 自适应代码块
      var unityContainer = document.getElementById('unity-canvas');
      function unityContainerResize()
      {
        var w = window.innerWidth || document.body.clientWidth,
                h = window.innerHeight || document.body.clientHeight,
                ratio = 16 / 9,
                r = w/h;
        var setW, setH, setTop, setLeft;
        if (r >= ratio) { // 高度撑满
          setW = h * ratio;
          setLeft = (w - setW) / 2;
        } else { // 宽度撑满
          setH = w / ratio;
          setTop = (h - setH) / 2;
        }
        
        unityContainer.style.width = (setW || w) + 'px';
        unityContainer.style.height = (setH || h) + 'px';
        unityContainer.style.top = (setTop || 0) + 'px';
        unityContainer.style.left = (setLeft || 0) + 'px';
      }
      window.addEventListener('resize', unityContainerResize)
      unityContainerResize()
    
  
  
  
    html
    {
      background-color: black;
    }
  

声明

代码借鉴的不同帖子的代码非完全原创

仅仅作为记录!


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]