ใช้ Unity WebGL กับ ASP.NET Core
สภาพแวดล้อมการตรวจสอบ
- หน้าต่าง
-
- หน้าต่าง 11
- บรรณาธิการ Unity
-
- ปี 2020.3.25f1
- วิชวลสตูดิโอ
-
- Visual Studio 2022
- แกน ASP.NET
-
- ASP.NET คอร์ 6.0
- บริการข้อมูลทางอินเทอร์เน็ต (IIS)
-
- IIS 10.0
ทีแรก
เรียนรู้วิธีเรียกใช้เอาต์พุตเกมเป็น WebGL ใน Unity บนเว็บเซิร์ฟเวอร์ที่ใช้ ASP.NET Core สําหรับโปรแกรมเกมให้ใช้ผลลัพธ์ที่ส่งออกในขั้นตอนเคล็ดลับด้านล่าง ตัวอย่างเกมใช้ 2D Platformer Microgame ซึ่งสามารถสร้างได้จาก Unity Hub
ฉันจะอธิบายวิธีตั้งค่า "Uncompressed WebGL", "WebGL บีบอัดด้วย Gzip" และ "WebGL ที่บีบอัดด้วย Brotli" เพื่อเรียกใช้เกม WebGL ขั้นตอนจะเหมือนกันสําหรับพวกเขาทั้งหมด
เรากําลังใช้ Visual Studio 2022, ASP.NET Core 6.0 แต่เวอร์ชันที่เก่ากว่าอาจใช้งานได้ อย่างไรก็ตามโครงสร้างของรหัสเริ่มต้นจะแตกต่างกันสําหรับแต่ละเวอร์ชันดังนั้นโปรดเข้าใจความแตกต่างด้วยตัวคุณเอง
การสร้างโครงการหลัก ASP.NET
เปิด "Visual Studio 2022" จากเมนูเริ่ม
เลือก สร้างโครงการใหม่
คราวนี้เลือก "ASP.NET Core Web App" เป็นตัวอย่าง หากคุณกําลังใช้งาน ASP.NET Core คุณสามารถเรียกใช้เทมเพลตอื่นๆ ได้ แต่คุณจะต้องทําตามแต่ละเทมเพลตเกี่ยวกับวิธีการสร้างเทมเพลต
ตั้งชื่อโครงการและที่ตั้งโดยพลการ
ปล่อยให้ข้อมูลเพิ่มเติมตามที่เป็นอยู่
โครงการได้ถูกสร้างขึ้น
เรียกใช้ WebGL ที่ไม่บีบอัด
เตรียมโปรแกรม WebGL ที่สร้างขึ้นโดยไม่มีการบีบอัด
ตรวจสอบให้แน่ใจว่าเกมทํางานได้อย่างรวดเร็ว
ASP.NET ลองเล่นเกม WebGL ด้วยการตั้งค่าน้อยลงโดยไม่ปฏิบัติตามมารยาทหลัก
ใน ASP.NET Core คุณไม่สามารถเข้าถึงไฟล์ WebGL บางไฟล์ที่ปล่อยออกมาจาก Unity ในสถานะเริ่มต้น ทําให้สิ่งนี้สามารถเข้าถึงได้
โปรแกรม.cs
เปิดจากโครงการของคุณ Program.cs
นําไปใช้กับเวอร์ชัน ASP.NET Core Startup.cs
ก่อนหน้า
เพิ่ม namespace ที่ด้านบนของรหัสและแทนที่ต่อไปนี้ในรหัส app.UseStaticFiles();
:
// ここから追加
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
เพื่อที่ว่าเมื่อเข้าถึง.wasm
ไฟล์จะสามารถส่งคืนไปยังไคลเอนต์ได้ตามที่ระบุไว้Content-Type
การปรับใช้ WebGL
วางโฟลเดอร์ไฟล์ต่อไปนี้จาก Unity ในโครงการของคุณwwwroot
- ดัชนี.html
- สร้าง
- แม่แบบข้อมูล
Index.cshtml
index.html
เปิดลิงก์เพื่อให้คุณสามารถเข้าถึงได้
<!-- 省略 -->
<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>
เรียกใช้โปรแกรมและตรวจสอบให้แน่ใจว่าเกมใช้งานได้
เรียกใช้โปรแกรม WebGL บนหน้า Razor
เกมก่อนหน้านี้ทํางานบนไฟล์ HTML แบบคงที่ดังนั้นจึงทํางานในสถานที่ที่ไม่เกี่ยวข้องกับ ASP.NET Core ไม่เป็นที่ต้องการมากสําหรับความสม่ําเสมอของโปรแกรมดังนั้นเราจะย้ายลักษณะการทํางานของไฟล์ HTML ไปยัง Razor Pages
คลิกขวาที่โฟลเดอร์ Pages จากโปรเจ็กต์ของคุณเพื่อเพิ่มรายการใหม่
เลือก Razor Page - Empty ไม่มีการระบุชื่อเฉพาะ แต่มีการเพิ่ม ที่นี่ WebGL.cshtml
.
รหัสจะปรากฏขึ้น
index.html
อ้างถึงเนื้อหาของไฟล์และพอร์ตไปที่ WebGL.cshtml
.
link
มีบางจุดแปลก ๆ เช่นวิธีการวางแท็ก แต่ฉันจะปล่อยให้มันเป็นไปเพื่อความเรียบง่ายของคําอธิบาย
@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
เพิ่มลิงก์ไปยัง .
<!-- 省略 -->
<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>
ลองเรียกใช้โปรแกรม คุณจะเห็นว่าส่วนหัวและส่วนท้าย _Layout.cshtml
แสดงบนหน้า WebGL ตาม .
เปลี่ยนตําแหน่งของไฟล์ WebGL
ฉันวางไฟล์ WebGL ไว้ใต้ โดยตรง แต่วิธีนี้จะเขียนทับเมื่อคุณวางไฟล์ WebGL wwwroot
สองไฟล์ขึ้นไป
ฉันจะอธิบายวิธีการใส่นี้ในโฟลเดอร์ที่แยกต่างหากและย้ายมัน
ก่อนอื่นให้สร้างโฟลเดอร์ใหม่ที่เรียกว่า "webgl" และย้ายไปที่นั่น สองโฟลเดอร์ที่จะ Build
ย้ายคือ , TemplateData
.
index.html
ฉันได้พอร์ตไปยัง Razor Pages แล้วและสามารถลบได้อย่างปลอดภัย
เนื่องจาก WebGL.cshtml
เราได้ทําให้ลําดับชั้นของโฟลเดอร์ลึกซึ้งยิ่งขึ้นเราจะทําให้เส้นทางที่อธิบายไว้ลึกซึ้งยิ่งขึ้น การแก้ไขคือ 3 บรรทัด
ก่อนการแก้ไข
<link rel="shortcut icon" href="TemplateData/favicon.ico">
<link rel="stylesheet" href="TemplateData/style.css">
var buildUrl = "Build";
หลังการแก้ไข
<link rel="shortcut icon" href="webgl/TemplateData/favicon.ico">
<link rel="stylesheet" href="webgl/TemplateData/style.css">
var buildUrl = "webgl/Build";
เรียกใช้โปรแกรมเพื่อดูว่าทํางานอย่างถูกต้องหรือไม่
เรียกใช้ WebGL บีบอัดด้วย Gzip
ส่วนขยายของไฟล์ที่บีบอัดโดย Gzip คือ .gz
และเป็นไฟล์ที่สามารถจัดการได้โดย ASP.NET Core
Unity WebGL Content-Type
และได้รับการจัดการที่แตกต่างกันและต้องมีการแปลง
ขั้นแรกให้สร้างการปรับใช้ไฟล์ WebGL และหน้า
การวางไฟล์ WebGL
wwwroot
webgl-gzip
สร้างโฟลเดอร์ภายใต้ Gzip และคัดลอกโฟลเดอร์จากไฟล์ Build
TemplateData
WebGL ที่คุณสร้างด้วย Gzip
สร้างเพจมีดโกน
คราวนี้ WebGLGzip.cshtml
สร้างไฟล์โดยใช้ขั้นตอนเดียวกับเมื่อไม่มีการบีบอัด
รหัสมีดังนี้โดยมีการอ้างอิงถึง Output in index.html
Unity
เส้นทางตรงกับโฟลเดอร์ที่คุณสร้าง webgl-gzip
ไว้ก่อนหน้านี้สําหรับไฟล์ WebGL
@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>
}
แก้ไขเพื่ออนุญาตการนําทางไปยัง Index.cshtml
หน้านี้
<!-- 省略 -->
<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>
แก้ไขโปรแกรม.cs
app.UseStaticFiles
ปรับเปลี่ยนส่วนที่กําลังประมวลผลวิธีการดังต่อไปนี้
ก่อนการแก้ไข
// ここから追加
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".data"] = "application/octet-stream";
provider.Mappings[".wasm"] = "application/wasm";
app.UseStaticFiles(new StaticFileOptions()
{
ContentTypeProvider = provider,
});
// ここまで追加
หลังการแก้ไข
// ここから追加
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
ไฟล์Content-Type
application/x-gzip
จะส่งคืนด้วย
ตามที่เป็นอยู่ Unity WebGL บนไคลเอนต์ไม่สามารถระบุได้ดังนั้นฉันจึง.gz
เขียนใหม่และส่งคืนตามContent-Type
นามสกุลของไฟล์ที่ไม่รวม
Content-Encoding
ฉันยังตั้งค่าเพราะมันgzip
เป็นสิ่งจําเป็น
อย่างไรก็ตามฉันยังใส่รหัส Brotli เข้าด้วยกันเพื่อให้คุณสามารถใช้รหัสนี้ได้ตามที่อยู่ในการติดต่อ Brotli ของรายการถัดไป
Brotli ยัง.br
ตั้งค่าการเขียนContent-Encoding
br
ใหม่ให้ตรงกับContent-Type
นามสกุลของไฟล์โดยไม่ต้อง
อย่างไรก็ตามไฟล์ไม่สามารถเข้าถึงได้โดยค่าเริ่มต้นใน ASP.NET Core.br
ดังนั้นฉันจึงprovider.Mappings
เพิ่มด้วย.br
หลังจากนั้นให้เรียกใช้การตรวจแก้จุดบกพร่องและตรวจสอบว่าเกมทํางานอย่างถูกต้องหรือไม่
หากคุณตั้งค่าอย่างถูกต้องและเกมยังคงไม่แสดง ให้ลองล้างแคชของเว็บเบราว์เซอร์เพื่อล้างคุกกี้ของคุณ
การเรียกใช้ WebGL ที่บีบอัดด้วย Brotli
ขั้นตอนเกือบจะเหมือนกับ Gzip แทนที่ส่วน Gzip ด้วย Brotli อย่างไรก็ตาม ไฟล์ Brotli (.br) ไม่สามารถเข้าถึงได้โดยค่าเริ่มต้นใน ASP.NET Core คุณต้องกําหนดค่าเพื่อให้คุณสามารถเข้าถึงได้ แต่ถ้าคุณใช้รหัสในเวลาของ Gzip จะได้รับการสนับสนุน
ขั้นแรกให้สร้างการปรับใช้ไฟล์ WebGL และหน้า
การวางไฟล์ WebGL
wwwroot
webgl-brotli
ภายใต้ สร้างโฟลเดอร์ ให้คัดลอกโฟลเดอร์ , จากBuild
TemplateData
ไฟล์ WebGL ที่คุณสร้างด้วย Brotli
สร้างเพจมีดโกน
สร้างไฟล์โดยใช้ WebGLBrotli.cshtml
ขั้นตอนเดียวกับ Gzip
รหัสมีดังนี้โดยมีการอ้างอิงถึง Output in index.html
Unity
เส้นทางตรงกับโฟลเดอร์ที่คุณสร้าง webgl-brotli
ไว้ก่อนหน้านี้สําหรับไฟล์ WebGL
@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>
}
แก้ไขเพื่ออนุญาตการนําทางไปยัง Index.cshtml
หน้านี้
<!-- 省略 -->
<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>
แก้ไขโปรแกรม.cs
หากคุณแก้ไขเมื่อรองรับ Gzip คุณสามารถใช้รหัสเดียวกันได้
หลังจากแก้ไขแล้วให้เรียกใช้การดีบักและตรวจสอบว่าเกมใช้งานได้หรือไม่
หากคุณตั้งค่าอย่างถูกต้องและเกมยังคงไม่แสดง ให้ลองล้างแคชของเว็บเบราว์เซอร์เพื่อล้างคุกกี้ของคุณ
การทําความเข้าใจเกี่ยวกับอาการของการเข้าถึงแฟ้ม Brotli บนเว็บเซิร์ฟเวอร์ IIS
Brotli ไม่ได้รับการสนับสนุนโดย IIS โดยค่าเริ่มต้น ดังนั้นการกําหนดค่าบนฝั่ง IIS เป็นสิ่งจําเป็น ดูเหมือนว่าจะสามารถจัดการได้โดยการตั้งค่าขั้นสูง แต่ฉันจะไม่อธิบายในเคล็ดลับนี้ โปรดดูข้อมูลที่เชื่อมโยงด้านล่าง
- asp.net core 2.2 brotli compression ไม่ทํางานบน IIS?
- ภาพรวมการบีบอัด IIS
- WebGL: ตัวอย่างรหัสการกําหนดค่าเซิร์ฟเวอร์
- WebGL - การปรับใช้บิลด์ที่บีบอัด
ข้อความแสดงข้อผิดพลาด
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)