1. 程式人生 > >unity webgl自定義啟動進度條動畫

unity webgl自定義啟動進度條動畫

多多少少在unity官網webgl模板看到了Template自定義介紹,今天分享一個超級實用的

新增自定義的模板有兩種方式:

1.在你-----unity安裝位置\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates

在這目錄下建立自定義模板

2.直接在unity的 Assets下建立WebGLTemplates資料夾 再到裡面建立自己的檔案(必須這個資料夾下名字不能打錯)

然後playersettings->Resolution and presentation->webgl Template 就可以看到你自定義的模板了

在這檔案下建立一個index.html檔案和一張你需要的logo圖片

直接看h5程式碼:

unity自帶的:

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | %UNITY_WEB_NAME%</title>
    <link rel="shortcut icon" href="TemplateData/favicon.ico">
    <link rel="stylesheet" href="TemplateData/style.css">
    <script src="TemplateData/UnityProgress.js"></script>  
    <script src="%UNITY_WEBGL_LOADER_URL%"></script>
    <script>
      var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%", {onProgress: UnityProgress});
    </script>
  </head>
  <body>
    <div class="webgl-content">
      <div id="gameContainer" style="width: %UNITY_WIDTH%px; height: %UNITY_HEIGHT%px"></div>
      <div class="footer">
        <div class="webgl-logo"></div>
        <div class="fullscreen" onclick="gameInstance.SetFullscreen(1)"></div>
        <div class="title">%UNITY_WEB_NAME%</div>
      </div>
    </div>
  </body>
</html>

自定的:

<!DOCTYPE html>
<html lang="en-us">

  <head>
    <meta charset="utf-8">
    <title>%UNITY_WEB_NAME%</title>
    <style>
      html {
        box-sizing: border-box;
      }
      *, *:before, *:after {
        box-sizing: inherit;
      }
      body {
        margin: 0;
        background: #444;
      }
      #gameContainer {
        width: 100vw;
        height: 100vh;
      }
      canvas {
        width: 100%;
        height: 100%;
        display: block;
      }

      .logo {
          display: block;
          width: max-width: 80vw;
          height: max-height: 60vh;
      }

      .progress {
          margin: 1.5em;
          border: 1px solid white;
          width: 50vw;
          display: none;
      }
      .progress .full {
          margin: 2px;
          background: white;
          height: 1em;
          transform-origin: top left;
      }

      #loader {
        position: absolute;
        left: 0;
        top: 0;
        width: 100vw;
        height: 100vh;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
      }

      .spinner,
      .spinner:after {
        border-radius: 50%;
        width: 5em;
        height: 5em;
      }
      .spinner {
        margin: 10px;
        font-size: 10px;
        position: relative;
        text-indent: -9999em;
        border-top: 1.1em solid rgba(255, 255, 255, 0.2);
        border-right: 1.1em solid rgba(255, 255, 255, 0.2);
        border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
        border-left: 1.1em solid #ffffff;
        transform: translateZ(0);
        animation: spinner-spin 1.1s infinite linear;
      }
      @keyframes spinner-spin {
        0% {
          transform: rotate(0deg);
        }
        100% {
          transform: rotate(360deg);
        }
      }

    </style>
  </head>

  <body>
    <div id="gameContainer"></div>
    <div id="loader">
      <img class="logo" src="logo.png">
      <div class="spinner"></div>
      <div class="progress"><div class="full"></div></div>
    </div>
  </body>

  <script src="%UNITY_WEBGL_LOADER_URL%"></script>
  <script>
  var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%", {onProgress: UnityProgress});
  function UnityProgress(gameInstance, progress) {
    if (!gameInstance.Module) {
      return;
    }
    const loader = document.querySelector("#loader");
    if (!gameInstance.progress) {
      const progress = document.querySelector("#loader .progress");
      progress.style.display = "block";
      gameInstance.progress = progress.querySelector(".full");
      loader.querySelector(".spinner").style.display = "none";
    }
    gameInstance.progress.style.transform = `scaleX(${progress})`;
    if (progress === 1 && !gameInstance.removeTimeout) {
      gameInstance.removeTimeout = setTimeout(function() {
          loader.style.display = "none";
      }, 2000);
    }
  }
  </script>

</html>

看效果:

 

對應預設模板裡的h5程式碼來修改的, 對比可看出我還自適應螢幕了,好了拿去試試吧

  • %UNITY_WEB_NAME% - 在unity設定下定義的產品名稱
  • %UNITY_HEIGHT% - 來自WebGL解析度和unity設定中的演示的高度
  • %UNITY_WIDTH% - 來自WebGL解析度和unity設定中的簡報的寬度
  • %UNITY_WEBGL_LOADER_GLUE% - 載入構建的程式碼,通常在正文結束標記之前。