"Unity WebGL" paleidimas su "ASP.NET Core".

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Vizualinė studija
  • "Visual Studio 2022"
ASP.NET branduolys
  • ASP.NET branduolys 6.0
Informacinės interneto paslaugos (IIS)
  • IIS 10.0

Iš pradžių

Sužinokite, kaip paleisti žaidimo išvestį kaip "WebGL" sistemoje "Unity" žiniatinklio serveryje ASP.NET kuriame veikia "Core". Žaidimų programoms naudokite tuos, kurie pateikiami toliau pateiktuose patarimų veiksmuose. Žaidimo pavyzdyje naudojamas "2D Platformer Microgame", kurį galima sukurti iš "Unity Hub".

Paaiškinsiu, kaip nustatyti "Uncompressed WebGL", "WebGL compressed with Gzip" ir "WebGL compressed with Brotli", kad paleistumėte "WebGL" žaidimus. Procedūra yra vienoda visiems jiems.

Naudojame "Visual Studio 2022" ASP.NET "Core 6.0", bet senesnės versijos tikriausiai veiks. Tačiau kiekvienos versijos pradinio kodo struktūra skiriasi, todėl patys supraskite skirtumus.

ASP.NET pagrindinio projekto kūrimas

Paleiskite "Visual Studio 2022" iš pradžios meniu.

Pasirinkite Kurti naują projektą.

Šį kartą kaip pavyzdį pasirinkite "ASP.NET Core Web App". Jei naudojate "ASP.NET Core", galite paleisti kitus šablonus, bet turėsite vadovautis kiekvienu šablonu, kaip jį sukurti.

Savavališkai nustatykite projekto pavadinimą ir vietą.

Palikite papildomą informaciją tokią, kokia yra.

Projektas buvo sukurtas.

Paleiskite nesuspaustą "WebGL"

Paruoškite "WebGL" programą, sukurtą be suspaudimo.

Įsitikinkite, kad žaidimas veikia greitai

ASP.NET Pabandykite paleisti "WebGL" žaidimą su mažiau nustatymų, nesilaikydami pagrindinio etiketo.

"ASP.NET Core" negalite pasiekti kai kurių "Unity" skleidžiamų "WebGL" failų numatytojoje būsenoje. Padarykite tai prieinamą.

Programa.cs

Atidarykite iš savo Program.cs projekto. Taikoma ankstesnėms ASP.NET pagrindinėms versijoms Startup.cs .

Kodo viršuje pridėkite vardų sritį ir kode app.UseStaticFiles(); pakeiskite šiuos dalykus:

// ここから追加
using Microsoft.AspNetCore.StaticFiles;
// ここまで追加

var builder = WebApplication.CreateBuilder(args);

// --- 省略 ---

app.UseHttpsRedirection();

//app.UseStaticFiles();
// ここから追加
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".data"] = "application/octet-stream";
provider.Mappings[".wasm"] = "application/wasm";

app.UseStaticFiles(new StaticFileOptions()
{
  ContentTypeProvider = provider,
});
// ここまで追加

app.UseRouting();

// --- 省略 ---

.data, kad pasiekus failą, .wasm jį būtų galima grąžinti klientui su nurodytu Content-Type .

"WebGL" diegimas

Į savo projektą wwwroot įdėkite šiuos failų aplankus iš Unity .

  • indeksas.html
  • Pastatyti
  • TemplateData

Index.cshtmlindex.html Atidarykite nuorodą, kad galėtumėte ją pasiekti.

<!-- 省略 -->

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<!-- 追加 -->
<a href="index.html">index.html</a>

Paleiskite programą ir įsitikinkite, kad žaidimas veikia.

"WebGL" programos paleidimas "Razor" puslapyje

Ankstesnis žaidimas veikė statiniame HTML faile, todėl jis veikia vietoje, kuri neturi nieko bendra su ASP.NET Core". Tai nėra labai pageidautina programos vienodumui, todėl HTML failo elgesį perkelsime į "Razor Pages".

Dešiniuoju pelės mygtuku spustelėkite projekto aplanką Puslapiai, kad įtrauktumėte naują elementą.

Pasirinkite Skustuvo puslapis - tuščias. Konkretus pavadinimas nenurodytas, tačiau jis pridedamas čia WebGL.cshtml .

Rodomas kodas.

index.html Žiūrėkite failo turinį ir prievadą į WebGL.cshtml . link Yra keletas keistų dalykų, pavyzdžiui, kaip įdėti žymą, bet aš paliksiu ją tokią, kokia yra, kad paaiškinčiau paprastumą.

@page
@model UnityPublishWebglAspNetCore.Pages.WebGLModel
@{
}

<div id="unity-container" class="unity-desktop">
  <canvas id="unity-canvas" width=960 height=600></canvas>
  <div id="unity-loading-bar">
    <div id="unity-logo"></div>
    <div id="unity-progress-bar-empty">
      <div id="unity-progress-bar-full"></div>
    </div>
  </div>
  <div id="unity-warning"> </div>
  <div id="unity-footer">
    <div id="unity-webgl-logo"></div>
    <div id="unity-fullscreen-button"></div>
    <div id="unity-build-title">Platformer</div>
  </div>
</div>

@section Scripts {
  <link rel="shortcut icon" href="TemplateData/favicon.ico">
  <link rel="stylesheet" href="TemplateData/style.css">
  <script>
    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 fullscreenButton = document.querySelector("#unity-fullscreen-button");
    var warningBanner = document.querySelector("#unity-warning");

    // 一時的なメッセージバナー/リボンを数秒間表示するか、
    // type == 'error'の場合はキャンバスの上部に永続的なエラーメッセージを表示します。
    // type == 'warning'の場合、黄色のハイライト色が使用されます。
    // この関数を変更または削除して、重要ではない警告とエラーメッセージがユーザーに表示されるように
    // 視覚的に表示される方法をカスタマイズします。
    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 + "/WebGL.loader.js";
    var config = {
      dataUrl: buildUrl + "/WebGL.data",
      frameworkUrl: buildUrl + "/WebGL.framework.js",
      codeUrl: buildUrl + "/WebGL.wasm",
      streamingAssetsUrl: "StreamingAssets",
      companyName: "DefaultCompany",
      productName: "Platformer",
      productVersion: "2.1.0",
      showBanner: unityShowBanner,
    };

    // デフォルトでは、Unity は WebGL キャンバスレンダリングのターゲットサイズを
    // キャンバス要素の DOM サイズ(window.devicePixelRatio でスケーリング)と一致させます。
    // この同期がエンジン内で発生しないようにする場合は、これを false に設定し、
    // 代わりにサイズを大きくします。 キャンバスの DOM サイズと WebGL は、
    // ターゲットサイズを自分でレンダリングします。
    // config.matchWebGLToCanvasSize = false;

    if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {
      container.className = "unity-mobile";
      // モバイルデバイスでフィルレートのパフォーマンスを低下させないようにし、
      // モバイルブラウザで低 DPI モードをデフォルト/オーバーライドします。
      config.devicePixelRatio = 1;
      unityShowBanner('WebGL builds are not supported on mobile devices.');
    } else {
      canvas.style.width = "960px";
      canvas.style.height = "600px";
    }
    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";
        fullscreenButton.onclick = () => {
          unityInstance.SetFullscreen(1);
        };
      }).catch((message) => {
        alert(message);
      });
    };
    document.body.appendChild(script);
  </script>
}

Index.cshtmlWebGL Įtraukite saitą į .

<!-- 省略 -->

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<!-- 追加 -->
<ul>
  <li><a href="index.html">index.html</a></li>
  <li><a href="WebGL">WebGL</a></li>
</ul>

Pabandykite paleisti programą. Matote, kad antraštė ir poraštė _Layout.cshtml rodomos "WebGL" puslapyje pagal .

Pakeiskite "WebGL" failų vietą

"WebGL" failą įdėjau tiesiai į , bet šis metodas jį perrašys, kai įdėsite du ar daugiau "WebGL wwwroot " failų. Paaiškinsiu, kaip tai sudėti į atskirus aplankus ir perkelti.

Pirmiausia sukurkite naują aplanką pavadinimu "webgl" ir perkelkite jį ten. Du aplankai, kuriuos reikia perkelti, yra , BuildTemplateData . index.html Jau perkėliau jį į "Razor Pages" ir galiu saugiai ištrinti.

Kadangi WebGL.cshtml pagilinome aplankų hierarchiją, taip pat pagilinsime kelią, aprašytą . Korekcija yra 3 eilutės.

Prieš korekciją

<link rel="shortcut icon" href="TemplateData/favicon.ico">
<link rel="stylesheet" href="TemplateData/style.css">
    var buildUrl = "Build";

Po korekcijos

<link rel="shortcut icon" href="webgl/TemplateData/favicon.ico">
<link rel="stylesheet" href="webgl/TemplateData/style.css">
    var buildUrl = "webgl/Build";

Paleiskite programą, kad pamatytumėte, ar ji veikia tinkamai.

Veikia "WebGL", suglaudintas naudojant "Gzip".

"Gzip" suspausto failo plėtinys yra , ir tai yra .gz failas, kurį gali tvarkyti "ASP.NET Core", "Unity WebGL Content-Type " ir yra tvarkomi skirtingai ir reikalauja konversijos.

Pirmiausia sukurkite "WebGL" failo diegimą ir puslapį.

"WebGL" failų išdėstymas

wwwrootwebgl-gzip Sukurkite aplanką "Gzip" ir nukopijuokite aplanką "" iš "WebGL" failoBuildTemplateData, kurį sukūrėte naudodami "Gzip".

Sukurkite skustuvo puslapį

Šį kartą WebGLGzip.cshtml sukurkite failą naudodami tą pačią procedūrą, kaip ir išsklaudinus.

Kodas yra toks, atsižvelgiant į "Output in index.html Unity". Kelias atitinka aplanką, kurį anksčiau sukūrėte webgl-gzip "WebGL" failams.

@page
@model UnityPublishWebglAspNetCore.Pages.WebGLGzipModel
@{
}

<div id="unity-container" class="unity-desktop">
  <canvas id="unity-canvas" width=960 height=600></canvas>
  <div id="unity-loading-bar">
    <div id="unity-logo"></div>
    <div id="unity-progress-bar-empty">
      <div id="unity-progress-bar-full"></div>
    </div>
  </div>
  <div id="unity-warning"> </div>
  <div id="unity-footer">
    <div id="unity-webgl-logo"></div>
    <div id="unity-fullscreen-button"></div>
    <div id="unity-build-title">Platformer</div>
  </div>
</div>

@section Scripts {
  <link rel="shortcut icon" href="webgl-gzip/TemplateData/favicon.ico">
  <link rel="stylesheet" href="webgl-gzip/TemplateData/style.css">
  <script>
    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 fullscreenButton = document.querySelector("#unity-fullscreen-button");
    var warningBanner = document.querySelector("#unity-warning");

    // 一時的なメッセージバナー/リボンを数秒間表示するか、
    // type == 'error'の場合はキャンバスの上部に永続的なエラーメッセージを表示します。
    // type == 'warning'の場合、黄色のハイライト色が使用されます。
    // この関数を変更または削除して、重要ではない警告とエラーメッセージがユーザーに表示されるように
    // 視覚的に表示される方法をカスタマイズします。
    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 = "webgl-gzip/Build";
    var loaderUrl = buildUrl + "/WebGL_Gzip.loader.js";
    var config = {
      dataUrl: buildUrl + "/WebGL_Gzip.data.gz",
      frameworkUrl: buildUrl + "/WebGL_Gzip.framework.js.gz",
      codeUrl: buildUrl + "/WebGL_Gzip.wasm.gz",
      streamingAssetsUrl: "StreamingAssets",
      companyName: "DefaultCompany",
      productName: "Platformer",
      productVersion: "2.1.0",
      showBanner: unityShowBanner,
    };

    // デフォルトでは、Unity は WebGL キャンバスレンダリングのターゲットサイズを
    // キャンバス要素の DOM サイズ(window.devicePixelRatio でスケーリング)と一致させます。
    // この同期がエンジン内で発生しないようにする場合は、これを false に設定し、
    // 代わりにサイズを大きくします。 キャンバスの DOM サイズと WebGL は、
    // ターゲットサイズを自分でレンダリングします。
    // config.matchWebGLToCanvasSize = false;

    if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {
      container.className = "unity-mobile";
      // モバイルデバイスでフィルレートのパフォーマンスを低下させないようにし、
      // モバイルブラウザで低 DPI モードをデフォルト/オーバーライドします。
      config.devicePixelRatio = 1;
      unityShowBanner('WebGL builds are not supported on mobile devices.');
    } else {
      canvas.style.width = "960px";
      canvas.style.height = "600px";
    }
    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";
        fullscreenButton.onclick = () => {
          unityInstance.SetFullscreen(1);
        };
      }).catch((message) => {
        alert(message);
      });
    };
    document.body.appendChild(script);
  </script>
}

Modifikuoti, kad būtų galima pereiti į Index.cshtml šį puslapį.

<!-- 省略 -->

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<!-- 追加 -->
<ul>
  <li><a href="index.html">index.html</a></li>
  <li><a href="WebGL">WebGL</a></li>
  <li><a href="WebGLGzip">WebGLGzip</a></li>
</ul>

Tvirtinimo programa.cs

app.UseStaticFiles Modifikuokite dalį, kuri apdoroja metodą, taip, kaip nurodyta toliau.

Prieš korekciją

// ここから追加
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".data"] = "application/octet-stream";
provider.Mappings[".wasm"] = "application/wasm";

app.UseStaticFiles(new StaticFileOptions()
{
  ContentTypeProvider = provider,
});
// ここまで追加

Po korekcijos

// ここから追加
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".data"] = "application/octet-stream";
provider.Mappings[".wasm"] = "application/wasm";
provider.Mappings[".br"] = "application/octet-stream";   // .br ファイルにアクセスできるように追加
provider.Mappings[".js"] = "application/javascript";     // 後の変換の為に追加

app.UseStaticFiles(new StaticFileOptions()
{
  ContentTypeProvider = provider,
  OnPrepareResponse = context =>
  {
    var path = context.Context.Request.Path.Value;
    var extension = Path.GetExtension(path);

    // 「.gz」「.br」ファイルにアクセスした場合は Content-Type と Content-Encoding を設定する
    if (extension == ".gz" || extension == ".br")
    {
      var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(path) ?? "";
      if (provider.TryGetContentType(fileNameWithoutExtension, out string? contentType))
      {
        context.Context.Response.ContentType = contentType;
        context.Context.Response.Headers.Add("Content-Encoding", extension == ".gz" ? "gzip" : "br");
      }
    }
  },
});
// ここまで追加

"ASP.NET Core .gz " failas Content-Type application/x-gzip grįžta su . Kaip yra, "Unity WebGL" kliente negali to nustatyti, todėl .gz perrašau ir grąžinu jį pagal Content-Type failo plėtinį, kuris neįtraukia . Content-Encoding Aš taip pat jį nustatiau, nes tai gzip būtina.

Beje, aš taip pat sudėjau Brotli kodą, kad galėtumėte naudoti šį kodą taip, kaip jis yra kito elemento Brotli korespondencijoje. Brotli taip pat .br nustato perrašymą Content-Encoding br, kad atitiktų Content-Type failo plėtinį be . Tačiau failas pagal numatytuosius nustatymus nepasiekiamas "ASP.NET Core",.br todėl provider.Mappings pridėjau jį su .br .

Po to paleiskite derinimą ir patikrinkite, ar žaidimas veikia tinkamai.

Jei teisingai nustatėte ir žaidimas vis tiek nebus rodomas, pabandykite išvalyti žiniatinklio naršyklės talpyklą, kad išvalytumėte slapukus.

Veikia "WebGL", suglaudintas naudojant "Brotli".

Procedūra yra beveik tokia pati kaip "Gzip", pakeičiant "Gzip" dalį "Brotli". Tačiau "Brotli" (.br) failai pagal numatytuosius nustatymus nepasiekiami "ASP.NET Core". Turite jį sukonfigūruoti taip, kad galėtumėte jį pasiekti, bet jei kodą naudojate "Gzip" metu, jis palaikomas.

Pirmiausia sukurkite "WebGL" failo diegimą ir puslapį.

"WebGL" failų išdėstymas

wwwrootwebgl-brotli Dalyje Kurti aplanką nukopijuokite aplanką "" iš "WebGL" failoBuildTemplateData, kurį sukūrėte naudodami "Brotli".

Sukurkite skustuvo puslapį

Sukurkite failą atlikdami WebGLBrotli.cshtml tuos pačius veiksmus kaip ir "Gzip".

Kodas yra toks, atsižvelgiant į "Output in index.html Unity". Kelias atitinka aplanką, kurį anksčiau sukūrėte webgl-brotli "WebGL" failams.

@page
@model UnityPublishWebglAspNetCore.Pages.WebGLBrotliModel
@{
}

<div id="unity-container" class="unity-desktop">
  <canvas id="unity-canvas" width=960 height=600></canvas>
  <div id="unity-loading-bar">
    <div id="unity-logo"></div>
    <div id="unity-progress-bar-empty">
      <div id="unity-progress-bar-full"></div>
    </div>
  </div>
  <div id="unity-warning"> </div>
  <div id="unity-footer">
    <div id="unity-webgl-logo"></div>
    <div id="unity-fullscreen-button"></div>
    <div id="unity-build-title">Platformer</div>
  </div>
</div>

@section Scripts {
  <link rel="shortcut icon" href="webgl-brotli/TemplateData/favicon.ico">
  <link rel="stylesheet" href="webgl-brotli/TemplateData/style.css">
  <script>
    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 fullscreenButton = document.querySelector("#unity-fullscreen-button");
    var warningBanner = document.querySelector("#unity-warning");

    // 一時的なメッセージバナー/リボンを数秒間表示するか、
    // type == 'error'の場合はキャンバスの上部に永続的なエラーメッセージを表示します。
    // type == 'warning'の場合、黄色のハイライト色が使用されます。
    // この関数を変更または削除して、重要ではない警告とエラーメッセージがユーザーに表示されるように
    // 視覚的に表示される方法をカスタマイズします。
    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 = "webgl-brotli/Build";
    var loaderUrl = buildUrl + "/WebGL_Brotli.loader.js";
    var config = {
      dataUrl: buildUrl + "/WebGL_Brotli.data.br",
      frameworkUrl: buildUrl + "/WebGL_Brotli.framework.js.br",
      codeUrl: buildUrl + "/WebGL_Brotli.wasm.br",
      streamingAssetsUrl: "StreamingAssets",
      companyName: "DefaultCompany",
      productName: "Platformer",
      productVersion: "2.1.0",
      showBanner: unityShowBanner,
    };

    // デフォルトでは、Unity は WebGL キャンバスレンダリングのターゲットサイズを
    // キャンバス要素の DOM サイズ(window.devicePixelRatio でスケーリング)と一致させます。
    // この同期がエンジン内で発生しないようにする場合は、これを false に設定し、
    // 代わりにサイズを大きくします。 キャンバスの DOM サイズと WebGL は、
    // ターゲットサイズを自分でレンダリングします。
    // config.matchWebGLToCanvasSize = false;

    if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {
      container.className = "unity-mobile";
      // モバイルデバイスでフィルレートのパフォーマンスを低下させないようにし、
      // モバイルブラウザで低 DPI モードをデフォルト/オーバーライドします。
      config.devicePixelRatio = 1;
      unityShowBanner('WebGL builds are not supported on mobile devices.');
    } else {
      canvas.style.width = "960px";
      canvas.style.height = "600px";
    }
    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";
        fullscreenButton.onclick = () => {
          unityInstance.SetFullscreen(1);
        };
      }).catch((message) => {
        alert(message);
      });
    };
    document.body.appendChild(script);
  </script>
}

Modifikuoti, kad būtų galima pereiti į Index.cshtml šį puslapį.

<!-- 省略 -->

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<!-- 追加 -->
<ul>
  <li><a href="index.html">index.html</a></li>
  <li><a href="WebGL">WebGL</a></li>
  <li><a href="WebGLGzip">WebGLGzip</a></li>
  <li><a href="WebGLBrotli">WebGLBrotli</a></li>
</ul>

Tvirtinimo programa.cs

Jei pakeisite jį, kai palaikomas "Gzip", galite naudoti tą patį kodą.

Ištaisę jį, paleiskite derinimą ir patikrinkite, ar žaidimas veikia.

Jei teisingai nustatėte ir žaidimas vis tiek nebus rodomas, pabandykite išvalyti žiniatinklio naršyklės talpyklą, kad išvalytumėte slapukus.

Prieigos prie "Brotli" failų IIS žiniatinklio serveryje simptomų supratimas

Pagal numatytuosius nustatymus IIS nepalaiko Brotli, todėl reikalinga konfigūracija IIS pusėje. Atrodo, kad tai galima tvarkyti atliekant išplėstinius nustatymus, bet šiame patarime to nepaaiškinsiu. Žiūrėkite toliau pateiktą informaciją.

Klaidos pranešimas

Unable to load file webgl-brotli/Build/WebGL_Brotli.framework.js.br! Check that the file exists on the remote server. (also check browser Console and Devtools Network tab to debug)