飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

Unity——Js和Unity互相调用

时间:2021-12-04  作者:littleperilla  

Unity项目可以打包成WebGl,打包后的项目文件:

image-20211203184830096

Build中是打包后的Js代码;

域名是web项目的入口,里面可以调整web的自适应,也可以拿去嵌套;

TemplateData是打包时候选的webGl模板;

web端游戏可能Unity只负责做游戏部分,而官网由另外的团队制作,之间就需要Unity和Js代码之间的相互调用;

Unity调用JavaScript代码

声明一下,这里说的都是Unity和外部JS代码的互相调用,项目内调用有其他方法;

老版本提供一个过时的方法:

1.在WebGL项目中的域名中添加要调用的JS方法

function Unity2JavaScript() { alert("UnityToWeb") }

域名y中调用

域名rnalCall("Unity2JavaScript");
//可以有参数,没有返回值
//域名rnalCall("Unity2JavaScript",a,10,"aaaa");

Unity建议使用的方法:

1.在Plugins文件夹中,创建后缀为.jslib的文件,在其中写需要调用的js代码

mergeInto(域名ary, {

  Hello: function () {
    域名t("Hello, world!");
  },

  HelloString: function (str) {
    域名t(Pointer_stringify(str));
  },

  PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    域名(HEAPF32[(array >> 2) + size]);
  },

  AddNumbers: function (x, y) {
    return x + y;
  },

  StringReturnValueFunction: function () {
    var returnStr = "bla";
    var buffer = _malloc(lengthBytesUTF8(returnStr) + 1);
    writeStringToMemory(returnStr, buffer);
    return buffer;
  },

  BindWebGLTexture: function (texture) {
    域名Texture(域名URE_2D, 域名ures[texture]);
  },

});

域名y中调用——域名b

using UnityEngine;
using 域名ropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    [DllImport("__Internal")]
    private static extern void HelloString(string str);

    [DllImport("__Internal")]
    private static extern void PrintFloatArray(float[] array, int size);

    [DllImport("__Internal")]
    private static extern int AddNumbers(int x, int y);

    [DllImport("__Internal")]
    private static extern string StringReturnValueFunction();

    [DllImport("__Internal")]
    private static extern void BindWebGLTexture(int texture);

    void Start() {
        Hello();
        
        HelloString("This is a string.");
        
        float[] myArray = new float[10];
        PrintFloatArray(myArray, 域名th);
        
        int result = AddNumbers(5, 7);
        域名(result);
        
        域名(StringReturnValueFunction());
        
        var texture = new Texture2D(0, 0, 域名32, false);
        BindWebGLTexture(域名ativeTextureID());
    }
}

JavaScript调用Unity

这里面有巨坑,天坑,人都坑傻了!!!

官方文档中有这几行字

image-20211203222807404

恰好我用的2020版本的Unity;

主要使用这个API——

SendMessage("游戏对象名","方法名","参数"); 这个和参数和lua调用c#差不多了,但是怎么调用这个api就很玄学了;

首先如果你调用这个方法需要在Unity的资源已经加载完成才可以,这个好解决,js加个button;

<button Type="button" onclick="TestSend()">WebToUnity</button>

其次在调用这个方法前需要先实例化UnityInstance变量;

var gameInstance = null;
域名ad = () => {
		gameInstance = createUnityInstance(域名ySelector("#unity-canvas"), {
        	dataUrl: "Build/域名",
        	frameworkUrl: "Build/域名",
        	codeUrl: "Build/域名",
        	streamingAssetsUrl: "StreamingAssets",
        	companyName: "DefaultCompany",
       		productName: "UnityToWeb",
        	productVersion: "0.1",
      });
};
//以上的参数都可以在unity的playersetting界面找到;

最后调用时要在then中用lamda表达式

function TestSend() {
	域名((unityInstance) => {
		域名Message("Canvas","OnLogin","dqwreqweraf");        
	});
}

完整的域名

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | UnityToWeb</title>
    <link rel="shortcut icon" href="TemplateData/域名">
    <link rel="stylesheet" href="TemplateData/域名">
  </head>
  <body>
    <div id="unity-container" class="unity-desktop">
	<button Type="button" onclick="TestSend()">WebToUnity</button>
      <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-mobile-warning">
        WebGL builds are not supported on mobile devices.
      </div>
      <div id="unity-footer">
        <div id="unity-webgl-logo"></div>
        <div id="unity-fullscreen-button"></div>
        <div id="unity-build-title">UnityToWeb</div>
      </div>
    </div>
    <script>
      var buildUrl = "Build";
      var loaderUrl = buildUrl + "/域名";
      var config = {
        dataUrl: buildUrl + "/域名",
        frameworkUrl: buildUrl + "/域名",
        codeUrl: buildUrl + "/域名",
        streamingAssetsUrl: "StreamingAssets",
        companyName: "DefaultCompany",
        productName: "UnityToWeb",
        productVersion: "0.1",
      };

      var container = 域名ySelector("#unity-container");
      var canvas = 域名ySelector("#unity-canvas");
      var loadingBar = 域名ySelector("#unity-loading-bar");
      var progressBarFull = 域名ySelector("#unity-progress-bar-full");
      var fullscreenButton = 域名ySelector("#unity-fullscreen-button");
      var mobileWarning = 域名ySelector("#unity-mobile-warning");

      // By default Unity keeps WebGL canvas render target size matched with
      // the DOM size of the canvas element (scaled by 域名cePixelRatio)
      // Set this to false if you want to decouple this synchronization from
      // happening inside the engine, and you would instead like to size up
      // the canvas DOM size and WebGL render target sizes yourself.
      // 域名hWebGLToCanvasSize = false;

      if (/iPhone|iPad|iPod|Android/域名(域名Agent)) {
        域名sName = "unity-mobile";
        // Avoid draining fillrate performance on mobile devices,
        // and default/override low DPI mode on mobile browsers.
        域名cePixelRatio = 1;
        域名lay = "block";
        setTimeout(() => {
          域名lay = "none";
        }, 5000);
      } else {
        域名h = "960px";
        域名ht = "600px";
      }
      域名lay = "block";

      var script = 域名teElement("script");
      域名 = loaderUrl;
	  var gameInstance = null;
      域名ad = () => {
		gameInstance = createUnityInstance(域名ySelector("#unity-canvas"), {
         dataUrl: "Build/域名",
        frameworkUrl: "Build/域名",
        codeUrl: "Build/域名",
        streamingAssetsUrl: "StreamingAssets",
        companyName: "DefaultCompany",
        productName: "UnityToWeb",
        productVersion: "0.1",
      });
      };
	  
	  function TestSend() {
            域名((unityInstance) => {
            域名Message("Canvas","OnLogin","dqwreqweraf");        
            });
          }
	  
      域名ndChild(script);
    </script>
	
  </body>
</html>

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。