[Unity3D]C#与JS脚本间调用出错

yxlovemoney 2014-09-12 07:55:39
是在书上看到的,
书上说JS脚本必须放在一个Standard Assets的文件夹中
然后经过多番尝试,最后两个文件这样放置

C#脚本放在Assets下,

脚本内容分别如下

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);
}


但在MONO上编译时却出现这样的错误提示
e:\Unity Project\bookProject\Lesson4\Assets\CS_test.cs(4,4): Error CS0246: 找不到类型或命名空间名称“JS_test”(是否缺少 using 指令或程序集引用?) (CS0246) (Assembly-CSharp)


不过我查看过书上的源码,无论是放置位置,还是代码都完全一样了、书上的是可以通过的
但我这为什么会报这样一个错误呢? 求解!
...全文
3101 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
董金锁 2015-07-09
  • 打赏
  • 举报
回复
你是用的unity 5。0以上的吗? 我最近也在弄这个,论坛上说是 5.0开始去掉了GetComponent方法 改用另外一种引用方式 http://blogs.unity3d.com/2015/01/21/addcomponentstring-api-removal-in-unity-5-0/
执道而行 2014-12-20
  • 打赏
  • 举报
回复
脚本文件编码的问题,把注释全去掉,中文换英文,再试一下 如果能编辑通过那就是脚本文件编码的问题了 用计事本打开脚本,然后改一下编码就可以了,中文也能用了~
lanians 2014-11-06
  • 打赏
  • 举报
回复
function Start () { } function Update () { } function OnGUI() { if(GUI.Button(Rect(199,50,200,100),"Js调用C#")) { var cs = this.GetComponent("Cs_test"); cs.CallMe("我来自Js"); } } function CallMe(test:String) { Debug.Log(test); }
yxlovemoney 2014-09-16
  • 打赏
  • 举报
回复
引用 10 楼 candycat1992 的回复:
是我之前没有看到。。。这是因为你的JS最上面写了下面这句话:

#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意思是就因为这句,就导致可以JS,C#互调么? 但以前就了解过,如果去掉 #pragma strict这句话,要加上一大段东西去导入一些相关语句(好像有点类似C#的命名空间之类的东西), 要不程序是要报错的,所以不能单纯去掉。 ai,看来这中间,还是牵扯到很多知识点。算了,还是先放一放,反正现在能调用另一种脚本就够了。
  • 打赏
  • 举报
回复
是我之前没有看到。。。这是因为你的JS最上面写了下面这句话:

#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
yxlovemoney 2014-09-14
  • 打赏
  • 举报
回复
引用 7 楼 candycat1992 的回复:
你自己是不是拼错了。。。

书上的那个没有互调,它的JS里面注释了CallME那一行,它大概只是为了方便更改才一起写在那里的,实际上上一句getcomponent得到的值是空值

为什么你的问题总这么奇葩。。。



没有注释啊,难道我上传错了?
这是书上的代码,我再截一次


C#的


然后这是运行的效果


这应该就是在互调没错啊
yxlovemoney 2014-09-14
  • 打赏
  • 举报
回复
补充一下,C#单方面调用JS,JS单方面调用C#也行,前面有点东西弄错了,所以我说“JS里不能调用C#” , 所以现在问题只是JS,C#同时调用对方是怎么做到的,就像我在6楼给出的代码那样。
  • 打赏
  • 举报
回复
你自己是不是拼错了。。。 书上的那个没有互调,它的JS里面注释了CallME那一行,它大概只是为了方便更改才一起写在那里的,实际上上一句getcomponent得到的值是空值 为什么你的问题总这么奇葩。。。
yxlovemoney 2014-09-14
  • 打赏
  • 举报
回复
引用 5 楼 candycat1992 的回复:
你确定他们互调了??不可能吧。。。 你的JS会出那个错误是因为你没有进行类型转换,报错很明显了,就是说Component没有Callme函数,你改成下面:

#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的类。 我试过了,不能互调的,否则一定有一方会报找不到类的错误的
不过即使我在CS文件里把调用JS的代码全部删除,把CS脚本放在Plugins里,然后JS上像你这样写,MONO还是报错找不到CS_TEST这个类啊,这又是为什么呢?试了好多,都只能C#脚本调用JS。 而且是JS里不能调用C#。 也是查了N多资料说是不能互调的。 不过现在让我最纠结的是,书上给出的代码确实是可以编译通过的,而且也在Unity3D中很好地运行。重要的是跟我在一楼给出的代码是一模一样的。 所以不知能否帮忙看看这书上的代码,看到底是哪里的问题。 我对这问题真的没办法了。 但看到大多数都说这样不可以,但这段代码却可以,让我太纠结了。 http://pan.baidu.com/s/1pJwQ7fP 这就是书上的。 我没辙了,实在抱歉。
yxlovemoney 2014-09-13
  • 打赏
  • 举报
回复
引用 3 楼 candycat1992 的回复:
而且,你这样互掉是有问题的,JS掉了C#,C#又反过去调JS,因为有编译顺序,所以不可以这么双向调的

你可以看下面的参考:
http://blog.csdn.net/fancylovejava/article/details/12257087
http://blog.csdn.net/candycat1992/article/details/22927713#t7




虽然是这么说,链接也看了下,不过我看了下不出编译出错的代码,它们也确实是互调了,也能很好地通过编译



而我的,无论是JS调用 C#,还是C#调用JS,都试了(也就是C#放到Plugins,或JS放到Standard Assets)
在JS代码中都会报这样一个错误

而且一定要把 cs.CallMe("来自JS"); 这句注释掉才能通过。

那就完全没有了互调的意义了。这还叫什么互调。现在是单方面调另一个都不行。

人家的行,我的就是不行,难道是脸的问题,纠结死了。
  • 打赏
  • 举报
回复
你确定他们互调了??不可能吧。。。 你的JS会出那个错误是因为你没有进行类型转换,报错很明显了,就是说Component没有Callme函数,你改成下面:

#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的类。 我试过了,不能互调的,否则一定有一方会报找不到类的错误的
yxlovemoney 2014-09-12
  • 打赏
  • 举报
回复
引用 1 楼 candycat1992 的回复:
你已经到了互调的阶段了吗。。。 你这是两个双方向互相调用吗?Standard Assets文件夹你拼写有错没?加s了吗?
这名称我好像是从书上源码的文件夹上复制过去,(其实也有点记不起是不是了) 只好回去再检查下有没有写S吧。
  • 打赏
  • 举报
回复
你已经到了互调的阶段了吗。。。 你这是两个双方向互相调用吗?Standard Assets文件夹你拼写有错没?加s了吗?
  • 打赏
  • 举报
回复
而且,你这样互掉是有问题的,JS掉了C#,C#又反过去调JS,因为有编译顺序,所以不可以这么双向调的 你可以看下面的参考: http://blog.csdn.net/fancylovejava/article/details/12257087 http://blog.csdn.net/candycat1992/article/details/22927713#t7

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧