客戶端:Unity3D開發(C#)html
服務器:Java (基於Java7)java
日 期:2016年09月git
部分服務器的部分邏輯功能在客戶端實現一遍,能夠簡單的理解爲服務器的部分邏輯代碼搬到客戶端來實現一遍。github
想到的辦法是代碼轉換。有兩個緣由:服務器
源代碼轉換就是指把Java的代碼轉換成C#的源代碼。ide
這樣作的好處是方便後續的開發和調試,有源碼更放心。工具
如下是幾個工具,用於Java源碼轉換到C#源碼性能
文檔:https://msdn.microsoft.com/zh-cn/library/1kwtxa08(v=vs.80).aspx測試
下載:https://www.microsoft.com/en-us/download/details.aspx?id=14349ui
visual studio 2008及以前的老版本集成此工具,但從visual studio2010起已不提供,故放棄之。
下載:https://sourceforge.net/projects/j2cstranslator/
介紹:http://www.cnblogs.com/Lawson/archive/2012/02/21/2361827.html
開源,免費,但13年至今未更新
官網:http://www.remotesoft.com/octopus/
收費,未進行詳細瞭解
官網:http://www.tangiblesoftwaresolutions.com/Product_Details/Java_to_CSharp_Converter.html
介紹:http://www.cnblogs.com/yiyan127/p/CSharp_CrackJava2CSharpConverter.html
收費,免費版有1000行代碼限制。看了官網介紹後,決定使用它。
官網:http://www.euclideanspace.com/software/language/xes/userGuide/convert/javaToCSharp/index.htm
下載:https://sourceforge.net/projects/xes/files/OldFiles/xes_java_runtime_alpha06.zip/download
免費,彷佛用起來並不那麼理想,目前的最新版本是2004年,未有更新,故放棄之。
通過對比以後,我選擇了Java to C# Coverter,此工具的更多詳情,能夠在官網的介紹中查看
轉換過程當中的信息信息,會出如今對話框中,同時也會標註在轉換後的代碼中。
本小節主要是說 IKVM在Unity中的使用。
IKVM下載:https://github.com/Unity-Technologies/kaizen/tree/master/bundles/IKVM.NET
話題討論
http://forum.unity3d.com/threads/building-project-with-ikvm-dlls-inside.101097/
下圖中,上圖是Java的源代碼,下方是轉換成Dll後反編譯查看的代碼。
引擎版本:Unity 4.0 / Unity 5.3.5 (目標平臺測試過 Windows和Android 平臺)
IKVM:ikvm-7.2.4630.5
OS:Windows 7 x64
下方是我測試過程當中出現的Error,出於性能和後期調試考慮,我放棄了此種方式,採用將Java代碼轉換成C#源碼的方式。
當在腳本的全局變量,返回值,協程中引用了java中的class,method時,就會報如下Error。
private ExampleLibrary exampleLibrary2; IEnumerator CoLog() { int idx = 0; ExampleLibrary exampleLibrary = new ExampleLibrary(); while (idx < 100) { DoLog(exampleLibrary.HelloWorld()); yield return null; idx++; } }
但若是是內部變量則不會有這些Error。
void TestLog() { ExampleLibrary exampleLibrary = new ExampleLibrary(); for (int idx = 0; idx < 20; idx++) { DoLog(exampleLibrary.HelloWorld()); } }
運行時Error
GameObject (named 'Main Camera') references runtime script in scene file. Fixing! The script behaviour 'IKVM_Java_HelloWorld' could not be instantiated!
Project中選中腳本時的Error
TypeLoadException: Could not load type 'IKVM_Java_HelloWorld' from assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. System.MonoType.GetFields (BindingFlags bindingAttr) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/MonoType.cs:164) UnityEditor.MonoScriptImporterInspector.ShowFieldInfo (System.Type type, UnityEditor.MonoImporter importer, System.Collections.Generic.List`1 names, System.Collections.Generic.List`1 objects, System.Boolean& didModify) (at C:/buildslave/unity/build/Editor/Mono/Inspector/MonoScriptInspector.cs:75) UnityEditor.MonoScriptImporterInspector.OnInspectorGUI () (at C:/buildslave/unity/build/Editor/Mono/Inspector/MonoScriptInspector.cs:117) UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1231) UnityEditor.DockArea:OnGUI()
https://github.com/zhaoqingqing/blog_samplecode/tree/master/technical-research/java-to-csharp