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

     Unity 3d C#Javascript脚本互相调用 解决方案

    1.背景知识

    脚本的编译过程分四步:

    . 编译所有 ”Standard AssetsPro Standard Assets” or Plugins” 目录下的代码

    . 编译所有Standard Assets/EditorPro Standard Assets/Editor” or Plugins/Editor” 目录下的代码

    . 编译除了上面列出来的目录和Editor目录之外的所有代码

    . 编译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

    下雨了,没伞的孩子就得拼命奔跑!
  • 相关阅读:
    Android开发之SQLite的使用方法
    【转】如何分析解决Android ANR
    error log
    33层高楼为什么27楼和28楼最贵 次顶层房价高原因揭秘
    Could not allocate CursorWindow size due to error -12 错误解决方法
    过来人讲述买房血泪史:什么样的房子不能碰
    cocos2d-x删除vs2010项目模板
    Lua学习笔记5:类及继承的实现
    Linux vsftpd服务配置具体解释
    Android_Dialog_设置Dialog窗体的大小
  • 原文地址:https://www.cnblogs.com/lengyuye171/p/3705018.html
Copyright © 2011-2022 走看看