一键完成js脚本到c#脚本的转换

选择要转换的脚本,然后在上方菜单的工具栏中点击转换。

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class JStoC : EditorWindow
{
[MenuItem("Tools/Convert selected JS file(s) to C#")]
static void ConvertJStoC()
{
UnityEngine.Object[] objects = Selection.GetFiltered(typeof(MonoScript), SelectionMode.Editable);
int converted = 0;
foreach (UnityEngine.Object obj in objects)
{
if (obj.GetType().ToString() == "UnityEditor.MonoScript")
{
string jsFile = AssetDatabase.GetAssetPath(obj);
int jsEnd = jsFile.LastIndexOf(".js");
if (jsEnd <= 0)
{
Debug.LogError("JsToCs error: You did not select a .js file!");
return;
}
converted++;
string cFilename = jsFile.Substring(0, jsEnd);
cFilename += ".cs";
if (AssetDatabase.LoadAssetAtPath(cFilename, typeof(MonoScript)) != null)
{
Debug.LogError("JsToCs error: " + cFilename + " already exists!");
return;
}
string sourceCode = obj.ToString();
//string cCode = OnlineConvert(sourceCode, obj.name);
string cCode = ConvertToC(sourceCode, obj.name);
if (cCode == "")
{
Debug.LogError("Failed converting " + jsFile);
continue;
}

try
{
TextWriter tw = new StreamWriter(cFilename);
tw.Write(cCode);
tw.Close();
}
catch (System.IO.IOException IOEx)
{
Debug.LogError("Incorrect file permissions? "+IOEx);
}
//Optional: Delete old JS file
//AssetDatabase.DeleteAsset(jsFile);
AssetDatabase.ImportAsset(cFilename, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ImportRecursive);

Debug.Log("Converted " + Selection.activeObject.name + " to " + cFilename);
}
}
if (converted < 1)
{
Debug.LogError("You did not select a JS file to convert! " + objects.Length + " files selected.");
}
}
static string ConvertToC(string output, string className)
{
string VAR = @"[A-Za-z0-9_\[\]\.]";
string VAR_NONARRAY = @"[A-Za-z0-9_]";
string[] patterns = new string[32];
string[] replacements = new string[32];
int patrs = 0;
int reps = 0;
//var AAA;
patterns[patrs++] = @"var(\s+)(" + VAR_NONARRAY + @"+)(\s*);";
replacements[reps++] = "FIXME_VAR_TYPE $2;";
// var AAAA : XXX
patterns[patrs++] = @"var(\s+)(" + VAR_NONARRAY + @"+)(\s*):(\s*)(" + VAR + @"+)";
replacements[reps++] = "$5 $2";
// var AAAA =
patterns[patrs++] = @"var(\s+)(" + VAR_NONARRAY + @"+)(\s*)=";
replacements[reps++] = "FIXME_VAR_TYPE $2=";
//Try to fix the "FIXME_VAR_TYPE" for strings;
patterns[patrs++] = @"FIXME_VAR_TYPE(\s+)(" + VAR_NONARRAY + @"+)(\s*)=(\s*)""";
replacements[reps++] = "string $2 = \"";
//Try to fix the "FIXME_VAR_TYPE" for floats;
patterns[patrs++] = @"FIXME_VAR_TYPE(\s+)(" + VAR_NONARRAY + @"+)(\s*)=(\s*)(([0-9\-]*\.+[0-9]+[f]?)+)(\s*);";
replacements[reps++] = "float $2 = $5;";
//Try to fix the "FIXME_VAR_TYPE" for int;
patterns[patrs++] = @"FIXME_VAR_TYPE(\s+)(" + VAR_NONARRAY + @"+)(\s*)=(\s*)([0-9\-]+)(\s*);";
replacements[reps++] = "float $2 = $5;";
//Try to fix the "FIXME_VAR_TYPE" for bool true/false;
patterns[patrs++] = @"FIXME_VAR_TYPE(\s+)(" + VAR_NONARRAY + @"+)(\s*)=(\s*)true(\s*);";
replacements[reps++] = "bool $2 = true;";
patterns[patrs++] = @"FIXME_VAR_TYPE(\s+)(" + VAR_NONARRAY + @"+)(\s*)=(\s*)false(\s*);";
replacements[reps++] = "bool $2 = false;";
//0.05f
patterns[patrs++] = @"([\s\t\r\n\,=\( ]*)(\d+)\.(\d+)([\s\t\r\,;\) ]*)";
replacements[reps++] = "$1$2.$3f$4";
//Style
patterns[patrs++] = "\n\n\n";
replacements[reps++] = "\n";
//RPC
patterns[patrs++] = @"([\n\s\(\)\{\}\r]+)@RPC";
replacements[reps++] = "$1[RPC]";
//boolean
patterns[patrs++] = @"([\n\t\s \(\)\{\}\r:;]*)\bboolean\b([\n\t\s \,\[=\(\)\{\}\r]+)";
replacements[reps++] = "${1}bool${2} ";
//String
patterns[patrs++] = @"([\n\t\s \(\)\{\}\r:;]*)\bString\b([\n\t\s \,\[=\(\)\{\}\r]+)";
replacements[reps++] = "${1}string${2}";
//Remove #pragma strict
patterns[patrs++] = "#pragma strict";
replacements[reps++] = "";
patterns[patrs++] = "#pragma implicit";
replacements[reps++] = "";
patterns[patrs++] = "#pragma downcast";
replacements[reps++] = "";
//parseInt parseFloat
patterns[patrs++] = "parseInt";
replacements[reps++] = "int.Parse";
patterns[patrs++] = "parseFloat";
replacements[reps++] = "float.Parse";
// (Rect(
patterns[patrs++] = @"([]\(=)]+)[\s]*Rect[\s]*\(";
replacements[reps++] = "${1} new Rect(";
//Yield
patterns[patrs++] = @"yield(\s+)(\w+);";
replacements[reps++] = "yield return ${2};";
patterns[patrs++] = @"yield;";
replacements[reps++] = "yield return 0;";
patterns[patrs++] = @"yield(\s+)(\w+)\(";
replacements[reps++] = "yield return new ${2}(";
patterns[patrs++] = @"yield new";
replacements[reps++] = "yield return new";
//For -> foreach
patterns[patrs++] = @"for[\s]*\(([A-Za-z0-9_ :\,\.\[\]\s\n\r\t]*) in ([A-Za-z0-9_ :\,\.\s\n\r\t]*)\)";
replacements[reps++] = "foreach($1 in $2)";
//function rewrite
patterns[patrs++] = @"function(\s+)(\w+)(\s*)\(([\n\r\tA-Za-z0-9_\[\]\*\/ \.:\,]*)\)(\s*):(\s*)(" + VAR + @"+)(\s*)\{";
replacements[reps++] = "$7 $2 ($4){";
//function rewrite
patterns[patrs++] = @"function(\s+)(\w+)(\s*)\(([\n\r\tA-Za-z0-9_\[\]\*\/ \.:\,]*)\)(\s*)\{";
replacements[reps++] = @"void $2 ($4){";
//Getcomponent
patterns[patrs++] = @"AddComponent\(([\n\r\tA-Za-z0-9_ ""]*)\)";
replacements[reps++] = "AddComponent<$1>()";
patterns[patrs++] = @"GetComponent\(([\n\r\tA-Za-z0-9_ ""]*)\)";
replacements[reps++] = "GetComponent<$1>()";
patterns[patrs++] = @"GetComponentsInChildren\(([\n\r\tA-Za-z0-9_ ""]*)\)";
replacements[reps++] = "GetComponentsInChildren<$1>()";
patterns[patrs++] = @"GetComponentInChildren\(([\n\r\tA-Za-z0-9_ ‘‘""]*)\)";
replacements[reps++] = "GetComponentInChildren<$1>()";
patterns[patrs++] = @"FindObjectsOfType\(([\n\r\tA-Za-z0-9_ ""]*)\)";
replacements[reps++] = "FindObjectsOfType(typeof($1))";
patterns[patrs++] = @"FindObjectOfType\(([\n\r\tA-Za-z0-9_ ‘‘""]*)\)";
replacements[reps++] = "FindObjectOfType(typeof($1))";
output = PregReplace(output, patterns, replacements);
string before = "";
while (before != output)
{
//( XX : YY) rewrite
before = output;
string patt = @"\(([\t\n\rA-Za-z0-9_*\/ \.\,\]\[]*)\b(\w+)\b(\s*):(\s*)(" + VAR + @"+)([\s\,]*)([\[\]\n\r\t\sA-Za-z0-9_\*\/ :\,\.]*)\)";
string repp = "(${1} ${5} ${2} ${6} ${7})";//‘(${1} 5--${5}-- 2--${2}-- 5--${6}-- 7=--${7})‘
output = Regex.Replace(output, patt, repp);
}
output = "using UnityEngine;\nusing System.Collections;\n\npublic class " + className + " : MonoBehaviour {\n" + output + "\n}";
return output;
}
// If the Unity store updating doesn‘t work well enough I might allow online covnerting
/*static string OnlineConvert(string input, string className)
{
WWWForm wwwForm = new WWWForm();
wwwForm.AddField("oldJS", input);
WWW www = new WWW("http://www.m2h.nl/files/js_to_c.php?noprint=1", wwwForm);
while (!www.isDone) { }
if (www.error != null)
Debug.LogError("Error converting: " + www.error);
else
{
string cCode = www.text;
cCode = cCode.Replace("MYCLASSNAME", className);
return cCode;
}
return "";
}*/
static string PregReplace(string input, string[] pattern, string[] replacements)
{
if (replacements.Length != pattern.Length)
throw new ArgumentException("Replacement and Pattern Arrays must be balanced");
for (var i = 0; i < pattern.Length; i++)
{
input = Regex.Replace(input, pattern[i], replacements[i]);
}
return input;
}
}

时间: 2024-07-30 10:44:47

一键完成js脚本到c#脚本的转换的相关文章

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现

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

LNMP一键安装包 PHP自动升级脚本

LNMP一键安装包 PHP自动升级脚本 2011年03月15日 上午 | 作者:VPS侦探 前一段时间完成了lnmp一键安装包的PHP自动升级脚本,今天发布出来,如果想升级PHP版本的lnmp用户可以试用一下.支持目前lnmp的所有版本. 只能有低版本升级到高版本不能降级.可以升级到现有PHP 5.2.14到PHP 5.3.5除5.3.0.5.3.1.5.3.2的几个过渡版本之外的PHP版本,如果PHP发布新的版本,只有安装方式上不发生变化就可以一直使用.注意:升级PHP后eaccelerato

JS 动态加载脚本 执行回调

JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发

js和PHP等脚本语言for循环和if语句里面定义变量的作用域

在js和PHP等脚本语言中for循环中的定义变量,会先把var l 提到for循环外面,(只会定义一次l),所以for循环外面可以输出l var a=0; if(a==0) { var i=1; } alert(i); for(var j=0;j 在c#等语言中 for(int i=0;ijs和PHP等脚本语言for循环和if语句里面定义变量的作用域

浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及其他的细节问题.而除了defer和async特性,动态脚本和Ajax脚本注入也是两种常用的创建无阻塞脚本的方法.总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机还是有一定差异,今天我们再来探讨一下通过动态脚本技术和Ajax注入的脚本在这些方

JavaScript值延迟脚本和异步脚本

Html 4.0为<script>标签定义了defer属性,这个属性的用途是表名脚本在执行时,不会影响页面的构造.也就是说,脚本会延迟到整个页面解析完毕之后在运行,因此,在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行.但是有一种特殊情况,看如下代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C

cocos2d-js 在线更新代码脚本 动态更新脚本程序 热更新

一.cocos2d-js 动态更新的基本思路 动态更新的好处不言而喻,不需要重新上架审核,能节省很多时间,也能让用户尽快使用上最新的版本,减少下载的成本. 官方BETA版本后提供了AssetsManager类,可以完成动态更新的步骤,说明:https://github.com/chukong/cocos-docs/blob/master/manual/framework/html5/v3/assets-manager/zh.md cocos2d程序安装后,以Android为例,程序存在于2个地方

Unity3D热更新全书-脚本(一) 初识脚本

开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答,因为其中混合着太多有立场的东西,站在不同的立场会有不同的看法,这其中的矛盾不是简单可以调和的. 只要提出一个观点,就很容易陷入语言大战的泥潭. 我们不妨从另一个角度来思考,为什么要分程序和脚本,是为了找一条分界线. 这条分界线叫做灵活. 我们这个专题的出发点是探讨Unity3D客户端资源更新,已这

系统优化脚本(此脚本为原始脚本,未按照shell规范写)

系统优化脚本 #!/bin/sh user=alan #shutdown iptables chkconfig iptables off  && /etc/init.d/iptables stop   #shutdown selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  cat /etc/selinux/config  setenforce 0  getenforce &&