您好,登錄后才能下訂單哦!
JS Binding跟SharpKit或JavaScript的加載流程是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
首先,現在的方案是游戲啟動就加載全部的 JavaScript 代碼。
先看下 StreamingAssets/JavaScript/ 文件夾下的目錄結構:
debug/:跟 JavaScript 調試有關的 JavaScript 代碼,只有當開啟調試的時候才需要加載。
Manual/:也是用于手寫 JavaScript 代碼,跟 JSImp/ 有一些區別。Manual 里最有的代表性的是 Vector2 和 Vector3,這2個對象是手寫實現的,在 JavaScript 中跑只會使用 JavaScript 版本的 Vector2 和 Vector3
SharpKit/:從 SharpKit 拿過來的一些 JavaScript 庫文件。可以實現類繼承等
GeneratedFiles.javascript:是由菜單 【JSB | Generate JS and CS Bindings】 產生的。用于實現將 C# 函數綁定到 JavaScript 上。比如說要在 JavaScript 中使用 GameObject 就要使用這里面的文件。這一點和 LUA 不一樣,LUA 產生綁定時只有產生 C# 代碼,我們是2邊都有。
SharpKitGeneratedFiles.javascript:由 SharpKit 工程編譯而來的 JavaScript 代碼都會放在這個文件里。
includes.javascript:JavaScript 代碼總入口
目前 JavaScript 加載只有一個入口,StreamingAsset/JavaScript/includes.javascript。
查看 _JSEngine.prefab 上的配置:
includes.javascript 里面通過 CS.require 包含了所有的 JavaScript 文件:
(此內容可能不是最新的)
1 /* 2 * Author: Qiucw 3 * DO NOT change order 4 */ 5 6 7 // -1) 8 //-------------------------------------------------- 9 function jsb_ReplaceOrPushJsType(jst) { 10 //if (!JsTypes) { JsTypes = []; } 11 var found = false; 12 for (var i = 0; i < JsTypes.length; i++) { 13 if (JsTypes[i].fullname == jst.fullname) { 14 JsTypes[i] = jst; 15 found = true; 16 break; 17 } 18 } 19 if (!found) { 20 JsTypes.push(jst); 21 } 22 } 23 24 25 // 0) SharpKit library 26 //-------------------------------------------------- 27 CS.require("SharpKit/jsclr"); 28 CS.require("SharpKit/clrlibrary"); 29 30 // 1) Files generated by JSBinding 31 // may overwrite some classes in step 0) 32 //-------------------------------------------------- 33 CS.require("GeneratedFiles"); 34 35 36 // 2) Manually written js 37 // will overwrite some classes in step 1) 38 //-------------------------------------------------- 39 CS.require("Manual/UnityEngine_Vector3"); 40 CS.require("Manual/UnityEngine_Vector2"); 41 CS.require("Manual/UnityEngine_MonoBehaviour"); 42 CS.require("Manual/UnityEngine_WaitForSeconds"); 43 CS.require("Manual/MissingClasses"); 44 // 45 // may be more.. 46 // 47 48 // 3) code generated by SharpKit 49 //-------------------------------------------------- 50 CS.require("SharpKitGeneratedFiles"); 51 52 53 // 4) JavaScript implemented 54 // will overwrite some classes in step 1) 55 //-------------------------------------------------- 56 CS.require("JSImp/Reflection"); 57 CS.require("JSImp/Coroutine"); 58 CS.require("JSImp/Iterator"); 59 60 // 61 // may be more.. 62 // 63 64 // 5) SharpKit handler (Compile) 65 //-------------------------------------------------- 66 CS.require("SharpKit/myclrhandler"); 67 68 // 6) Error handler 69 //-------------------------------------------------- 70 CS.require("ErrorHandler");
JavaScript 里的類一開始都是用 JsType 對象來表示,可以打開 StreamingAssets/JavaScript/SharpKitGeneratedFiles.javascript/ 查看一下。這里貼出來 V3Test 這個 MonoBehaviour 的 JavaScript 代碼:
1 if (typeof(JsTypes) == "undefined") 2 var JsTypes = []; 3 var V3Test = { 4 fullname: "V3Test", 5 baseTypeName: "UnityEngine.MonoBehaviour", 6 assemblyName: "SharpKitProj", 7 Kind: "Class", 8 definition: { 9 ctor: function (){ 10 this.elapsed = 0; 11 UnityEngine.MonoBehaviour.ctor.call(this); 12 }, 13 Start: function (){ 14 }, 15 Update: function (){ 16 this.elapsed += UnityEngine.Time.get_deltaTime(); 17 if (this.elapsed > 1){ 18 var sb = new System.Text.StringBuilder.ctor(); 19 this.elapsed = 0; 20 var v = new UnityEngine.Vector3.ctor$$Single$$Single$$Single(2, 3, 6); 21 var w = new UnityEngine.Vector3.ctor$$Single$$Single$$Single(7, 23, 1); 22 var n = v.get_normalized(); 23 var arr = [n.x, n.y, n.z]; 24 UnityEngine.Debug.Log$$Object(sb.AppendFormat$$String$$Object$Array("v.normalized = ({0}, {1}, {2})", arr).toString()); 25 sb.Remove(0, sb.get_Length()); 26 var cross = UnityEngine.Vector3.Cross(v, w); 27 arr = [cross.x, cross.y, cross.z]; 28 UnityEngine.Debug.Log$$Object(sb.AppendFormat$$String$$Object$Array("Cross(v, w) = ({0}, {1}, {2})", arr).toString()); 29 UnityEngine.Debug.Log$$Object("v.magnitude = " + v.get_magnitude()); 30 UnityEngine.Debug.Log$$Object("w.magnitude = " + w.get_magnitude()); 31 UnityEngine.Debug.Log$$Object("Dot(v, w) = " + UnityEngine.Vector3.Dot(v, w)); 32 UnityEngine.Debug.Log$$Object("Angle(v, w) = " + UnityEngine.Vector3.Angle(v, w)); 33 var proj = UnityEngine.Vector3.Project(v, w); 34 UnityEngine.Debug.Log$$Object("Project(v,w) = " + proj.toString()); 35 v.Normalize(); 36 w.Normalize(); 37 UnityEngine.Debug.Log$$Object("normalized v = " + v.toString()); 38 UnityEngine.Debug.Log$$Object("normalized w = " + w.toString()); 39 } 40 } 41 } 42 }; 43 JsTypes.push(V3Test);
這個文件是由 SharpKit 工程生成的,并不是手寫的。
一個 JsType 用于定義一個類。里面的字段通常有:
fullname:表示此類的全名,也包含名字空間。V3Test 沒有名字空間,所以就沒有
baseTypeName:父類的名字。在后續的步驟中,會用于實現繼承。
Kind:通常是 "Class",表示這是一個類。也可以是 "Struct" 或 "Enum"
definition:表示實例函數以及實例的 Property,以及構造函數。ctor表示構造函數。V3Test 只有 Start 和 Update 2個函數,是 MonoBehaviour 典型的2個函數。
staticDefinition:表示靜態函數。
fields:實例字段。
staticFields:靜態字段。
interfaceNames:接口的名字,是一個數組
可以看到,每一個類的文件,都是定義一個 JsType,文件最后把他 push 進 JsTypes 數組。
放到 JsTypes 數組干嘛呢?
includes.javascript 里有 require SharpKit/myclrhandler.javascript。可以打開這個文件看一下。這個文件里最重要的一句代碼是:
1 Compile();
Compile 函數的定義是在 SharpKit/jsclr.javascript 中。有興趣的可以看一下源代碼。
Compile 主要做了2件事:
設置全局對象,使你可以訪問這些類。比如說 你可以使用 UnityEngine.GameObject 來訪問這個類。
處理繼承關系。比如說,V3Test并沒有定義 gameObject 這個屬性,但是在 V3Test 中是可以 this.gameObject 訪問的。
關于JS Binding跟SharpKit或JavaScript的加載流程是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。