Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)

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

时间: 2024-08-05 06:40:34

Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)的相关文章

unity 创建第一个JavaScript 脚本,附加物体之上 利用键盘 对物体进行移动 以及帧率显示

#pragma strict var speed : float = 100; var m_LastUpdateShowTime : float = 0f; //上一次更新帧率的时间; var m_UpdateShowDeltaTime : float =0.01f;//更新帧率的时间间隔; var m_FrameUpdate : int = 0;//帧数 var m_FPS : float = 0; function Awake () { Application.targetFrameRate

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

Unity 3d 脚本常用事件

1.学习笔记,每天晚上看看unity 3d 的教程 学点东西,先上一张图 这是 系统中脚本执行的顺序图 Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次:如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数不会执行:如果游戏对象的初始状态为开启状态,那么Awake函数会执行:值得注意的一点是,Awake函数的执行与否与脚本实例的状态(启用或禁用)并没有关系,而是与脚本实例所绑定的游戏对象的开关状态有

在<a></a>标签中调用javascript脚本

有时候,我们点击了<a></a>标签(除了跳转到指定链接外)想要它调用某个方法,及调用javascript脚本,该如何做: 方法1:<a href="javascript:void(0);" onclick="functionname()" >aaaa</a> 方法2:<a href="javascript:functionname('dd')" >ddddd</a> 方法3

unity中js脚本与c#脚本互相调用

unity中js脚本与c#脚本互相调用 test1.js function OnGUI() { if(GUI.Button(Rect(25,25,100,30),"JS Call CS" )) { var c = gameObject.GetComponent("test2"); c.PrintTest(); } } function testPrint() { print("CS Call JS"); } test2.cs using Unit

ASP.NET调用javascript脚本的方法总结

ASP.NET本身就提供了多种调用javascript脚本的方法,本文总结了六种调用方法,大家根据自己的使用习惯可以选择相应的调用方式了! 1.直接在前台调用 javascript 函数 很简单,在 head 元素之间加入 script 元素,将 type 元素设置为 " text/javascript " 如: <head runat="server"> <script type="text/javascript" >

webview调用javascript脚本无反应

最近遇到一个问题:在html中有一段javascript脚本定义了一个方法,在使用webview.loadUrl("javascript:方法名()")时方法未执行,后来 查资料发现是因为webview在加载html到页面是需要一定时间的虽然很短,如果html整个未加载完成会出现调用javascript的方法失败,提示找 不到方法定义对象的log信息.所以我们需要在页面完全加载完成后再回调webview.loadUrl("javascript:方法名()").这里可

Unity 3D 使用TerrainCompose 调用RTP 报错:

Unity 3D:5.2 version TerrainCompose:1.92 version RTP:3.2d version Unity 3D  使用TerrainCompose 调用RTP 报错: Can't access alphamapTexture directly...UnityEngine.Debug:LogError(Object)ReliefTerrain:GetControlMaps() (at Assets/ReliefPack/Scripts/ReliefTerrai