8,303
社区成员
发帖
与我相关
我的任务
分享
using UnityEngine;
using System.Collections;
public class CS_test : MonoBehaviour {
void OnGUI(){
if (GUI.Button(new Rect(100, 170, 200, 100), "C#调用JavaScript")){
// 获取JS脚本对象
JS_test jsScript = (JS_test)GetComponent("JS_test");
// 调用JS脚本中的方法
jsScript.CallMe("来自CS");
}
}
public void CallMe(string test)
{
Debug.Log (test);
}
#pragma strict
function OnGUI(){
if (GUI.Button(Rect(100, 50, 200, 100), "JavaScript调用C#")){
// 获取C#脚本对象
var cs = this.GetComponent("CS_test");
// 调用C#脚本中的方法
//cs.CallMe("来自JS");
}
}
function CallMe(test : String){
Debug.Log(test);
}
#pragma strict
我搜了下它的作用是强制进行更严格的类型检测,尽早生成更多有用的错误信息。如果没有这句话我猜想Unity大概会在运行时刻才会检查有没有这个类型吧,而这个时候JS和C#都已经被编译了。
虽然这么做在这个例子里面是行得通的,但是,还是不推荐你把这句话去掉。缺点有这么几点(嘿嘿,我也是临时学的。。。):
1. 最明显的就是这只能在桌面平台上运行,但像Android、iOS这样的还是不会编译通过的
2. 这种动态转换会根据变量的使用情况来进行最合适的转换,但这会造成不必要的内存空间浪费
3. 这种纵容的做法会让你的代码变得很难看。。。JS和C#如果会互调说明它们是负责不同的功能,互调会让这种依赖变强,如果复杂的话到后面你自己都搞不清里面的逻辑了
还有一点不相关的,GetComponent方法不要使用以string为参数的这个函数,一方面是因为这样性能会下降,而且它返回的是Component对象,而不是这个脚本对象。
所以,还是不要为了减少这些编译错误,而把它注释掉啦~养成良好的习惯~
参考:
http://answers.unity3d.com/questions/237217/pragma-strict-and-getcomponent.html
http://www.cnblogs.com/x3d/p/3838619.html
#pragma strict
function OnGUI(){
if (GUI.Button(Rect(100, 50, 200, 100), "JavaScript调用C#")){
// 获取C#脚本对象
var cs = this.GetComponent("CS_test");
// 调用C#脚本中的方法
(cs as CS_test).CallMe("来自JS");
}
}
你改好了之后,还是会报找不到CS_test的错,这是因为Mono压根就没有编译到C#啊,JS先被编译,但此时还没有编译C#,因此不会找到一个叫CS_test的类。
我试过了,不能互调的,否则一定有一方会报找不到类的错误的