Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)
2014-05-03 12:02
447 查看
Unity 3d C#和Javascript脚本互相调用 解决方案
1.背景知识
脚本的编译过程分四步:
1. 编译所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目录下的代码
2. 编译所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目录下的代码
3. 编译除了上面列出来的目录和Editor目录之外的所有代码
4. 编译Editor目录下的代码
这样的话,如果你希望某个Javascript能被其他脚本引用,那么把它放到第一组的某个目录里,然后把要使用它的代码放在第三组的某个目录里就好了。
同样,如果希望某个C#代码能被其他Javascript脚本引用,也必须把这个C#脚本放到第一组的某个目录里,Javascript代码放到第三组的某个目录里。
需要注意的是,代码一旦放在第一组目录中,它们一定是最先被编译的,所以它们将不可能直接引用其他组的脚本,但是可以通过SendMessage方式间接引用,可能会有一些效率方面的损失。这也造成了一个结果,两个非同种语言编写的脚本之间不能互相引用,否则无法区分出应该让哪个脚本优先编译。
另外一点是,第一组目录中的脚本一旦重新编译,会使得第三组目录中的所有代码也重新编译,这将会增加总的编译时间。所以,对于可能会经常变动的代码,尽量不要放到第一组目录中去,除非它们因为被其他脚本引用的原因不得不放到这里。
编辑器(Editor)相关的代码编译顺序及引用规则与此类似,只不过目录在第二组和第四组中定义。
2.C#调用javascript
using UnityEngine;
using System.Collections;
public class CS_test : MonoBehaviour {
void OnGUI(){
if(GUI.Button (new Rect(100,70,200,100),"c >> js")){
JS_test js = (JS_test)GameObject.Find ("Main Camera").GetComponent("JS_test");
string s = js.Call();
Debug.Log(s);
}
}
public string Call(){
return "from CS";
}
}
注意的问题:
此时,这个js要先被编译,js放在Standard Assets文件夹中先编译后被C#调用。
3.Javascript 调用C#
using UnityEngine;
using System.Collections;
public class CSMain : MonoBehaviour {
void CSTest(string test)
{
Debug.Log("CS" + test);
}
}
JS
function OnGUI()
{
if(GUI.Button( Rect(100,100,100,50),"CS"))
{
var csTest = this.GetComponent("CSMain");
csTest.CSTest("fff");
}
}
function Test(test:String)
{
Debug.Log("JS " + test);
}
注意:1.要将C#文件放在Standard Assets文件夹中先编译后被Javascript调用。
2.将Javascript最上方的#pragma strict 删掉。否则会报错:(方法名) is not a member of 'UnityEngine.Component'. 详见http://blog.csdn.net/qqmcy/article/details/9729695
参考资料:http://all-ipad.net/call-javascript-function-in-c-sharp/
http://blog.csdn.net/qqmcy/article/details/9729695
1.背景知识
脚本的编译过程分四步:
1. 编译所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目录下的代码
2. 编译所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目录下的代码
3. 编译除了上面列出来的目录和Editor目录之外的所有代码
4. 编译Editor目录下的代码
这样的话,如果你希望某个Javascript能被其他脚本引用,那么把它放到第一组的某个目录里,然后把要使用它的代码放在第三组的某个目录里就好了。
同样,如果希望某个C#代码能被其他Javascript脚本引用,也必须把这个C#脚本放到第一组的某个目录里,Javascript代码放到第三组的某个目录里。
需要注意的是,代码一旦放在第一组目录中,它们一定是最先被编译的,所以它们将不可能直接引用其他组的脚本,但是可以通过SendMessage方式间接引用,可能会有一些效率方面的损失。这也造成了一个结果,两个非同种语言编写的脚本之间不能互相引用,否则无法区分出应该让哪个脚本优先编译。
另外一点是,第一组目录中的脚本一旦重新编译,会使得第三组目录中的所有代码也重新编译,这将会增加总的编译时间。所以,对于可能会经常变动的代码,尽量不要放到第一组目录中去,除非它们因为被其他脚本引用的原因不得不放到这里。
编辑器(Editor)相关的代码编译顺序及引用规则与此类似,只不过目录在第二组和第四组中定义。
2.C#调用javascript
using UnityEngine;
using System.Collections;
public class CS_test : MonoBehaviour {
void OnGUI(){
if(GUI.Button (new Rect(100,70,200,100),"c >> js")){
JS_test js = (JS_test)GameObject.Find ("Main Camera").GetComponent("JS_test");
string s = js.Call();
Debug.Log(s);
}
}
public string Call(){
return "from CS";
}
}
注意的问题:
此时,这个js要先被编译,js放在Standard Assets文件夹中先编译后被C#调用。
3.Javascript 调用C#
using UnityEngine;
using System.Collections;
public class CSMain : MonoBehaviour {
void CSTest(string test)
{
Debug.Log("CS" + test);
}
}
JS
function OnGUI()
{
if(GUI.Button( Rect(100,100,100,50),"CS"))
{
var csTest = this.GetComponent("CSMain");
csTest.CSTest("fff");
}
}
function Test(test:String)
{
Debug.Log("JS " + test);
}
注意:1.要将C#文件放在Standard Assets文件夹中先编译后被Javascript调用。
2.将Javascript最上方的#pragma strict 删掉。否则会报错:(方法名) is not a member of 'UnityEngine.Component'. 详见http://blog.csdn.net/qqmcy/article/details/9729695
参考资料:http://all-ipad.net/call-javascript-function-in-c-sharp/
http://blog.csdn.net/qqmcy/article/details/9729695
相关文章推荐
- unity中js脚本与c#脚本互相调用
- unity中js脚本与c#脚本互相调用
- javascript如何调用C#后代码中的过程 和ASP.NET调用JS乱码解决方案
- C#中DLL调用资料整理
- javascript与asp.net(c#)互相调用方法
- unity c#调用c++ dll相关技术细节整理
- Javascript与C#互相调用(转)
- Unity C#和OC互相调用
- C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型
- 在C#中调用VBScript、JavaScript等脚本的实现 -工作流
- javascript与cs代码互相调用 asp.net中前台javascript与后台C#交互(转)
- javascript如何调用C#后代码中的过程 和ASP.NET调用JS乱码解决方案
- C#程序员整理的Unity 3D笔记(九):Unity 3D测试浅析
- C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型
- C#性能优化实践 资料整理
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
- 在C#中调用VBScript、javascript等脚本的实现
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- Unity 3D开发-C#脚本语言的一些基础用法