談談今天的學習收獲,發現了一個好東西,unity與html能夠互相通信,意味着我之前學的web開發還能在unity中用得上,哈哈,太happy了!下面簡單談談通過Unity3D調用HTML網頁的腳本函數,以及通過HTML網頁調用Unity3D中的腳本函數。
Unity3D浏覽器通過執行Application.ExternalCall()來調用任何在HTML網頁裡定義JavaScript函數,比如下面一句調用了HTML網頁裡SayHello()函數,并傳遞了一句話作為參數。
Application.ExternalCall("SayHello","helloworld");
在HTML網頁裡需定義SayHello()方法,如下所示:
效果:
Unity3D浏覽器的插件或ActiveX控件都有一個SendMessage()的函數,HTML網頁通過這個函數與Unity3D進行通信,通過該函數可以傳遞對象名、函數名以及簡單參數,然後SendMessage()就會調用Unity3D與GameObject上綁定的函數。在調用SendMessage()函數之前,必須先得到Unity WebPlayer的引用。這裡可以使用JavaScript對象Document的getElementById()函數來獲得該引用。
下面是一個例子,它會執行SendMessage()函數,嵌入在Object或embed标簽下的Unity web player的id是UnityContent,SendMessage函數會從一個名為MyObject對象上的MyFunction()函數,并傳遞一句話作為參數。在Unity内容裡,需要放置一個名為MyObject的對象,并在該對象上附加實作了名稱為MyFunction函數的腳本檔案。HTML實作關鍵代碼如下:
Unity3D浏覽器中與MyObject對象綁定好的函數MyFunction
==================== 迂者 丁小未 CSDN部落格專欄=================
Unity QQ群:858550 cocos2dx QQ群:280818155
====================== 互相學習,共同進步 ===================
Unity手冊->進階->web播放器部署-> Unity WEB播放器和浏覽器通信
Unity Web Player and browser communication Unity WEB播放器和浏覽器通信
The HTML page that contains Unity Web Playercontent can communicate with that content and vice versa. Basically there aretwo communication directions:
HTML頁面,其中包含Unity Web播放的内容可以通信的内容,反之亦然。基本上有兩種通信方向:
The web page calls functions inside theUnity web player content.
該網頁内調用Unityweb播放器内容内部的功能。
The Unity web player content callsfunctions in the web page.
Unity web播放器的内容調用功能在在web頁中。
Eachof these communication directions is described in more detail below.
這些通信方向的每一個較長的描述如下。
Calling Unity web player content functionsfrom the web page
從web頁面調用Unity web播放器内容
在Unity的Web Player插件和ActiveX控件都有一個函數,SendMessage(),可以從網頁上一個web頁面被調用,為了調用Unity web播放器内容内部功能。這個功能是非常類似于GameObject.SendMessage函數在Unity腳本API裡。當從所謂的網頁上你傳遞一個對象的名稱,一個函數名和一個簡單參數,和SendMessage()将調用給定的函數在在給定對象的遊戲裡。
Inorder to call the Unity Web Player'sSendMessage() function you mustfirst get a reference to the Unity web player content object being displayed.You can use JavaScript'sdocument object and its getElementById()function to obtain a reference to the content. Here is an example JavaScriptfunction that would execute theSendMessage() function on the Unity webplayer content with an object/embed tag id value ofUnityContent; inturn SendMessage() will then call the functionMyFunction() onthe game object named MyObject, passing a piece of string data as anargument:
為了調用Unity Web播放器的SendMessage()函數必須先得到網站的Unity播放器内容對象的一個引用被顯示出來。你可以使用JavaScript的文檔對象和getElementById()函數來擷取對内容的引用。下面是一個JavaScript示例函數将利用object/ embed标簽的UnityContent id值在Unityweb播放器内容上執行SendMessage()函數,然後反過來SendMessage()将會調用函數調用MyFunction()在遊戲對象名稱上的MyObject來傳遞的一個字元串資料作為參數:
<scripttype="text/javascript" language="javascript">
<!--
functionSaySomethingToUnity()
{
document.getElementById("UnityContent").SendMessage("MyObject","MyFunction", "Hello from a web page!");
}
-->
</script>
Insideof the Unity web player content you need to have a script attached to theGameObjectnamed MyObject, and that script needs to implement a function namedMyFunction:
在Unity網絡播放器内容的内部裡你需要一個腳本附加到名為MyObject的GameObject上,該腳本需要實作名為myFunction函數:
function MyFunction(param: String)
Debug.Log(param);
Asingle string, integer or float argument must be passed when usingSendMessage(),the parameter is required on the calling side. If you don't need it then justpass a zero or other default value and ignore it on the Unity side.Additionally, the game object specified by the name can be given in the form ofa path name. For example, /MyObject/SomeChild where SomeChildmust be a child ofMyObject and MyObject must be at the rootlevel due to the '/' in front of its name.
一個單一的字元串,整數或浮點數必須通過使用SendMessage()傳遞,參數是需要在非正式的調用。如果你不需要它然後隻通過一個零或其他預設值并忽略它在Unity方面。此外,遊戲對象指定通過名稱可以得到在一個路徑名。例如,/ MyObject/ SomeChild在那兒SomeChild必須是MyObject的子和MyObject必須在根級别由于'/在其名稱的前面。
Thedefault html file generated when you publish web player content includes bothan object and embed tag in order to have the content load properly in allbrowsers. In order to allow browser-based JavaScript to distinguish between thetwo tag elements they each use a unique id value, UnityObject for theobject tag andUnityEmbed for the embed tag. Because of this, thedefault html file also includes a JavaScript function,GetUnity(), thatperforms some simple browser detection and returns a reference to the tagelement in use. Here is an example using that function:
預設的HTML檔案生成當你釋出web播放器的内容時包括了一個object和embed标簽,以便在所有浏覽器中的内容正确加載。為了使基于浏覽器的JavaScript來區分這兩種标記的元素,他們每次使用一個唯一的ID值,UnityObject為object标簽和UnityEmbed為embed标簽。正因為如此,預設的HTML檔案還包括一個JavaScript函數,GetUnity(),即執行一些簡單的浏覽器檢測并傳回一個使用的參考标記元素。下面是一個示例使用該功能:
GetUnity().SendMessage("MyObject", "MyFunction","Hello from a web page!");
Calling web page functions from Unity webplayer content
從Unity播放器内容調用web頁函數
為了從你内部Unity web播放器内容調用一個WEB頁函數,你必須使用Application.ExternalCall()函數。使用該功能,你可以調用任何JavaScript函數中定義的網頁,傳遞任意數量的參數給它。這裡有一個例子Unity腳本使用Application.ExternalCall()函數來調用一個函數名為SayHello()發現的網頁,傳遞一個字元串資料作為參數:
Application.ExternalCall("SayHello", "The game says hello!" );
Theweb page would need to define the SayHello() function, for example:
該網頁将需要定義sayHello()函數,例如:
function SayHello(arg )
// show the message
alert( arg );
Executing arbitrary browser code from Unityweb player content
從Unity web播放器記憶體執行任意浏覽器的代碼。
你甚至不必在嵌入網頁定義功能,替代的是你可以使用Application.ExternalEval()函數來執行任意浏覽器的代碼從網頁播放器的内容。
Thefollowing example checks that the page embedding the web player content isfetched from a certain host (unity3d.com), if that's not the case then it willredirect to another URL. This technique can be used to prevent deep linking toyour web player content:
下面的例子檢查該網頁嵌入web播放器的内容是從某主機(unity3d.com),如果不是這樣,那麼它将被重定向到另一個URL。這種技術可以用來防止深層連結到你的web播放器的内容:
Application.ExternalEval(
"if(document.location.host!= 'unity3d.com') {document.location='http://unity3d.com'; }"
);
本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366205,如需轉載請自行聯系原作者