"Unity WebGL" paleidimas su "ASP.NET Core".
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.cshtml
index.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.cshtml
WebGL
Į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 , Build
TemplateData
.
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
wwwroot
webgl-gzip
Sukurkite aplanką "Gzip" ir nukopijuokite aplanką "" iš "WebGL" failoBuild
TemplateData
, 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
wwwroot
webgl-brotli
Dalyje Kurti aplanką nukopijuokite aplanką "" iš "WebGL" failoBuild
TemplateData
, 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ą.
- asp.net branduolio 2.2 brotli glaudinimas neveikia IIS?
- IIS glaudinimo apžvalga
- WebGL: serverio konfigūracijos kodo pavyzdys
- "WebGL" - suspaustų versijų diegimas
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)