Technologieaustausch

Unity WebGL bettet Front-End-Webseiten ein und kommuniziert

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Einleitung

Als ich kürzlich an einem Projekt arbeitete, stieß ich auf die Notwendigkeit, UnityWebGL in eine Webseite einzubetten, und UnityWebGL musste reagieren, wenn auf der Webseite auf eine Schaltfläche geklickt wurde.Überspringen Sie den neuen Projektteil direkt

2. Endeffekt

webglResult.gif

3. Grundeinstellungen

  • Stellen Sie die Exportplattform auf WebGL ein
    Eingefügtes Bild 20240527102413
  • Überprüfen Sie die Player-Einstellungen -> Veröffentlichungseinstellungen Data Caching UndDecompression Fallback Der Link unten ist die offizielle Erklärung.
    Data Caching Vereinfacht ausgedrückt werden die Daten lokal zwischengespeichert und beim nächsten Öffnen können Sie das Spiel direkt betreten, ohne es herunterzuladen.
    Decompression Fallback Wenn GZ-Dateien nicht analysiert werden können, Webserver-Konfigurationsfehler usw. vorliegen, müssen Sie diese Option aktivieren.
    Unity – Handbuch: WebGL-Player-Einstellungen (unity3d.com)
    Eingefügtes Bild 20240527102930

4. Code schreiben und exportieren

  • Die Szene wird wie folgt eingerichtet (Sie können Szenen nach Ihren eigenen Bedürfnissen erstellen)
    Eingefügtes Bild 20240527110105
  • Codeteil (mounten Sie den Code auf dem erstellten Cube)

Hinweis: Die Methode muss öffentlich sein, andernfalls ist sie nicht zugänglich

using System;  
using System.Text;  
using UnityEngine;  
using UnityEngine.UI;  
  
public class CubeRotate : MonoBehaviour  
{  
    public Text tx;  
  
    void Update()  
    {        
	    transform.Rotate(Vector3.up * Time.deltaTime * 30, Space.World);  
    }  
    public void SetTextInfo(string info)  
    {        byte[] bytes = Convert.FromBase64String(info);  
        var decodedMessage = Encoding.UTF8.GetString(bytes);  
        Debug.Log($"收到消息:{info}----{decodedMessage}");  
        tx.text = decodedMessage;  
    }  
    public void AddScale()  
    {        
	    transform.localScale += Vector3.one * 0.1f;  
    }  
    public void SubtractScale()  
    {        
	    transform.localScale -= Vector3.one * 0.1f;  
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • WebGL exportieren (einfach warten, bis der Export abgeschlossen ist)
    Eingefügtes Bild 20240527110452

Wenn Sie die gepackten Dateien lokal durchsuchen möchten, müssen Sie sie herunterladen. Firefox浏览器 Für das Herunterladen sind einige spezifische Konfigurationsparameter erforderlich.Webgl in Firefox öffnen_Webgl im Firefox-CSDN-Blog öffnen

5. Beispiel-Webseite

Da einige Freunde möglicherweise nicht wissen, wie man Webseiten schreibt, stellt der Autor eine einfache Webseitenvorlage zur Verfügung, die jeder testen kann.

Gebrauchsanweisung: Erstellen Sie eine neue Textdatei, fügen Sie den folgenden Code ein, speichern Sie ihn und ändern Sie das Dateisuffix in.html
Eingefügtes Bild 20240527114133

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Simple Web Page</title>
    <style>
      body {
        margin: 0;
        padding: 0;
        font-family: Arial, sans-serif;
      }
      .header {
        background-color: #333;
        color: white;
        padding: 10px;
        text-align: center;
      }
      .nav {
        background-color: #ddd;
        padding: 10px;
        text-align: center;
      }
      .nav-button {
        background-color: #ddd;
        border: none;
        color: #333;
        padding: 10px 15px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
        border-radius: 4px; /* 圆角边框 */
      }
      .nav-button:hover {
        background-color: #ccc;
      }
      .nav a {
        color: #333;
        text-decoration: none;
        margin-right: 10px;
      }
      .container {
        display: flex;
        justify-content: space-between;
        padding: 20px;
      }
      .sidebar,
      .main {
        padding: 20px;
        height: 550px;
        overflow: hidden;
      }
      .sidebar {
        background-color: #f0f0f0;
        flex: 0 0 380px; /* Fixed width for sidebar */
      }
      .main {
        background-color: #e0e0e0;
        flex: 0 0 960px; /* Fixed width for main content */
      }
      .sidebar-left {
        margin-right: 20px; /* Adjust the margin for the left sidebar */
      }
      .sidebar-right {
        margin-left: 20px; /* Adjust the margin for the right sidebar */
      }
      .footer {
        background-color: #333;
        color: white;
        text-align: center;
        padding: 10px;
        position: fixed;
        bottom: 0;
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div class="header">
      <h1>My Simple Web Page</h1>
    </div>

    <div class="nav">
      <button id="enlargeButton" class="nav-button">放大</button>
      <button id="shrinkButton" class="nav-button">缩小</button>
      <button id="infoButton" class="nav-button">设置信息</button>
    </div>

    <div class="container">
      <div class="sidebar sidebar-left">
        <h2>Left Sidebar</h2>
        <p>
          This is the left sidebar area. It typically contains additional
          information or links.
        </p>
      </div>
      <div class="main">
        WebGL网页
      </div>
      <div class="sidebar sidebar-right">
        <h2>Right Sidebar</h2>
        <p>
          This is the right sidebar area. It typically contains additional
          information or links.
        </p>
      </div>
    </div>

    <div class="footer">
      <p>Footer - Copyright &copy; 2024</p>
    </div>
  </body>

  <script>
    // JS 代码
  </script>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

6. WebGL einbetten

  • Erstellen Sie einen Ordner und legen Sie das gepackte WebGL und die Webseiten wie unten gezeigt im selben Ordner ab (dieser Schritt dient hauptsächlich der einfacheren Verwaltung, Sie müssen dies nicht tun).
    Eingefügtes Bild 20240527114742
  • Öffnen Sie die Webseite mit der IDE und suchen Sie den Speicherort, der im folgenden Code durch das rote Kästchen markiert ist.
    Eingefügtes Bild 20240527114359
  • Ersetzen Sie den Inhalt im div-Tag durch den folgenden Code. Wenn Ihr WebGL-Projekt auf dem Server bereitgestellt wurde, können Sie den Inhalt im iframe-Tag durch den folgenden Code ersetzen.src Ändern Sie einfach den Link zur Serveradresse. (Informationen zu Iframe finden Sie unterHTML-Iframe (w3school.com.cn)) speichern und verwendenFirefox浏览器Öffnen Sie eine Webseite und Projekte, die auf dem Server bereitgestellt wurden, können mit jedem Browser geöffnet werden, der WebGL unterstützt.
<iframe
          id="webgl"
          style="
            position: relative;
            width: 100%;
            height: 100%;
            border: medium none;
          "
          src="../UnWeb/webgl/index.html"
        ></iframe>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Eingefügtes Bild 20240527115228
Eingefügtes Bild 20240527115718

Laufergebnis

7. Die Webseite ruft die Unity-Methode auf

  • Suchen Sie den Ort, der im Code unten durch das rote Kästchen markiert ist
    Eingefügtes Bild 20240527121614
  • Ersetzen Sie den Inhalt im Skript-Tag durch den folgenden Code (der Code ist relativ einfach und enthält Kommentare, daher werde ich ihn nicht zu ausführlich erklären)

Beachten:methodName Er muss mit dem Methodennamen in Unity übereinstimmen, andernfalls wird die Methode nicht gefunden.

    // 获取DOM中id为"webgl"的iframe元素
    var unWebGL = document.getElementById("webgl");
    // 获取放大按钮
    var enlargeButton = document.getElementById("enlargeButton");
    // 获取缩小按钮
    var shrinkButton = document.getElementById("shrinkButton");
    // 获取信息按钮
    var infoButton = document.getElementById("infoButton");

    /**
     * Action函数用于向iframe内的WebGL应用发送指令。
     * @param {string} methodName - 要调用的方法名
     * @param {string} message - 要传递的消息(可选)
     */
    function Action(methodName, message) {
      // 获取嵌套的iframe元素
      var iframeB = document.getElementById("webgl");
      // 调用iframe内容窗口的ReceiveJSMethod方法,传递方法名和消息
      iframeB.contentWindow.ReceiveJSMethod(methodName, message);
    }

    // 为放大按钮添加点击事件监听器
    enlargeButton.addEventListener("click", function () {
      // 当按钮被点击时,调用Action函数,通知WebGL应用增大缩放
      Action("AddScale");
      // 可以在这里执行其他操作
    });

    // 为缩小按钮添加点击事件监听器
    shrinkButton.addEventListener("click", function () {
      // 当按钮被点击时,调用Action函数,通知WebGL应用减小缩放
      Action("SubtractScale");
    });

    // 为信息按钮添加点击事件监听器
    infoButton.addEventListener("click", function () {
      // 当按钮被点击时,调用Action函数,通知WebGL应用显示信息
      Action("SetTextInfo", "这是一条测试消息");
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

Eingefügtes Bild 20240527122058

  • Nachdem Sie die obigen Schritte ausgeführt haben, verwenden Sie die IDE, um die WebGL-Webseite zu öffnen (index.html-Datei im Bild unten).
    Eingefügtes Bild 20240527142351
  • Suchen Sie das Skript-Tag und den Code zum Initialisieren des Loaders unter diesem Tag. Und fügen Sie den Code in das rote Feld ein.
    Eingefügtes Bild 20240527143058
var unityIns = null;
      script.src = loaderUrl;
      script.onload = () => {
        createUnityInstance(canvas, config, (progress) => {
          progressBarFull.style.width = 100 * progress + "%";
        })
          .then((unityInstance) => {
            unityIns = unityInstance;
            loadingBar.style.display = "none";
            fullscreenButton.onclick = () => {
              unityInstance.SetFullscreen(1);
            };
          })
          .catch((message) => {
            alert(message);
          });
      };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • Erstellen Sie den Code zum Senden von Nachrichten an Unity. Hier erklären wir kurz, was im Code verwendet wird.SendMessageMethoden Damit können Sie aus JavaScript-Code bestimmte Methoden für Spielobjekte in Ihrer Unity-Szene aufrufen.

Beachten:SendMessage Die Methode hat drei Parameter:
Name des Zielobjekts: Dies ist der Name des Spielobjekts in der Szene. Die Methode, die Sie aufrufen möchten, ist für dieses Objekt definiert.
Methodenname: Dies ist der Name der Methode, die Sie aufrufen möchten. Es sollte eine öffentliche Methode im Skript für das Zielobjekt sein.
Parameter: Dies sind die Parameter, die Sie an die Methode übergeben möchten. In SendMessage von Unity kann dieser Parameter nur vom Typ String sein. Wenn Sie komplexere Daten übergeben müssen, müssen Sie möglicherweise andere Mechanismen verwenden.

   /**
       * ReceiveJSMethod 函数用于接收来自网页的指令和消息,并将它们传递给 Unity 中的对象。
       * @param {string} methodName - 要调用的 Unity 对象的方法名
       * @param {string} message - 要传递给 Unity 对象的消息(可选)
       */
      function ReceiveJSMethod(methodName, message) {
        // 在控制台输出接收到的methodName和message,用于调试
        console.log(methodName, message);

        // 检查methodName是否不为null
        if (methodName != null) {
          // 如果message也不为null,则进行处理
          if (message != null) {
            // 将文本消息转换为base64编码
            var base64Str = btoa(
              encodeURIComponent(message).replace(
                /%([0-9A-F]{2})/g,
                function (match, p1) {
                  // 将百分比编码的序列转换回原始字符
                  return String.fromCharCode("0x" + p1);
                }
              )
            );
            // 使用Unity引擎的SendMessage方法,将methodName和base64编码的消息发送给名为"Cube"的Unity对象
            unityIns.SendMessage("Cube", methodName, base64Str);
          } else {
            // 如果没有message,只发送methodName给名为"Cube"的Unity对象
            unityIns.SendMessage("Cube", methodName);
          }
        }
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

8. Ende

Okay, das ist alles für heute~
Wenn es für Sie hilfreich ist, können Sie es liken, verfolgen und sammeln. Wenn Sie Fragen haben, sehen Sie sich im Kommentarbereich an
Es ist nicht einfach, originell zu sein. Bitte geben Sie die Quelle an. Vielen Dank an alle