unity3d 从Unity C#代码发送数据到我的WebGl索引html

scyqe7ek  于 2023-01-13  发布在  C#
关注(0)|答案(1)|浏览(244)

我有一个项目,在那里你使用一个堆栈。thats how it looks in the browser
我想从C#代码中发送数据,比如所选对象的名称等,到webgl索引html中,以便在数据表所在的右侧显示数据。
我已经尝试过使用jslib文件,但无法真正保存所获得的数据,只能显示一个包含所选对象名称的警报
这是我的jslib代码,我在alert上试过了。

mergeInto(LibraryManager.library, {

    SendData: function (data){
        window.alert(Pointer_stringify(data));
    },
});

这是我的C#代码,我只是发送对象的名称来测试它。

[DllImport("__Internal")]
   private static extern void SendData(string data);

   void OnMouseDown(){
      string data = gameObject.name;
      Debug.Log("Sending message to Js: "+ data);
      #if UNITY_WEBGL && !UNITY_EDITOR
      SendData(data);
      #endif
   }

我希望将数据放入index.html中的此表

<table>
    <tr>
      <th class="type">Data</th>
      <th>Value</th>
    </tr>
    <tr>
      <td>Name:</td>
      <td id="name"></td>
    </tr>
    <tr>
      <td>ID:</td>
      <td id="ID"></td>
    </tr>
    <tr>
      <td>PNr:</td>
      <td id="PNr"></td>
    </tr>
    <tr>
      <td>Color:</td>
      <td id="color"></td>
    </tr>
  </table>
92dk7w1h

92dk7w1h1#

您可以使用原生JavaScript来处理DOM元素:

mergeInto(LibraryManager.library, {
    SendData: function (json) {
        const data = JSON.parse(UTF8ToString(json));
        
        const nameField = document.getElementById("name");
        const idField = document.getElementById("ID");
        const pnrField = document.getElementById("PNr");
        const colorField = document.getElementById("color");
        
        nameField.innerText = data.Name;
        idField.innerText = data.Id;
        pnrField.innerText = data.Pnr;
        colorField.innerText = data.Color;
    },
});

在托管代码端:

using System;
using System.Runtime.InteropServices;
using UnityEngine;
using Random = UnityEngine.Random;

public class Sender : MonoBehaviour
{    
    [DllImport("__Internal")]
    private static extern void SendData(string json);
    
    private readonly string[] colors = { "black", "blue", "cyan", "white" };
    
    [Serializable]
    private struct Info
    {
        public int Id;
        public string Name;
        public string Pnr;
        public string Color;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            var info = new Info();
            info.Name = "player_" + Random.Range(0, 1000);
            info.Id = Random.Range(0, 1000);
            info.Pnr = "pnr_" + Random.Range(0, 1000);
            info.Color = colors[Random.Range(0, colors.Length)];

            var json = JsonUtility.ToJson(info);
#if !UNITY_EDITOR && UNITY_WEBGL
            SendData(json);
#endif
        }
    }
}

我使用JSON和一个结构来传递到JS,但是也可以单独传递每个参数,或者创建自己的解析器来代替JSON。
我们应该使用UTF8ToString而不是Pointer_stringify,因为JavaScript函数“Pointer_stringify(ptrToSomeCString)”已过时,并将在未来的Unity版本中删除。
如果你需要更新很多元素,原生JS不是很方便,最好使用JQuery或者其他库。

相关问题