diff --git a/BindGenerater/BindGenerater.csproj b/BindGenerater/BindGenerater.csproj index c2bcadb..5c398f3 100644 --- a/BindGenerater/BindGenerater.csproj +++ b/BindGenerater/BindGenerater.csproj @@ -1,5 +1,5 @@  - + Debug @@ -36,6 +36,9 @@ ..\packages\Humanizer.Core.2.2.0\lib\netstandard1.0\Humanizer.dll + + ..\packages\ICSharpCode.Decompiler.6.2.1.6137\lib\netstandard2.0\ICSharpCode.Decompiler.dll + ThirdParty\Mono.Cecil.dll @@ -67,19 +70,14 @@ - - ..\ScriptEngine\Tools\ICSharpCode.Decompiler.dll - - - - + @@ -96,8 +94,6 @@ - - diff --git a/BindGenerater/Generater/AOTGenerater.cs b/BindGenerater/Generater/AOTGenerater.cs index 50448b9..3b4fee1 100644 --- a/BindGenerater/Generater/AOTGenerater.cs +++ b/BindGenerater/Generater/AOTGenerater.cs @@ -14,15 +14,18 @@ public static class AOTGenerater static CodeWriter NinjaWriter; static CodeWriter ModuleRegisterWriter; static Dictionary AOTDic = new Dictionary(); + static Dictionary> StrpDic = new Dictionary>(); static string WorkDir; static string ManagedDir; static string AotDir; static bool needAOT; - public static void Init(string workDir) + public static void Init(string workDir, Dictionary> stripDic) { WorkDir = workDir; - + if (stripDic == null) + stripDic = new Dictionary>(); + StrpDic = stripDic; ManagedDir = Path.Combine(workDir, "Managed"); NinjaWriter = new CodeWriter(File.CreateText(Path.Combine(ManagedDir, "build.ninja"))); NinjaWriter._eol = ""; @@ -39,7 +42,33 @@ public static void AddAOTAssembly(string file) File.Delete(tmp); AOTDic[Path.GetFileName(file)] = assembly.Name.Name.Replace(".","_").Replace("-","_"); - assembly.Dispose(); + + if (needAOT) + { + var fName = Path.GetFileName(file); + if (StrpDic.TryGetValue(fName, out var sList)) + { + foreach (var strips in sList) + { + var info = strips.Split(':'); + var type = assembly.MainModule.GetType(info[0]); + var method = type?.Methods.FirstOrDefault(m => m.Name == info[1]); + if (method != null) + type?.Methods.Remove(method); + } + + assembly.Write(tmp); + } + + assembly.Dispose(); + + if (File.Exists(tmp)) + { + File.Copy(tmp, file, true); + File.Delete(tmp); + } + } + } public static void End() @@ -80,10 +109,6 @@ public static void End() if(needAOT) { - var tmpdir = Path.Combine(WorkDir, "temp"); - if (!Directory.Exists(tmpdir)) - Directory.CreateDirectory(tmpdir); - var res = Utils.RunCMD("ninja", new string[] { }, ManagedDir); if (res != 0) throw new Exception($"Run ninja with dir {ManagedDir} error. "); diff --git a/BindGenerater/Generater/AstNodeExtensions.cs b/BindGenerater/Generater/AstNodeExtensions.cs deleted file mode 100644 index 706108e..0000000 --- a/BindGenerater/Generater/AstNodeExtensions.cs +++ /dev/null @@ -1,63 +0,0 @@ -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.Semantics; -using ICSharpCode.Decompiler.TypeSystem; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -public static class AstNodeExtensions -{ - public static ResolveResult Resolve(this AstNode node) - { - var res = node.Annotation(); - return res; - } - - public static int GetToken(this AstNode node) - { - var entity = Resolve(node).GetSymbol() as IEntity; - if (entity != null) - return entity.MetadataToken.GetHashCode(); - return 0; - } - - public static string SimpleTypeName(this AstType tNode) - { - var simple = tNode as SimpleType; - if (simple != null) - return simple.Identifier; - - return null; - } - - public static List GetChildsOf(this AstNode node) where T : AstNode - { - List result = new List(); - AstNode m = node as AstNode; - foreach (AstNode n in m.Children) - { - if (n.GetType() == typeof(T)) - { - result.Add(n as T); - } - result.AddRange(GetChildsOf(n)); - } - return result; - - } - public static T GetParentOf(this AstNode node) where T : AstNode - { - AstNode m = node as AstNode; - while (m.Parent != null) - { - var p = m.Parent as T; - if (p != null) - return p; - - m = m.Parent; - } - return default(T); - } -} diff --git a/BindGenerater/Generater/Binder.cs b/BindGenerater/Generater/Binder.cs index 5f7c26d..9eecbc8 100644 --- a/BindGenerater/Generater/Binder.cs +++ b/BindGenerater/Generater/Binder.cs @@ -1,7 +1,6 @@ using Generater.C; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.CSharp; -using ICSharpCode.Decompiler.TypeSystem; using Mono.Cecil; using System; using System.Collections.Generic; @@ -15,39 +14,43 @@ namespace Generater public static class Binder { static Queue generaters = new Queue(); - static Dictionary types = new Dictionary(); + static HashSet types = new HashSet(); static HashSet moduleSet = new HashSet(); static HashSet moduleTypes; - static HashSet refTypes = new HashSet(); public static string OutDir; - - public static Dictionary DecompilerDic = new Dictionary(); + public static CodeWriter FuncDefineWriter; + public static CodeWriter FuncSerWriter; + public static CodeWriter FuncDeSerWriter; + public static CSharpDecompiler Decompiler; public static DecompilerSettings DecompilerSetting; - public static string ManagedDir; - public static ModuleDefinition curModule; - public static HashSet UnityCoreModuleSet = new HashSet + private static string[] IgnorTypes = new string[] { - "UnityEngine.SharedInternalsModule.dll", - "UnityEngine.CoreModule.dll" + "System.Collections", + "UnityEditor", }; - public static HashSet retainTypes = Config.Instance.ForceRetainTypes; - public static void Init(string outDir) { OutDir = outDir; if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - Utils.IgnoreTypeSet.UnionWith(Config.Instance.CSharpIgnorTypes); + FuncDefineWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.define.cs"))); + FuncSerWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.funcser.cs"))); + FuncDeSerWriter = new CodeWriter(File.CreateText(Path.Combine(outDir, "Binder.funcdeser.cs"))); + + Utils.IgnoreTypeSet.UnionWith(IgnorTypes); } public static void End() { TypeResolver.WrapperSide = false; - GenerateBindings.End(); + GenerateBindings.Gen(); + FuncDefineWriter.EndAll(); + FuncSerWriter.EndAll(); + FuncDeSerWriter.EndAll(); foreach (var m in moduleSet) m.Dispose(); @@ -57,39 +60,37 @@ public static void End() public static void Bind(string dllPath) { - var file = Path.GetFileName(dllPath); + /*var file = Path.GetFileName(dllPath); + if (IgnoreAssemblySet.Contains(file)) + return;*/ DecompilerSetting = new DecompilerSettings(LanguageVersion.CSharp7); DecompilerSetting.ThrowOnAssemblyResolveErrors = false; - DecompilerSetting.UseExpressionBodyForCalculatedGetterOnlyProperties = false; - - ManagedDir = Path.GetDirectoryName(dllPath); + Decompiler = new CSharpDecompiler(dllPath, DecompilerSetting); + var dir = Path.GetDirectoryName(dllPath); DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); - resolver.AddSearchDirectory(ManagedDir); + resolver.AddSearchDirectory(dir); ReaderParameters parameters = new ReaderParameters() { AssemblyResolver = resolver, ReadSymbols = false, }; - curModule = ModuleDefinition.ReadModule(dllPath, parameters); - moduleSet.Add(curModule); - ICallGenerater.AddWrapperAssembly(curModule.Assembly.Name.Name); - CSCGenerater.SetWrapper(file); - GenerateBindings.StartWraper(file); - CSCGenerater.AdapterCompiler.AddReference(curModule.Name); - foreach(var refAssembly in curModule.AssemblyReferences ) + ModuleDefinition module = ModuleDefinition.ReadModule(dllPath, parameters); + moduleSet.Add(module); + ICallGenerater.AddWrapperAssembly(module.Assembly.Name.Name); + CSCGenerater.AdapterCompiler.AddReference(module.Name); + foreach(var refAssembly in module.AssemblyReferences ) { CSCGenerater.AdapterCompiler.AddReference(refAssembly.Name + ".dll"); CSCGenerater.AdapterWrapperCompiler.AddReference(refAssembly.Name + ".dll"); } - CSCGenerater.AdapterWrapperCompiler.RemoveReference(curModule.Name); - moduleTypes = new HashSet(curModule.Types); + moduleTypes = new HashSet(module.Types); foreach (TypeDefinition type in moduleTypes) { - if ((!type.IsPublic || type.IsInterface) && !retainTypes.Contains(type.FullName)) + if (!type.IsPublic) continue; AddType(type); @@ -104,18 +105,14 @@ public static void Bind(string dllPath) gener.Gen(); } generaters.Clear(); - - GenerateBindings.Gen(); } public static void AddType(TypeDefinition type) { if (type == null || !moduleTypes.Contains(type)) return; - - if (types.ContainsKey(type.FullName)) + if (!types.Add(type)) return; - types[type.FullName] = type; if (!Utils.Filter(type)) return; @@ -123,28 +120,5 @@ public static void AddType(TypeDefinition type) generaters.Enqueue(new ClassGenerater(type)); } - - public static void AddTypeRef(TypeReference type) - { - refTypes.Add(type); - var td = type.Resolve(); - if (td == null) - return; - AddType(td); - } - - public static CSharpDecompiler GetDecompiler(string module) - { - CSharpDecompiler decompiler = null; - - if (DecompilerDic.TryGetValue(module, out decompiler)) - return decompiler; - - var dllPath = Path.Combine(ManagedDir, module); - decompiler = new CSharpDecompiler(dllPath, DecompilerSetting); - DecompilerDic[module] = decompiler; - return decompiler; - } - } } \ No newline at end of file diff --git a/BindGenerater/Generater/C/CTypeResolver.cs b/BindGenerater/Generater/C/CTypeResolver.cs index 6dbab56..4888d5f 100644 --- a/BindGenerater/Generater/C/CTypeResolver.cs +++ b/BindGenerater/Generater/C/CTypeResolver.cs @@ -224,7 +224,7 @@ public RefTypeResolver(TypeReference _type, bool _il2cppType) : base(_type, _il2 public override string Box(string name, bool previous = false) { var reName = $"mono{name}"; - var classCache = ClassCacheGenerater.GetClass(type); + var classCache = ClassCacheGenerater.GetClass(type.Resolve()); if(type.FullName == "UnityEngine.Object" || type.FullName == "System.Object") classCache = $"get_mono_class(il2cpp_object_get_class({name}))"; @@ -242,7 +242,7 @@ public override string Unbox(string name, bool previous = false) string classCache = "NULL"; if (type.Namespace.StartsWith("UnityEngine")) { - classCache = ClassCacheGenerater.GetClass(type, true); + classCache = ClassCacheGenerater.GetClass(type.Resolve(), true); // if (type.FullName == "UnityEngine.Object" || type.FullName == "System.Object") // classCache = $"get_il2cpp_class(mono_object_get_class({name}))"; } @@ -318,7 +318,7 @@ public override string Box(string name, bool previous = false) var eType = type.GetElementType(); if(eType.Name != "String") - ClassCacheGenerater.GetClass(type.GetElementType()); + ClassCacheGenerater.GetClass(type.GetElementType().Resolve()); var reName = $"mono{name}"; var cmd = $"MonoArray* {reName} = get_mono_array({name})"; diff --git a/BindGenerater/Generater/C/CUtils.cs b/BindGenerater/Generater/C/CUtils.cs index 483d3cd..5bce60e 100644 --- a/BindGenerater/Generater/C/CUtils.cs +++ b/BindGenerater/Generater/C/CUtils.cs @@ -106,26 +106,25 @@ static string GetSignName(MethodDefinition method) return name; } - /*public static bool Filter(PropertyDefinition property) + public static bool Filter(PropertyDefinition property) { foreach (var attr in property.CustomAttributes) { if (attr.AttributeType.Name.Equals("ObsoleteAttribute")) return false; } - return true; - }*/ + } public static bool Filter(MethodDefinition method) { - if (!Filter(method.ReturnType)) + if (!Filter(method.ReturnType))// || !HaveHeadPtr(method.ReturnType) return false; foreach (var p in method.Parameters) { - if (p.ParameterType.IsByReference && !Utils.IsFullValueType(p.ParameterType.GetElementType())) + if (p.ParameterType.IsByReference && !p.ParameterType.GetElementType().IsValueType) return false; - if (!Filter(p.ParameterType)) + if (!Filter(p.ParameterType)) // || !HaveHeadPtr(p.ParameterType) return false; } @@ -151,9 +150,6 @@ public static bool Filter(TypeReference type) if (type.FullName.Contains(t)) return false; } - var td = type.Resolve(); - if (td != null && td.IsStruct() && !Utils.IsFullValueType(td)) - return false; return true; } diff --git a/BindGenerater/Generater/C/ClassCacheGenerater.cs b/BindGenerater/Generater/C/ClassCacheGenerater.cs index 72fdc31..3b86adf 100644 --- a/BindGenerater/Generater/C/ClassCacheGenerater.cs +++ b/BindGenerater/Generater/C/ClassCacheGenerater.cs @@ -52,12 +52,11 @@ public static string GetAssembly(string name, bool il2cpp) return GetImageDefine(name, il2cpp); } - public static string GetClass(TypeReference type,bool il2cpp = false) + public static string GetClass(TypeDefinition type,bool il2cpp = false) { - var td = type.Resolve(); - var filePath = td.Module.Assembly.MainModule.FileName; + var filePath = type.Module.Assembly.MainModule.FileName; - return GetClass(Path.GetFileNameWithoutExtension(filePath), td.Namespace, td.Name, il2cpp); + return GetClass(Path.GetFileNameWithoutExtension(filePath), type.Namespace, type.Name, il2cpp); } public static string GetClass(string _assembly ,string _namespace,string name, bool il2cpp) diff --git a/BindGenerater/Generater/C/EventGenerater.cs b/BindGenerater/Generater/C/EventGenerater.cs index 83a022c..2d1a17a 100644 --- a/BindGenerater/Generater/C/EventGenerater.cs +++ b/BindGenerater/Generater/C/EventGenerater.cs @@ -28,8 +28,7 @@ public static void Gen() CS.Writer.WriteLine("#include \"event_binding.h\"", false); CS.Writer.WriteLine("#include \"class_cache_gen.h\"", false); - if(methodSet.Count > 0) - CS.Writer.WriteLine($"EventMethodDesc methods[{methodSet.Count}]"); + CS.Writer.WriteLine($"EventMethodDesc methods[{methodSet.Count}]"); int index = 0; foreach (var m in methodSet) diff --git a/BindGenerater/Generater/C/ICallGenerater.cs b/BindGenerater/Generater/C/ICallGenerater.cs index 64e97a2..0009f3d 100644 --- a/BindGenerater/Generater/C/ICallGenerater.cs +++ b/BindGenerater/Generater/C/ICallGenerater.cs @@ -17,7 +17,6 @@ static ICallGenerater() static HashSet methodSet = new HashSet(); static HashSet wrapperAssemblySet = new HashSet(); - static HashSet ReloableAssemblySet = new HashSet(); public static void AddMethod(MethodDefinition method) { if(!CUtils.IsCustomICall(CUtils.GetICallDescName(method))) @@ -28,12 +27,6 @@ public static void AddWrapperAssembly(string name) { wrapperAssemblySet.Add(name); } - public static void AddReloableAssembly(string name) - { - if (name.EndsWith(".dll")) - name = name.Substring(0, name.Length - 4); - ReloableAssemblySet.Add(name); - } public static void Gen() { @@ -108,12 +101,8 @@ void register_assembly_map() private static void RegisterAssemblyMap() { CS.Writer.Start("void register_assembly_map()"); - /*foreach(var assembly in wrapperAssemblySet) - CS.Writer.WriteLine($"insert_assembly_map(\"{assembly}\", \"Adapter.wrapper\")");*/ - - foreach (var assembly in ReloableAssemblySet) - CS.Writer.WriteLine($"insert_reloadable(\"{assembly}\", NULL)"); - + foreach(var assembly in wrapperAssemblySet) + CS.Writer.WriteLine($"insert_assembly_map(\"{assembly}\", \"Adapter.wrapper\")"); CS.Writer.End(); } } diff --git a/BindGenerater/Generater/CBinder.cs b/BindGenerater/Generater/CBinder.cs index a33ae92..3e48d4e 100644 --- a/BindGenerater/Generater/CBinder.cs +++ b/BindGenerater/Generater/CBinder.cs @@ -18,7 +18,28 @@ public static void Init(string outDir) if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - CUtils.IgnoreTypeSet = new HashSet(Config.Instance.ICallIgnorTypes); + string[] ignore = new string[] + { + //"System.Type", + "System.Reflection", + "UnityEngine.WSA", + "UnityEngine.XR.WSA", + "UnityEngine.StackTraceUtility", + "Unity.Burst.LowLevel", + "Audio.AudioSampleProvider", + "BuiltinRuntimeReflectionSystem", + "ScriptableRuntimeReflectionSystemWrapper", + "IScriptableRuntimeReflectionSystem", + "SubsystemDescriptor", + "System.Collections.IDictionary", + "UnityEngine.SocialPlatforms", + "UnityEngine.iOS.LocalNotification", + "UnityEngine.AttributeHelperEngine", + "UnityEngine.ComputeBuffer" + //UnsafeUtility? + }; + + CUtils.IgnoreTypeSet = new HashSet(ignore); } public static void End() @@ -52,6 +73,11 @@ public static void Bind(string dllPath) foreach (TypeDefinition type in moduleTypes) { //Utils.Log(type.FullName); + if(!CUtils.Filter(type)) + { + Utils.Log("ignor type:" + type.FullName); + continue; + } foreach (var method in type.Methods) { diff --git a/BindGenerater/Generater/CSharp/CSCGenerater.cs b/BindGenerater/Generater/CSharp/CSCGenerater.cs index d77aee1..c7c3d71 100644 --- a/BindGenerater/Generater/CSharp/CSCGenerater.cs +++ b/BindGenerater/Generater/CSharp/CSCGenerater.cs @@ -17,8 +17,7 @@ public class CSCGenerater static string[] addtionRef = new string[] { "mscorlib.dll", - "UnityEngine.CoreModule.dll", - //"PureScript.dll", + "PureScript.dll", }; private static string CSCPath = "csc"; @@ -26,101 +25,59 @@ public class CSCGenerater private static string[] AdapterSrc = new string[] { - "glue/Binder.impl.cs", + "glue/Binder.define.cs", + "glue/Binder.funcser.cs", "Tools/CustomBinder.cs", "Tools/ObjectStore.cs", + "Tools/StringStore.cs", }; private static string[] AdapterWrapperSrc = new string[] { + "glue/Binder.define.cs", + "glue/Binder.funcdeser.cs", "Tools/CustomBinder.cs", "Tools/ObjectStore.wrapper.cs", "Tools/ScriptEngine.cs", + "Tools/StringStore.cs", }; public static CSCGenerater AdapterCompiler; public static CSCGenerater AdapterWrapperCompiler; private static string OutDir; - private static string DllRefDir; private static string AdapterDir; private static HashSet IgnoreRefSet = new HashSet(); - private static Dictionary WrapperDic = new Dictionary(); - public static void Init(string cscDir,string adapterDir, string outDir, HashSet ignoreRefSet) + public static void Init(string cscDir,string adapterDir,string outDir,HashSet ignoreRefSet) { CSCPath = Path.Combine(cscDir, Utils.IsWin32() ? "csc.exe":"csc") ; OutDir = outDir; - DllRefDir = outDir; AdapterDir = adapterDir; IgnoreRefSet = ignoreRefSet; AdapterCompiler = new CSCGenerater(Path.Combine(outDir, "Adapter.gen.dll")); - + AdapterWrapperCompiler = new CSCGenerater(Path.Combine(outDir, "Adapter.wrapper.dll")); + foreach(var file in AdapterSrc) AdapterCompiler.AddSource(Path.Combine(adapterDir,file)); - AdapterCompiler.refSet.Add("PureScript.dll"); - SetWrapper("Adapter.wrapper.dll"); foreach (var file in AdapterWrapperSrc) AdapterWrapperCompiler.AddSource(Path.Combine(adapterDir, file)); - } - - public static void SetWrapper(string dllName) - { - if (!WrapperDic.TryGetValue(dllName,out AdapterWrapperCompiler)) - { - AdapterWrapperCompiler = new CSCGenerater(Path.Combine(OutDir, dllName)); - //foreach (var file in AdapterWrapperSrc) - // AdapterWrapperCompiler.AddSource(Path.Combine(AdapterDir, file)); - AdapterWrapperCompiler.AddDefine("WRAPPER_SIDE"); - if (!Utils.IsWin32()) - AdapterWrapperCompiler.AddDefine("IOS"); - - WrapperDic[dllName] = AdapterWrapperCompiler; - - if (dllName != "Adapter.wrapper.dll") - AdapterWrapperCompiler.AddReference("Adapter.wrapper.dll"); - } + AdapterWrapperCompiler.AddDefine("WRAPPER_SIDE"); + if(!Utils.IsWin32()) + AdapterWrapperCompiler.AddDefine("IOS"); } public static void End() { + AdapterCompiler.Gen(); - //AdapterWrapperCompiler.Gen(); - var list = GetSortedList(); - foreach (var wrapper in list) - { - wrapper.Gen(); - } - } - - private static List GetSortedList() - { - foreach (var wrapper in WrapperDic.Values) - { - CountRef(wrapper); - } - var list = new List(WrapperDic.Values); - list.Sort((a, b) => { return b.RefCount - a.RefCount; }); - return list; - } - - private static void CountRef(CSCGenerater gener) - { - foreach (var depend in gener.refSet) - { - if (WrapperDic.TryGetValue(depend, out var dependGener)) - { - dependGener.RefCount++; - CountRef(dependGener); - } - } + AdapterWrapperCompiler.Gen(); } - public string outName { get; private set; } - public HashSet refSet = new HashSet(); - public int RefCount = 0; + string outName; + HashSet refSet = new HashSet(); HashSet srcSet = new HashSet(); HashSet defineSet = new HashSet(); @@ -132,12 +89,7 @@ public CSCGenerater(string targetName) public void AddReference(string target) { //if(!IgnoreRefSet.Contains(target)) - refSet.Add(target); - } - public void RemoveReference(string target) - { - //if(!IgnoreRefSet.Contains(target)) - refSet.Remove(target); + refSet.Add(target); } public void AddSource(string file) @@ -160,15 +112,15 @@ public void Gen() foreach (var flag in addtionFlag) config.WriteLine(flag); foreach (var refFile in addtionRef) - config.WriteLine($"-r:{Path.Combine(DllRefDir, refFile)}"); + config.WriteLine($"-r:{Path.Combine(OutDir, refFile)}"); foreach (var refFile in refSet) - config.WriteLine($"-r:{Path.Combine(DllRefDir, refFile)}"); + config.WriteLine($"-r:{Path.Combine(OutDir, refFile)}"); foreach (var define in defineSet) config.WriteLine($"-define:{define}"); var netstandFile = Path.Combine(OutDir, "netstandard.dll"); if(File.Exists(netstandFile)) - config.WriteLine($"-r:{Path.Combine(DllRefDir, netstandFile)}"); + config.WriteLine($"-r:{Path.Combine(OutDir, netstandFile)}"); foreach (var src in srcSet) config.WriteLine(src); @@ -176,7 +128,7 @@ public void Gen() int res = Utils.RunCMD(CSCPath, new string[] { $"@{fName}" }); if (res != 0) - throw new Exception($"Run CSC error,with: {CSCPath} @{fName}"); + throw new Exception($"Run CSC with {fName} error. "); } /*public void AddTypeForwardedTo(string typeName) { diff --git a/BindGenerater/Generater/CSharp/ClassGenerater.cs b/BindGenerater/Generater/CSharp/ClassGenerater.cs index 99ab8e0..e8a35b5 100644 --- a/BindGenerater/Generater/CSharp/ClassGenerater.cs +++ b/BindGenerater/Generater/CSharp/ClassGenerater.cs @@ -18,28 +18,21 @@ public class ClassGenerater : CodeGenerater private List properties = new List(); private List events = new List(); private List methods = new List(); - private Dictionary nestType = new Dictionary(); + private List nestType = new List(); private bool hasDefaultConstructor = false; - private bool isCopyOrignType; - private bool isFullRetainType; + private bool isFullValueType; private StreamWriter FileStream; public HashSet RefNameSpace = new HashSet(); - - - Dictionary retainDic = new Dictionary(); - public TokenMapVisitor nodesCollector; public ClassGenerater(TypeDefinition type, StreamWriter writer = null) { genType = type; - RefNameSpace.Add("System"); RefNameSpace.Add("PureScript.Mono"); - RefNameSpace.Add("System.Runtime.CompilerServices"); - + if (writer == null) { - var filePath = Path.Combine(Binder.OutDir, $"Gen.{TypeFullName()}.cs"); + var filePath = Path.Combine(Binder.OutDir, $"Binder.{TypeFullName()}.cs"); CSCGenerater.AdapterWrapperCompiler.AddSource(filePath); FileStream = File.CreateText(filePath); } @@ -47,11 +40,8 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null) { FileStream = writer; } - - isCopyOrignType = IsCopyOrignType(genType); - CheckCopyOrignNodes(); - if (isFullRetainType) - return; + + isFullValueType = Utils.IsFullValueType(genType); if (type.BaseType != null) RefNameSpace.Add(type.BaseType.Namespace); @@ -63,25 +53,24 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null) if ((t.IsPublic || t.IsNestedPublic) && !Utils.IsObsolete(t)) { var nestGen = new ClassGenerater(t, FileStream); - nestType[t] = nestGen; + nestType.Add(nestGen); RefNameSpace.UnionWith(nestGen.RefNameSpace); } } - if (!isCopyOrignType) + if(!isFullValueType) { foreach (FieldDefinition field in genType.Fields) { - // if (isFullValueType && !field.IsStatic) - // continue; if (field.IsPublic) { properties.Add(new PropertyGenerater(field)); RefNameSpace.Add(field.FieldType.Namespace); } - + } } + foreach(var e in genType.Events) { @@ -94,7 +83,7 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null) foreach (PropertyDefinition prop in genType.Properties) { - if (Utils.Filter(prop) && !IsCopyOrignNode(prop)) + if (Utils.Filter(prop)) { var pt = prop.PropertyType.Resolve(); if (pt.IsDelegate()) @@ -113,18 +102,15 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null) { foreach (MethodDefinition method in genType.Methods) { - if (method.IsConstructor && method.Parameters.Count == 0) - hasDefaultConstructor = true; - - if (IsCopyOrignNode(method)) - continue; - CheckInterface(method); - if ((method.IsPublic || genType.IsInterface) && !method.IsGetter && !method.IsSetter && !method.IsAddOn && !method.IsRemoveOn ) + // if (isFullValueType && (method.Name.StartsWith("op_") || method.Name == "Equals")) + // continue; + if ((method.IsPublic || genType.IsInterface) && !method.IsGetter && !method.IsSetter && !method.IsAddOn && !method.IsRemoveOn && Utils.Filter(method)) { - var methodGener = new MethodGenerater(method); - methods.Add(methodGener); + methods.Add(new MethodGenerater(method)); RefNameSpace.UnionWith(Utils.GetNameSpaceRef(method)); } + if (method.IsConstructor && method.Parameters.Count == 0 && method.IsPublic) + hasDefaultConstructor = true; } } } @@ -140,7 +126,7 @@ private void GenNested() return; CS.Writer.Flush(); - foreach (var t in nestType.Values) + foreach (var t in nestType) { t.Gen(); } @@ -148,67 +134,61 @@ private void GenNested() public override void Gen() { + using (new CS(new CodeWriter(FileStream))) { base.Gen(); - if (isCopyOrignType) + if (IsCopyOrign(genType)) { - CopyType(genType); + CopyGen(genType); CS.Writer.EndAll(); - if (!genType.IsStruct() || isFullRetainType) - return; + return; } if(!genType.IsNested) { - if(!isCopyOrignType) + foreach (var ns in RefNameSpace) { - RefNameSpace.ExceptWith(Config.Instance.StripUsing); - foreach (var ns in RefNameSpace) + if (!string.IsNullOrEmpty(ns)) { - if (!string.IsNullOrEmpty(ns)) - { - CS.Writer.WriteLine($"using {ns}"); - } + CS.Writer.WriteLine($"using {ns}"); } - CS.Writer.WriteLine("using System.Runtime.InteropServices"); - CS.Writer.WriteLine("using Object = UnityEngine.Object"); } + CS.Writer.WriteLine("using System.Runtime.InteropServices"); + CS.Writer.WriteLine("using Object = UnityEngine.Object"); if (!string.IsNullOrEmpty(genType.Namespace)) { CS.Writer.Start($"namespace {genType.Namespace}"); } } + + var flag = "public"; + if (genType.IsAbstract) + flag += " abstract"; - //if (!isCopyOrignType) - // CS.Writer.WriteLine($"[WrapperClass(\"{Binder.curModule.Name}\")]", false); - - Utils.TokenMap = nodesCollector.TokenMap; - string classDefine = Utils.GetMemberDelcear(genType,stripInterfaceSet); - if(Binder.retainTypes.Contains(genType.FullName)) - classDefine = classDefine.Replace("internal ", "public "); + var classDefine = $"{flag} class {genType.Name}"; - bool isStatic = genType.IsAbstract && genType.IsSealed; - if (genType.BaseType != null && !isStatic && !genType.IsStruct()) + if (genType.IsInterface) { + // classDefine += $" : WObject"; + } + else if (genType.BaseType != null) + { + string baseName = genType.BaseType.IsNested ? genType.BaseType.FullName.Replace("/", ".") : genType.BaseType.Name; if (genType.BaseType.FullName == "System.Object") - { - var index = classDefine.IndexOf(":"); - if (index > 0) - classDefine = classDefine.Replace(":", ": WObject,"); - else - classDefine += ": WObject"; - } + baseName = "WObject"; else Binder.AddType(genType.BaseType.Resolve()); + + classDefine += $" : {baseName}"; } CS.Writer.Start(classDefine); + GenNested(); - CS.Writer.CreateLinePoint("//member"); /*CS.Writer.Start($"internal {genType.Name}(int handle,IntPtr ptr): base(handle, ptr)"); CS.Writer.End();*/ @@ -224,91 +204,58 @@ public override void Gen() if(!hasDefaultConstructor && !genType.IsSealed) { - CS.Writer.WriteLine($"public {genType.Name}()" + " { }", false); - } - - if(genType.IsClass && !genType.IsValueType && !isStatic) - { - CS.Writer.WriteLine($"protected override System.Type GetWType() {{ return typeof({genType.Name}); }}", false); + CS.Writer.WriteLine($"internal {genType.Name}()" + " { }", false); } - foreach (var m in methods) { m.Gen(); } - - GenCopyOrignNodes(); - - GenNested(); CS.Writer.EndAll(); } } - bool IsCopyOrignType(TypeDefinition type) + bool IsCopyOrign(TypeDefinition type) { - - - isFullRetainType = Binder.retainTypes.Contains(type.FullName); - isFullRetainType |= Binder.retainTypes.Contains(type.Namespace); - - isFullRetainType |= type.DoesSpecificTypeImplementInterface("IEnumerator"); - - if (type.IsEnum || type.IsDelegate() || type.IsInterface) - return true; - - if (Utils.IsFullValueType(type) || isFullRetainType) - return true; - - return false; + if (type.IsGeneric() && !type.IsDelegate()) + return false; + return type.IsValueType || type.IsEnum || type.IsDelegate() || type.IsInterface; } - void CopyType(TypeDefinition type ) + void CopyGen(TypeDefinition type ) { + bool isNested = type.IsNested; + HashSet IgnoreNestType = new HashSet(); - //if (!(isNested && IsCopyOrignType(genType.DeclaringType))) + if (!(isNested && IsCopyOrign(genType.DeclaringType))) { var tName = type.FullName.Replace("/", "+"); var name = new FullTypeName(tName); - var decompiler = Binder.GetDecompiler(type.Module.Name); - AstNode syntaxTree; + SyntaxTree syntaxTree; if (isNested) { - ITypeDefinition typeInfo = decompiler.TypeSystem.MainModule.Compilation.FindType(name).GetDefinition(); + ITypeDefinition typeInfo = Binder.Decompiler.TypeSystem.MainModule.Compilation.FindType(name).GetDefinition(); var tokenOfFirstMethod = typeInfo.MetadataToken; - syntaxTree = decompiler.Decompile(tokenOfFirstMethod); + syntaxTree = Binder.Decompiler.Decompile(tokenOfFirstMethod); } else { - syntaxTree = decompiler.DecompileType(name); + syntaxTree = Binder.Decompiler.DecompileType(name); } StringWriter w = new StringWriter(); CustomOutputVisitor outVisitor; - - if(isFullRetainType) - outVisitor = new CustomOutputVisitor(isNested, w, Binder.DecompilerSetting.CSharpFormattingOptions); - else - outVisitor = new BlittablePartOutputVisitor(isNested, w, Binder.DecompilerSetting.CSharpFormattingOptions); - - outVisitor.isFullRetain = isFullRetainType; - outVisitor.checkTypeRefVisitor = new CheckTypeRefVisitor(CheckRefType); - bool isStatic = genType.IsAbstract && genType.IsSealed; - if (genType.BaseType != null && !isStatic && genType.IsClass) - { - if (genType.BaseType.FullName == "System.Object") - outVisitor.AddWObject = true; - } + outVisitor = new BlittableOutputVisitor(isNested, w, Binder.DecompilerSetting.CSharpFormattingOptions); syntaxTree.AcceptVisitor(outVisitor); + if (!isNested) { RefNameSpace.UnionWith(outVisitor.nestedUsing); - RefNameSpace.ExceptWith(Config.Instance.StripUsing); foreach (var ns in RefNameSpace) { if(!string.IsNullOrEmpty(ns)) @@ -316,115 +263,43 @@ void CopyType(TypeDefinition type ) } } + var txt = w.ToString(); CS.Writer.WriteLine(txt, false); - - AddRefType(outVisitor.InternalTypeRef); } - } - - - void CheckCopyOrignNodes() - { - var decompiler = Binder.GetDecompiler(genType.Module.Name); - - var tName = genType.FullName.Replace("/", "+"); - var name = new FullTypeName(tName); - ITypeDefinition typeInfo = decompiler.TypeSystem.MainModule.Compilation.FindType(name).GetDefinition(); - var tokenOfType = typeInfo.MetadataToken; - var st = decompiler.Decompile(tokenOfType); - - nodesCollector = new TokenMapVisitor(); - st.AcceptVisitor(nodesCollector); - - if (!Binder.UnityCoreModuleSet.Contains(genType.Module.Name)) - return; - - bool inUnsafeNS = genType.Namespace.Contains("LowLevel.Unsafe"); - - var retainFilter = new RetainFilter(genType.MetadataToken.ToInt32(), decompiler); - retainFilter.TokenMap = nodesCollector.TokenMap; - retainFilter.InUnsafeNS = inUnsafeNS; - retainFilter.isFullValueType = isCopyOrignType; - - st.AcceptVisitor(retainFilter); - retainDic = retainFilter.RetainDic; - - if (retainDic.Count > 0) - RefNameSpace.UnionWith(retainFilter.NamespaceRef); - } - bool IsCopyOrignNode(MemberReference member) - { - if (retainDic.Count < 1) - return false; - - var token = member.MetadataToken.ToInt32(); - return token != 0 && retainDic.ContainsKey(token); - } - void GenCopyOrignNodes() - { - if (retainDic.Count < 1) - return ; - - CS.Writer.WriteLine("// -- copy orign code nodes --"); - CS.Writer.Flush(); - var outputVisitor = new CustomOutputVisitor(genType.IsNested,CS.Writer.GetWriter(), Binder.DecompilerSetting.CSharpFormattingOptions); - foreach (var node in retainDic.Values) + if(genType.IsStruct()) { - node.AcceptVisitor(outputVisitor); - } - - AddRefType(outputVisitor.InternalTypeRef); - - } + foreach(var f in genType.Fields) + { + var fType = f.FieldType.Resolve(); + if (fType != null && !fType.IsPublic && !fType.IsNested) + Binder.AddType(fType); + } - void AddRefType(HashSet refSet) - { - foreach (var rtype in refSet) - { - var tName = rtype.Replace("+", "/"); - var td = genType.Module.GetType(tName); - if (td != null) + if (!string.IsNullOrEmpty(genType.Namespace)) { - var tdDeclear = td.DeclaringType; - if (tdDeclear != null && tdDeclear.MetadataToken == genType.MetadataToken) - nestType[td] = new ClassGenerater(td, FileStream); - else if(!Utils.Filter(td)) - CS.Writer.WriteLine($"internal class {td.Name}{{}}", false); - else - Binder.AddType(td); + CS.Writer.Start($"namespace {genType.Namespace}"); } - else if (genType.Module.TryGetTypeReference(tName, out var tref)) - Binder.AddTypeRef(tref); - } - } - bool CheckRefType(string rtype) - { - var tName = rtype.Replace("+", "/"); - TypeReference type = genType.Module.GetType(tName); - if (type == null) - genType.Module.TryGetTypeReference(tName, out type); + var classDefine = $"public partial struct {genType.Name}"; - var td = type.DeclaringType; - if (td != null && td.MetadataToken == genType.MetadataToken) - return true; + CS.Writer.Start(classDefine); - return Utils.Filter(type); - } + GenNested(); - private HashSet stripInterfaceSet = new HashSet(); - void CheckInterface(MethodDefinition method) - { - if(method.Name == "System.IDisposable.Dispose" && method.Parameters.Count == 0 && !method.IsPublic) - stripInterfaceSet.Add("IDisposable"); + foreach (var p in properties) + { + p.Gen(); + } - if(method.Name == "GetSurrogate" && method.Parameters.Count == 3 && !Utils.Filter(method)) - stripInterfaceSet.Add("ISurrogateSelector"); + foreach (var m in methods) + { + m.Gen(); + } + + } - if (method.Name == "GetEnumerator" && method.Parameters.Count == 0 && !Utils.Filter(method)) - stripInterfaceSet.Add("IEnumerable"); } } } \ No newline at end of file diff --git a/BindGenerater/Generater/CSharp/CustomOutputVisitor.cs b/BindGenerater/Generater/CSharp/CustomOutputVisitor.cs new file mode 100644 index 0000000..fa629cf --- /dev/null +++ b/BindGenerater/Generater/CSharp/CustomOutputVisitor.cs @@ -0,0 +1,178 @@ +using ICSharpCode.Decompiler.CSharp.OutputVisitor; +using ICSharpCode.Decompiler.CSharp.Syntax; +using ICSharpCode.Decompiler.CSharp.Transforms; +using ICSharpCode.Decompiler.Semantics; +using ICSharpCode.Decompiler.TypeSystem; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +public class CustomOutputVisitor : CSharpOutputVisitor +{ + static HashSet IgnoreUsing = new HashSet(); + static CustomOutputVisitor() + { + IgnoreUsing.Add("UnityEngine.Internal"); + IgnoreUsing.Add("UnityEngine.Scripting.APIUpdating"); + } + + protected bool isNested; + public List nestedUsing = new List(); + public HashSet IgnoreNestType = new HashSet(); + public CustomOutputVisitor(bool _isNested, TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(textWriter, formattingPolicy) + { + isNested = _isNested; + } + + protected override void WriteAttributes(IEnumerable attributes) + { + foreach (var attSec in attributes) + { + foreach (var att in attSec.Attributes) + { + var t = att.Type.Annotation(); // .Annotations.First() as ResolveResult + var td = t.Type as ITypeDefinition; + if (td.IsBuiltinAttribute() == KnownAttribute.None) + { + att.Remove(); + } + } + + if (attSec.Attributes.Count() <= 0) + attSec.Remove(); + } + if (attributes.Count() > 0) + { + base.WriteAttributes(attributes); + } + } + + public override void VisitUsingDeclaration(UsingDeclaration usingDeclaration) + { + + + if (isNested) + { + nestedUsing.Add(usingDeclaration.Namespace); + return; + } + + if (!IgnoreUsing.Contains(usingDeclaration.Namespace)) + base.VisitUsingDeclaration(usingDeclaration); + } + + public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) + { + var type = typeDeclaration.Annotation().Type; + if (IgnoreNestType.Contains(type.Name)) + return; + + if (typeDeclaration.ClassType == ClassType.Struct || typeDeclaration.ClassType == ClassType.Class) + { + typeDeclaration.Modifiers |= Modifiers.Partial; + } + + List dList = new List(); + foreach (var t in typeDeclaration.BaseTypes) + { + var at = t.Annotation(); + if (at.Type.Kind == TypeKind.Interface && !at.Type.Namespace.StartsWith("System")) + dList.Add(t); + } + foreach (var t in dList) + typeDeclaration.BaseTypes.Remove(t); + + base.VisitTypeDeclaration(typeDeclaration); + } +} + +public class BlittableOutputVisitor : CustomOutputVisitor +{ + + + public BlittableOutputVisitor(bool _isNested, TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(_isNested,textWriter, formattingPolicy) + { + } + + + + + public override void VisitFieldDeclaration(FieldDeclaration fieldDeclaration) + { + + foreach(var token in fieldDeclaration.ModifierTokens) + { + if (token.Modifier == Modifiers.Static) + return; + } + + base.VisitFieldDeclaration(fieldDeclaration); + } + + public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration) + { + return; + base.VisitIndexerDeclaration(indexerDeclaration); + } + + public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration) + { + return ; + base.VisitConstructorDeclaration(constructorDeclaration); + } + + public override void VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration) + { + return; + + //if (operatorDeclaration.Name == "op_Implicit" || operatorDeclaration.Name == "op_Explicit") + + base.VisitOperatorDeclaration(operatorDeclaration); + } + + public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) + { + bool forceWrite = false; + if (!methodDeclaration.HasModifier(Modifiers.Public) && methodDeclaration.Name == "Dispose") + forceWrite = true; + + if (forceWrite) + base.VisitMethodDeclaration(methodDeclaration); + } + public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) + { + if (!propertyDeclaration.HasModifier(Modifiers.Public) && propertyDeclaration.Name == "Current") + base.VisitPropertyDeclaration(propertyDeclaration); + } +} + +/* +public class CheckMethodBodyVisible: CSharpOutputVisitor +{ + public bool IsVisible = true; + + public CheckMethodBodyVisible(TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(textWriter, formattingPolicy) + { + } + + public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) + { + if (!IsVisible) + return; + + IsVisible = methodDeclaration.HasModifier(Modifiers.Public); + base.VisitMethodDeclaration(methodDeclaration); + } + public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) + { + if (!IsVisible) + return; + + IsVisible = propertyDeclaration.HasModifier(Modifiers.Public); + + base.VisitPropertyDeclaration(propertyDeclaration); + } +}*/ \ No newline at end of file diff --git a/BindGenerater/Generater/CSharp/DelegateGenerater.cs b/BindGenerater/Generater/CSharp/DelegateGenerater.cs index 4cec4cf..3ed9a35 100644 --- a/BindGenerater/Generater/CSharp/DelegateGenerater.cs +++ b/BindGenerater/Generater/CSharp/DelegateGenerater.cs @@ -38,7 +38,6 @@ public DelegateGenerater(EventDefinition e) isStatic = e.RemoveMethod.IsStatic; } isEvent = true; - } public DelegateGenerater(PropertyDefinition prop) { @@ -56,7 +55,7 @@ public DelegateGenerater(PropertyDefinition prop) if (prop.GetMethod != null) { getMethod = prop.GetMethod; - //methods.Add(new MethodGenerater(prop.GetMethod)); + methods.Add(new MethodGenerater(prop.GetMethod)); isStatic = prop.GetMethod.IsStatic; } isEvent = false; @@ -64,6 +63,12 @@ public DelegateGenerater(PropertyDefinition prop) /* + static event global::UnityEngine.Application.LogCallback _logMessageReceived; + static Action logMessageReceivedAction = OnlogMessageReceived; + static void OnlogMessageReceived(int arg0,int arg1,int arg2) + { + _logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2)); + } public static event global::UnityEngine.Application.LogCallback logMessageReceived { add @@ -90,7 +95,7 @@ public DelegateGenerater(PropertyDefinition prop) public override void Gen() { var name = genName; - + var flag = isStatic ? "static" : ""; flag += isEvent ? " event" : ""; var type = genType; // LogCallback(string condition, string stackTrace, LogType type); @@ -99,8 +104,74 @@ public override void Gen() if (type.IsGenericInstance) eventTypeName = Utils.GetGenericTypeName(type); - - IMemberDefinition context = null ; + var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStatic ? null : declarType); //Action + var paramTpes = Utils.GetDelegateParams(type, isStatic ? null : declarType, out var returnType); // string , string , LogType ,returnType + var returnTypeName = returnType != null ? TypeResolver.Resolve(returnType).RealTypeName() : "void"; + + //static event global::UnityEngine.Application.LogCallback _logMessageReceived; + CS.Writer.WriteLine($"public {flag} {eventTypeName} _{name}"); + + //static Action logMessageReceivedAction = OnlogMessageReceived; + CS.Writer.WriteLine($"static {eventDeclear} {name}Action = On{name}"); + + //static void OnlogMessageReceived(int arg0,int arg1,int arg2) + var eventFuncDeclear = $"static {returnTypeName} On{name}("; + for (int i = 0; i < paramTpes.Count; i++) + { + var p = paramTpes[i]; + eventFuncDeclear += TypeResolver.Resolve(p).LocalVariable($"arg{i}"); + if (i != paramTpes.Count - 1) + { + eventFuncDeclear += ","; + } + } + eventFuncDeclear += ")"; + + CS.Writer.Start(eventFuncDeclear); + CS.Writer.WriteLine("Exception __e = null"); + CS.Writer.Start("try"); + //_logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2)); + var callCmd = $"_{name}("; + var targetObj = ""; + + for (int i = 0; i < paramTpes.Count; i++) + { + var p = paramTpes[i]; + var param = TypeResolver.Resolve(p).Unbox($"arg{i}"); + + if (i == 0 && !isStatic) + { + targetObj = param + "."; + continue; + } + + callCmd += param; + if (i != paramTpes.Count - 1) + callCmd += ","; + } + callCmd += ")"; + + if (!string.IsNullOrEmpty(targetObj)) + callCmd = targetObj + callCmd; + if (returnType != null) + callCmd = $"var res = " + callCmd; + + CS.Writer.WriteLine(callCmd); + if (returnType != null) + { + var res = TypeResolver.Resolve(returnType).Box("res"); + CS.Writer.WriteLine($"return {res}"); + } + CS.Writer.End();//try + CS.Writer.Start("catch(Exception e)"); + CS.Writer.WriteLine("__e = e"); + CS.Writer.End();//catch + CS.Writer.WriteLine("if(__e != null)", false); + CS.Writer.WriteLine("ScriptEngine.OnException(__e.ToString())"); + if (returnType != null) + CS.Writer.WriteLine($"return default({returnTypeName})"); + + CS.Writer.End();//method //public static event LogCallback logMessageReceived CS.Writer.Start($"public {flag} {eventTypeName} {name}"); @@ -109,24 +180,13 @@ public override void Gen() if (addMethod != null || setMethod != null) { var method = isEvent ? addMethod : setMethod; - context = method; - string _member = DelegateResolver.LocalMamberName(name, method); // _logMessageReceived - var op = isEvent ? "+=" : "="; - CS.Writer.Start(isEvent ? "add" : "set"); - if(addMethod != null) - CS.Writer.WriteLine($"bool attach = ({_member} == null)"); - else - CS.Writer.WriteLine($"bool attach = ({_member} != value)"); - - CS.Writer.WriteLine($"{_member} {op} value"); + CS.Writer.Start(isEvent? "add":"set"); + CS.Writer.WriteLine($"bool attach = (_{name} == null)"); + CS.Writer.WriteLine($"_{name} {op} value"); CS.Writer.Start("if(attach)"); - - if (!isStatic) - CS.Writer.WriteLine($"ObjectStore.RefMember(this,ref {_member}_ref,{_member})"); // resist gc - - var res = TypeResolver.Resolve(type, context).Box(name); + var res = TypeResolver.Resolve(type).Box($"{name}Action"); CS.Writer.WriteLine(Utils.BindMethodName(method, false, false) + $"({targetHandle}{res})"); //var value_p = Marshal.GetFunctionPointerForDelegate(logMessageReceivedAction); @@ -137,20 +197,11 @@ public override void Gen() } if(removeMethod != null) { - if(context == null) - context = removeMethod; - - string _member = DelegateResolver.LocalMamberName(name, removeMethod); // _logMessageReceived - CS.Writer.Start("remove"); - CS.Writer.WriteLine($"{_member} -= value"); - - CS.Writer.Start($"if({_member} == null)"); + CS.Writer.WriteLine($"_{name} -= value"); - if (!isStatic) - CS.Writer.WriteLine($"ObjectStore.RefMember(this,ref {_member}_ref,{_member})"); // resist gc - - var res = TypeResolver.Resolve(type, context).Box(name); + CS.Writer.Start($"if(_{name} == null)"); + var res = TypeResolver.Resolve(type).Box($"{name}Action"); CS.Writer.WriteLine(Utils.BindMethodName(removeMethod, false, false) + $"({targetHandle}{res})"); CS.Writer.WriteLine("ScriptEngine.CheckException()"); CS.Writer.End(); //if(attach) @@ -158,10 +209,8 @@ public override void Gen() } else if (getMethod != null) { - string _member = DelegateResolver.LocalMamberName(name, getMethod); // _logMessageReceived - CS.Writer.Start("get"); - CS.Writer.WriteLine($"return {_member}"); + CS.Writer.WriteLine($"return _{name}"); CS.Writer.End(); //get } diff --git a/BindGenerater/Generater/CSharp/GenerateBindings.cs b/BindGenerater/Generater/CSharp/GenerateBindings.cs index 57c083f..d7b866f 100644 --- a/BindGenerater/Generater/CSharp/GenerateBindings.cs +++ b/BindGenerater/Generater/CSharp/GenerateBindings.cs @@ -1,78 +1,59 @@ using Mono.Cecil; using System.Collections; using System.Collections.Generic; -using System.IO; namespace Generater { - public class BindingGenerater + public static class GenerateBindings { - public string Name; - public int Offset; - HashSet methods = new HashSet(); - HashSet delegateDefines = new HashSet(); - - StreamWriter Writer; - - public BindingGenerater(string name,int _offset,StreamWriter writer) - { - Name = name; - Offset = _offset; - Writer = writer; - } - - public void AddMethod(MethodDefinition method) + static HashSet methods = new HashSet(); + static HashSet delegateDefines = new HashSet(); + public static void AddMethod(MethodDefinition method) { methods.Add(method); } - public void AddDelegateDefine(string defineStr) + public static void AddDelegateDefine(string defineStr) { delegateDefines.Add(defineStr); } - private void GenDefines() + public static void Gen() { - // method define - foreach (var method in methods) - { - CS.Writer.WriteLine("[UnmanagedFunctionPointer(CallingConvention.Cdecl)]", false); - //MethodResolver.Resolve(method).DefineDelegate(); - var flag = Utils.IsUnsafeMethod(method) ? " unsafe " : " "; - CS.Writer.WriteLine($"public{flag}delegate {MethodResolver.Resolve(method).ReturnType()} {Utils.BindMethodName(method, true, false)}_Type {Utils.BindMethodParamDefine(method, true)}"); - } + var nsSet = Utils.GetNameSpaceList(methods); + nsSet.Add("System.Runtime.InteropServices"); + nsSet.Add("System.Collections.Generic"); + nsSet.Add("Object = UnityEngine.Object"); + nsSet.Add("Random = UnityEngine.Random"); - // delegate define - foreach (var define in delegateDefines) - { - CS.Writer.WriteLine(define); - } - } - public void GenWrapper() - { - var nsSet = Utils.GetNameSpaceList(methods); - if(methods.Count > 0) + using (new CS(Binder.FuncDefineWriter)) { - nsSet.Add("System.Runtime.InteropServices"); - nsSet.Add("System.Collections.Generic"); - nsSet.Add("Object = UnityEngine.Object"); - nsSet.Add("Random = UnityEngine.Random"); + foreach(var ns in nsSet) + CS.Writer.WriteLine($"using {ns}"); + + foreach (var method in methods) + { + CS.Writer.WriteLine("[UnmanagedFunctionPointer(CallingConvention.Cdecl)]", false); + //MethodResolver.Resolve(method).DefineDelegate(); + var flag = Utils.IsUnsafeMethod(method) ? " unsafe " : " "; + CS.Writer.WriteLine($"public{flag}delegate {MethodResolver.Resolve(method).ReturnType()} {Utils.BindMethodName(method,true,false)}_Type {Utils.BindMethodParamDefine(method,true)}"); + } + + foreach(var define in delegateDefines) + { + CS.Writer.WriteLine(define); + } } - nsSet.Add("System"); - using (new CS(new CodeWriter(Writer))) + using (new CS(Binder.FuncDeSerWriter)) { - foreach (var ns in nsSet) CS.Writer.WriteLine($"using {ns}"); - GenDefines(); - - // wrapper imple - //CS.Writer.WriteLine("using PureScript.Mono"); + CS.Writer.WriteLine("using PureScript.Mono"); - CS.Writer.Start("internal static partial class MonoBind"); + CS.Writer.Start("public static class MonoBind"); foreach (var method in methods) { @@ -80,43 +61,32 @@ public void GenWrapper() CS.Writer.WriteLine($"public static {methodName}_Type {methodName}"); } - CS.Writer.Start("static MonoBind()"); - CS.Writer.WriteLine("InitBind(PureScript.Mono.ScriptEngine.GetFuncPointer())"); - CS.Writer.End(); - CS.Writer.Start("public static void InitBind(IntPtr memory)"); //CS.Writer.Start("if(memory == IntPtr.Zero)"); //CS.Writer.WriteLine("memory = GetManageFuncPtr()"); //CS.Writer.End(); + CS.Writer.WriteLine("int curMemory = 0"); foreach (var method in methods) { var methodName = Utils.BindMethodName(method, true, false); - CS.Writer.WriteLine($"{methodName} = Marshal.GetDelegateForFunctionPointer<{methodName}_Type>(Marshal.ReadIntPtr(memory, {Offset} * IntPtr.Size ))"); - Offset++; + CS.Writer.WriteLine($"{methodName} = Marshal.GetDelegateForFunctionPointer<{methodName}_Type>(Marshal.ReadIntPtr(memory, curMemory))"); + CS.Writer.WriteLine("curMemory += IntPtr.Size"); } + CS.Writer.WriteLine("Custom.DeSer(memory + curMemory)"); + CS.Writer.EndAll(); } - } - public void GenImpl() - { - var nsSet = Utils.GetNameSpaceList(methods); - nsSet.Add("System.Runtime.InteropServices"); - nsSet.Add("System.Collections.Generic"); - nsSet.Add("Object = UnityEngine.Object"); - nsSet.Add("Random = UnityEngine.Random"); - nsSet.Add("PureScript"); - nsSet.Add("AOT"); - nsSet.Add("System"); - - - using (new CS(new CodeWriter(Writer))) + using (new CS(Binder.FuncSerWriter)) { foreach (var ns in nsSet) CS.Writer.WriteLine($"using {ns}"); + CS.Writer.WriteLine("using PureScript"); + CS.Writer.WriteLine($"using AOT"); + CS.Writer.Start("public static unsafe class UnityBind"); foreach (var method in methods) @@ -126,16 +96,17 @@ public void GenImpl() } CS.Writer.Start("public static IntPtr BindFunc()"); - CS.Writer.WriteLine($"IntPtr memory = Marshal.AllocHGlobal({methods.Count + 1} * IntPtr.Size)"); - + CS.Writer.WriteLine("IntPtr memory = Marshal.AllocHGlobal(8192*8)"); + CS.Writer.WriteLine("int curMemory = 0;"); + foreach (var method in methods) { var methodName = Utils.BindMethodName(method, true, false) + "Delegate"; - CS.Writer.WriteLine($"Marshal.WriteIntPtr(memory, {Offset} * IntPtr.Size, Marshal.GetFunctionPointerForDelegate({methodName}))"); - Offset++; + CS.Writer.WriteLine($"Marshal.WriteIntPtr(memory, curMemory, Marshal.GetFunctionPointerForDelegate({methodName}))"); + CS.Writer.WriteLine("curMemory += IntPtr.Size"); } - CS.Writer.WriteLine($"Custom.Ser(memory + {Offset} * IntPtr.Size)"); + CS.Writer.WriteLine("Custom.Ser(memory + curMemory)"); CS.Writer.WriteLine("return memory"); CS.Writer.End(); @@ -156,8 +127,8 @@ public void GenImpl() if (!string.IsNullOrEmpty(reName)) CS.Writer.WriteLine($"return {reName}"); CS.Writer.End();//try - CS.Writer.Start("catch(Exception _e_)"); - CS.Writer.WriteLine("__e = _e_"); + CS.Writer.Start("catch(Exception e)"); + CS.Writer.WriteLine("__e = e"); CS.Writer.End();//catch CS.Writer.WriteLine("if(__e != null)", false); @@ -169,57 +140,9 @@ public void GenImpl() } - CS.Writer.End();//UnityBind - - GenDefines(); - - CS.Writer.EndAll(); - } - } - } - - public static class GenerateBindings - { - static BindingGenerater implGenerater; - static BindingGenerater wrapGenerater; - - public static void StartWraper(string file) - { - if (implGenerater == null) - { - var implName = "Binder.impl.cs"; - var implWriter = File.CreateText(Path.Combine(Binder.OutDir, implName)); - implGenerater = new BindingGenerater("Binder.impl",0, implWriter); + CS.Writer.End(); } - var name = $"Binder.{file.Replace(".dll",".cs")}"; - var path = Path.Combine(Binder.OutDir, name); - var writer = File.CreateText(path); - var offset = wrapGenerater != null ? wrapGenerater.Offset : 0; - wrapGenerater = new BindingGenerater(name, offset, writer); - - CSCGenerater.AdapterWrapperCompiler.AddSource(path); - } - - public static void AddMethod(MethodDefinition method) - { - implGenerater.AddMethod(method); - wrapGenerater.AddMethod(method); - } - - public static void AddDelegateDefine(string defineStr) - { - implGenerater.AddDelegateDefine(defineStr); - wrapGenerater.AddDelegateDefine(defineStr); - } - - public static void Gen() - { - wrapGenerater.GenWrapper(); - } - public static void End() - { - implGenerater.GenImpl(); } } } \ No newline at end of file diff --git a/BindGenerater/Generater/CSharp/MethodGenerater.cs b/BindGenerater/Generater/CSharp/MethodGenerater.cs index cb328f9..7b0a299 100644 --- a/BindGenerater/Generater/CSharp/MethodGenerater.cs +++ b/BindGenerater/Generater/CSharp/MethodGenerater.cs @@ -9,17 +9,9 @@ public class MethodGenerater : CodeGenerater { MethodDefinition genMethod; CodeWriter writer; - - bool isNotImplement = false; public MethodGenerater(MethodDefinition method) { genMethod = method; - isNotImplement = !Utils.Filter(method); - - isNotImplement |= method.IsConstructor && method.DeclaringType.IsSubclassOf("UnityEngine.Component"); // UnityEngine.Component cant be new.. - - if (isNotImplement)//maybe generate a empty method? - return; if (!genMethod.IsPublic && !genMethod.DeclaringType.IsInterface) return; @@ -33,15 +25,12 @@ public MethodGenerater(MethodDefinition method) } Binder.AddType(genMethod.ReturnType.Resolve()); - if (!method.IsAbstract && !isNotImplement) + if (!method.IsAbstract) GenerateBindings.AddMethod(genMethod); } public override void Gen() { - if (isNotImplement) - return; - writer = CS.Writer; base.Gen(); @@ -72,17 +61,9 @@ void GenGeter() return; } writer.Start("get"); - if(isNotImplement) - { - WriteNotImplemented(); - } - else - { - var res = MethodResolver.Resolve(genMethod).Call("res"); - writer.WriteLine("ScriptEngine.CheckException()"); - writer.WriteLine($"return {res}"); - } - + var res = MethodResolver.Resolve(genMethod).Call("res"); + writer.WriteLine("ScriptEngine.CheckException()"); + writer.WriteLine($"return {res}"); writer.End(); } @@ -95,69 +76,31 @@ void GenSeter() } writer.Start("set"); - if (isNotImplement) - { - WriteNotImplemented(); - } - else - { - MethodResolver.Resolve(genMethod).Call(""); - writer.WriteLine("ScriptEngine.CheckException()"); - } - + MethodResolver.Resolve(genMethod).Call(""); + writer.WriteLine("ScriptEngine.CheckException()"); writer.End(); } void GenAddOn() { writer.Start("add"); - if (isNotImplement) - { - WriteNotImplemented(); - } - else - { - MethodResolver.Resolve(genMethod).Call(""); - writer.WriteLine("ScriptEngine.CheckException()"); - } - + MethodResolver.Resolve(genMethod).Call(""); + writer.WriteLine("ScriptEngine.CheckException()"); writer.End(); } void GenRemoveOn() { writer.Start("remove"); - if (isNotImplement) - { - WriteNotImplemented(); - } - else - { - MethodResolver.Resolve(genMethod).Call(""); - writer.WriteLine("ScriptEngine.CheckException()"); - } + MethodResolver.Resolve(genMethod).Call(""); + writer.WriteLine("ScriptEngine.CheckException()"); writer.End(); } void GenMethod() { - var declear = GetMethodDelcear(); - if(!genMethod.HasBody) - { - writer.WriteLine(declear); - return; - } - - writer.Start(declear); - - if (isNotImplement) - { - WriteNotImplemented(); - writer.End(); - return; - } - - if (genMethod.IsConstructor) + writer.Start(GetMethodDelcear()); + if(genMethod.IsConstructor) { if(genMethod.DeclaringType.IsValueType) { @@ -166,12 +109,10 @@ void GenMethod() } else { - CS.Writer.Start($"if(typeof({genMethod.DeclaringType.Name}) == GetWType())"); CS.Writer.WriteLine($"var h = {Utils.BindMethodName(genMethod)}"); writer.WriteLine("ScriptEngine.CheckException()"); CS.Writer.WriteLine($"SetHandle(h)"); CS.Writer.WriteLine("ObjectStore.Store(this, h)"); - CS.Writer.End(); } } else @@ -192,18 +133,85 @@ void GenAbstract() string GetMethodDelcear() { - string declear = Utils.GetMemberDelcear(genMethod); + + string declear = "public "; + if (genMethod.IsStatic) + declear += "static "; + + if (Utils.IsUnsafeMethod(genMethod)) + declear += "unsafe "; + + if (genMethod.IsAbstract) + declear += "abstract "; + else if (genMethod.IsOverride()) + declear += "override "; + else if (genMethod.IsVirtual && !genMethod.IsFinal) + declear += "virtual "; + + var methodName = genMethod.Name; + + switch(methodName) + { + case "op_Addition": + methodName = "operator+"; + break; + case "op_Subtraction": + methodName = "operator-"; + break; + case "op_UnaryNegation": + methodName = "operator-"; + break; + case "op_Multiply": + methodName = "operator*"; + break; + case "op_Division": + methodName = "operator/"; + break; + case "op_Equality": + methodName = "operator=="; + break; + case "op_Inequality": + methodName = "operator!="; + break; + case "op_Implicit": + methodName = "implicit operator " + genMethod.ReturnType.Name; + break; + case "op_Explicit": + methodName = "explicit operator " + genMethod.ReturnType.Name; + break; + + } + + if (!genMethod.IsConstructor) + { + if(!methodName.StartsWith("implicit")&& !methodName.StartsWith("explicit")) + declear += TypeResolver.Resolve(genMethod.ReturnType).RealTypeName() + " "; + declear += methodName; + } + else + { + declear += genMethod.DeclaringType.Name; + } + + var param = "("; + var lastP = genMethod.Parameters.LastOrDefault(); + foreach (var p in genMethod.Parameters) + { + var type = p.ParameterType; + var typeName = TypeResolver.Resolve(type).RealTypeName(); + if (type.IsGenericInstance) + typeName = Utils.GetGenericTypeName(type); + + param += $"{typeName} {p.Name}" + (p == lastP ? "" : ", "); + } + param += ")"; + + declear += param; if (genMethod.IsConstructor && genMethod.DeclaringType.IsValueType) declear += ":this()"; return declear; } - - void WriteNotImplemented() - { - CS.Writer.WriteLine("throw new System.NotImplementedException()"); - } - } } \ No newline at end of file diff --git a/BindGenerater/Generater/CSharp/MethodResolver.cs b/BindGenerater/Generater/CSharp/MethodResolver.cs index 950790d..4a993da 100644 --- a/BindGenerater/Generater/CSharp/MethodResolver.cs +++ b/BindGenerater/Generater/CSharp/MethodResolver.cs @@ -11,12 +11,11 @@ public class MethodResolver { public static BaseMethodResolver Resolve(MethodDefinition _method) { - - var firstParam = _method.Parameters.FirstOrDefault()?.ParameterType?.Resolve(); if (_method.IsConstructor) return new ConstructorMethodResolver(_method); if (_method.IsSetter) { + var firstParam = _method.Parameters.FirstOrDefault()?.ParameterType?.Resolve(); if (firstParam != null && firstParam.IsDelegate()) return new AddOnMethodResolver(_method,false); else @@ -30,9 +29,6 @@ public static BaseMethodResolver Resolve(MethodDefinition _method) if (_method.IsRemoveOn) return new RemoveOnMethodResolver(_method); - if (EventMethodResolver.IsUnityEventMethod(_method)) - return new EventMethodResolver(_method); - return new BaseMethodResolver(_method); } } @@ -58,18 +54,6 @@ public virtual string ReturnType() /// resObj public virtual string Call(string name) { - foreach (var param in method.Parameters) - { - var td = param.ParameterType.Resolve(); - if (td != null && td.IsDelegate()) - { - var _member = DelegateResolver.LocalMamberName(param.Name, method); - CS.Writer.WriteLine($"{_member} = {param.Name}"); - if (!method.IsStatic) - CS.Writer.WriteLine($"ObjectStore.RefMember(this,ref {_member}_ref,{_member})"); // resist gc - } - } - if (method.ReturnType.IsVoid()) { CS.Writer.WriteLine(Utils.BindMethodName(method)); @@ -79,7 +63,7 @@ public virtual string Call(string name) var reName = TypeResolver.Resolve(method.ReturnType).LocalVariable(name); CS.Writer.WriteLine($"{reName} = {Utils.BindMethodName(method)}"); - return TypeResolver.Resolve(method.ReturnType,method).Unbox(name); + return TypeResolver.Resolve(method.ReturnType).Unbox(name); } /// @@ -137,9 +121,9 @@ public virtual string Implement(string name) var lastP = method.Parameters.LastOrDefault(); foreach (var p in method.Parameters) { - var value = TypeResolver.Resolve(p.ParameterType,method).Unbox(p.Name, true); - if (p.IsIn) - value = value.Replace("ref ", "in "); + var value = TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true); + //if (p.ParameterType.IsByReference) + // value = "ref " + value; CS.Writer.Write(value); if (lastP != p) @@ -172,7 +156,7 @@ public override string ReturnType() if(IsValueTypeConstructor) return "void"; - return "IntPtr"; + return "int"; } /// @@ -190,11 +174,7 @@ public override string Implement(string name) var lastP = method.Parameters.LastOrDefault(); foreach (var p in method.Parameters) { - var value = TypeResolver.Resolve(p.ParameterType, method).Unbox(p.Name, true); - if (p.IsIn) - value = value.Replace("ref ", "in "); - - CS.Writer.Write(value); + CS.Writer.Write(TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true)); if (lastP != p) CS.Writer.Write(","); } @@ -303,7 +283,11 @@ public AddOnMethodResolver(MethodDefinition _method,bool _event) : base(_method) } /* - + static Action logMessageReceived; + static void OnlogMessageReceived(string arg0, string arg1, LogType arg2) + { + logMessageReceived(box(arg0), box(arg1), box(arg2)); + } [MonoPInvokeCallback(typeof(UnityEngine_Application_logMessageReceived_Type))] static void UnityEngine_Application_logMessageReceived (IntPtr value_p) { @@ -315,16 +299,64 @@ public override string Implement(string name) { var isStatic = method.IsStatic; - var type = method.Parameters.FirstOrDefault().ParameterType; - name = "value"; - var thizObj = GetThizObj(); + var type = method.Parameters.FirstOrDefault().ParameterType; // LogCallback(string condition, string stackTrace, LogType type); + var paramTpes = Utils.GetDelegateParams(type,isStatic? null: method.DeclaringType, out var returnType); // string , string , LogType ,returnType + var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStatic ? null : method.DeclaringType); //Action + + var returnTypeName = returnType != null ? TypeResolver.Resolve(returnType).RealTypeName() : "void"; + + //static void OnlogMessageReceived(string arg0, string arg1, LogType arg2) + var eventFuncDeclear = $"static {returnTypeName} On{uniqueName}("; + for (int i = 0;i< paramTpes.Count;i++) + { + var p = paramTpes[i]; + if (!isStatic && i == 0) + eventFuncDeclear += "this "; + eventFuncDeclear += $"{TypeResolver.Resolve(p).RealTypeName()} arg{i}"; + if (i != paramTpes.Count -1) + { + eventFuncDeclear += ","; + } + } + eventFuncDeclear += ")"; + + using (new LP(CS.Writer.GetLinePoint("//Method"))) + { + CS.Writer.WriteLine($"static {eventDeclear} {uniqueName}"); - var res = TypeResolver.Resolve(type,method).Unbox(name); + CS.Writer.Start(eventFuncDeclear); - //CS.Writer.WriteLine($"{uniqueName} = Marshal.GetDelegateForFunctionPointer<{eventDeclear}>({name}_p)"); + var callCmd = $"{uniqueName}("; + if (returnType != null) + callCmd = "var res = " + callCmd; - var actionTarget = res;// isStatic ? $"{res}" : $"{thizObj}.On{uniqueName}"; + for (int i = 0; i < paramTpes.Count; i++) + { + var p = paramTpes[i]; + callCmd += TypeResolver.Resolve(p).Box($"arg{i}"); + + if (i != paramTpes.Count - 1) + callCmd += ","; + } + + callCmd += ")"; + CS.Writer.WriteLine(callCmd); + CS.Writer.WriteLine("ScriptEngine.CheckException()"); + if (returnType != null) + { + var res = TypeResolver.Resolve(returnType).Box("res"); + CS.Writer.WriteLine($"return {res}"); + } + + CS.Writer.End(); + } + + name = "value"; + var thizObj = GetThizObj(); + CS.Writer.WriteLine($"{uniqueName} = Marshal.GetDelegateForFunctionPointer<{eventDeclear}>({name}_p)"); + + var actionTarget = isStatic ? $"On{uniqueName}" : $"{thizObj}.On{uniqueName}"; var op = isEvent ? "+=" : "="; CS.Writer.WriteLine($"{thizObj}.{propertyName} {op} {actionTarget}"); @@ -346,84 +378,13 @@ public override string Implement(string name) { name = "value"; var thizObj = GetThizObj(); - //var isStatic = method.IsStatic; - - var type = method.Parameters.FirstOrDefault().ParameterType; - var res = TypeResolver.Resolve(type,method).Unbox(name); + var isStatic = method.IsStatic; - var actionTarget = res;// isStatic ? $"On{uniqueName}" : $"{thizObj}.On{uniqueName}"; + + var actionTarget = isStatic ? $"On{uniqueName}" : $"{thizObj}.On{uniqueName}"; CS.Writer.WriteLine($"{thizObj}.{propertyName} -= {actionTarget}"); return ""; } } - - public class EventMethodResolver : BaseMethodResolver - { - enum EventType - { - none, - addon, - removeon, - } - EventType eventType; - public EventMethodResolver(MethodDefinition _method) : base(_method) - { - if(_method.DeclaringType.IsSubclassOf("UnityEngine.Events.UnityEventBase")) - { - if (_method.Name == "AddListener") - eventType = EventType.addon; - else if (_method.Name == "RemoveListener") - eventType = EventType.removeon; - } - } - - public static bool IsUnityEventMethod(MethodDefinition _method) - { - var firstParam = _method.Parameters.FirstOrDefault()?.ParameterType?.Resolve(); - if (_method.Parameters.Count == 1 && firstParam.IsDelegate()) - { - if (_method.DeclaringType.IsSubclassOf("UnityEngine.Events.UnityEventBase")) - { - if (_method.Name == "AddListener" || _method.Name == "RemoveListener") - return true; - } - } - return false; - } - - public override string Call(string name) - { - if(eventType == EventType.none) - return base.Call(name); - - var firstParam = method.Parameters.FirstOrDefault(); - string _member = DelegateResolver.LocalMamberName(firstParam.Name, method); - - var res = ""; - - if (eventType == EventType.addon) - { - CS.Writer.WriteLine($"bool attach = ({_member} == null)"); - CS.Writer.WriteLine($"{_member} += {firstParam.Name}"); - CS.Writer.Start("if(attach)"); - } - else - { - CS.Writer.WriteLine($"{_member} -= {firstParam.Name}"); - CS.Writer.Start($"if({_member} == null)"); - } - - res = base.Call(name); - - if (!method.IsStatic) - CS.Writer.WriteLine($"ObjectStore.RefMember(this,ref {_member}_ref,{_member})"); // resist gc - - CS.Writer.End(); //if(attach) - - return res; - - } - - } } diff --git a/BindGenerater/Generater/CSharp/PropertyGenerater.cs b/BindGenerater/Generater/CSharp/PropertyGenerater.cs index edc9522..4068c49 100644 --- a/BindGenerater/Generater/CSharp/PropertyGenerater.cs +++ b/BindGenerater/Generater/CSharp/PropertyGenerater.cs @@ -20,7 +20,7 @@ public class PropertyGenerater : CodeGenerater public PropertyGenerater(PropertyDefinition property) { genProperty = property; - if (genProperty.GetMethod != null && genProperty.GetMethod.IsPublic ) + if (genProperty.GetMethod != null && genProperty.GetMethod.IsPublic && Utils.Filter(genProperty.GetMethod)) { isStatic = genProperty.GetMethod.IsStatic; isAbstract = genProperty.GetMethod.IsAbstract; @@ -28,7 +28,7 @@ public PropertyGenerater(PropertyDefinition property) isVirtual = genProperty.GetMethod.IsVirtual && !genProperty.DeclaringType.IsValueType; methods.Add(new MethodGenerater(genProperty.GetMethod)); } - if (genProperty.SetMethod != null && genProperty.SetMethod.IsPublic ) + if (genProperty.SetMethod != null && genProperty.SetMethod.IsPublic && Utils.Filter(genProperty.SetMethod)) { isStatic = genProperty.SetMethod.IsStatic; isAbstract = genProperty.SetMethod.IsAbstract; @@ -59,10 +59,15 @@ public override void Gen() void GenProperty() { + var flag = isStatic ? "static " : ""; + if (isAbstract) + flag += "abstract "; + else if (isOverride) + flag += "override "; + else if(isVirtual) + flag += "virtual "; - var declear = Utils.GetMemberDelcear(genProperty); - - CS.Writer.Start(declear); + CS.Writer.Start($"public {flag}{TypeResolver.Resolve(genProperty.PropertyType).RealTypeName()} {genProperty.Name}"); foreach (var m in methods) m.Gen(); diff --git a/BindGenerater/Generater/CSharp/TypeResolver.cs b/BindGenerater/Generater/CSharp/TypeResolver.cs index c37068c..6da50b5 100644 --- a/BindGenerater/Generater/CSharp/TypeResolver.cs +++ b/BindGenerater/Generater/CSharp/TypeResolver.cs @@ -10,12 +10,12 @@ namespace Generater public class TypeResolver { public static bool WrapperSide; - public static BaseTypeResolver Resolve(TypeReference _type, IMemberDefinition context = null) + public static BaseTypeResolver Resolve(TypeReference _type) { var type = _type.Resolve(); if (Utils.IsDelegate(_type)) - return new DelegateResolver(_type, context); + return new DelegateResolver(_type); if (_type.Name.Equals("Void")) return new VoidResolver(_type); @@ -48,7 +48,6 @@ public static BaseTypeResolver Resolve(TypeReference _type, IMemberDefinition co public class BaseTypeResolver { protected TypeReference type; - public object data; public BaseTypeResolver(TypeReference _type) { type = _type; @@ -87,7 +86,7 @@ protected string Alias() break; default: - if (!tName.StartsWith("System") && !type.IsGeneric()) + if (!tName.StartsWith("System")) tName = "global::" + tName; break; @@ -96,12 +95,6 @@ protected string Alias() if (et != null) tName = type.FullName.Replace(et.FullName, tName); - var genericIndex = tName.IndexOf('`'); - if(genericIndex > 0) - { - tName = tName.Remove(genericIndex, 2); - } - return tName.Replace("/","."); } @@ -126,7 +119,7 @@ public string RealTypeName() var tName = Alias(); - if (type.IsByReference && (et.IsValueType || et.IsGeneric())) + if (type.IsByReference && et.IsValueType) tName = "ref " + tName.Replace("&", ""); return tName; @@ -200,7 +193,7 @@ public override string Paramer(string name) public override string TypeName() { - return "IntPtr"; + return "int"; } /// @@ -274,60 +267,8 @@ public override string Unbox(string name, bool previous) public class DelegateResolver : BaseTypeResolver { - bool isStaticMember; - TypeReference declarType; - MethodDefinition contextMember; - string uniqueName; - int paramCount; - bool returnValue; - - static HashSet BoxedMemberSet = new HashSet(); - static HashSet UnBoxedMemberSet = new HashSet(); - - private static string _Member(string name) + public DelegateResolver(TypeReference type) : base(type) { - return $"_{name}"; - } - private static string _Action(string name) - { - return $"{name}Action"; - } - - public static string LocalMamberName(string name, MethodDefinition context) - { - var uniq = FullMemberName(context); - return _Member($"{uniq}_{name}"); - } - - public DelegateResolver(TypeReference type, IMemberDefinition context) : base(type) - { - if(context != null) - { - var method = context as MethodDefinition; - contextMember = method; - isStaticMember = method.IsStatic; - declarType = method.DeclaringType; - paramCount = method.Parameters.Count; - returnValue = !method.ReturnType.IsVoid(); - uniqueName = FullMemberName(method); - } - } - - static string FullMemberName(MethodDefinition method) - { - var methodName = method.Name; - if (method.IsAddOn || method.IsSetter || method.IsGetter) - methodName = methodName.Substring("add_".Length);//trim "add_" or "set_" - else if (method.IsRemoveOn) - methodName = methodName.Substring("remove_".Length);//trim "remove_" - - // Special to AddListener / RemoveListener - else if (method.Parameters.Count == 1 && methodName.StartsWith("Add")) - methodName = methodName.Substring("Add".Length);// trim "Add" - else if (method.Parameters.Count == 1 && methodName.StartsWith("Remove")) - methodName = methodName.Substring("Remove".Length);// trim "Remove" - - return method.DeclaringType.Name.Replace("/", "_") + "_" + methodName.Replace(".", "_"); } public override string Paramer(string name) @@ -340,229 +281,23 @@ public override string TypeName() return "IntPtr"; } - /* - static event global::UnityEngine.Application.LogCallback _logMessageReceived; - static Action logMessageReceivedAction = OnlogMessageReceived; - static void OnlogMessageReceived(int arg0,int arg1,int arg2) - { - _logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2)); - } - */ - void WriteBoxedMember(string name) - { - if (contextMember == null) - return; - - var varName = uniqueName + name; - if (BoxedMemberSet.Contains(varName)) - return; - BoxedMemberSet.Add(varName); - - string _member = _Member(name);// _logMessageReceived - string _action = _Action(name);// logMessageReceivedAction - - var flag = isStaticMember ? "static" : ""; - var eventTypeName = TypeResolver.Resolve(type).RealTypeName(); - if (type.IsGenericInstance) - eventTypeName = Utils.GetGenericTypeName(type); - - var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStaticMember ? null : declarType); //Action - var paramTpes = Utils.GetDelegateParams(type, isStaticMember ? null : declarType, out var returnType); // string , string , LogType ,returnType - var returnTypeName = returnType != null ? TypeResolver.Resolve(returnType).TypeName() : "void"; - - //static event global::UnityEngine.Application.LogCallback _logMessageReceived; - CS.Writer.WriteLine($"public {flag} {eventTypeName} {_member}"); - - if(!isStaticMember) - CS.Writer.WriteLine($"public GCHandle {_member}_ref"); // resist gc - - //static Action logMessageReceivedAction = OnlogMessageReceived; - CS.Writer.WriteLine($"static {eventDeclear} {_action} = On{name}"); - - //static void OnlogMessageReceived(int arg0,int arg1,int arg2) - var eventFuncDeclear = $"static {returnTypeName} On{name}("; - - for (int i = 0; i < paramTpes.Count; i++) - { - var p = paramTpes[i]; - eventFuncDeclear += TypeResolver.Resolve(p).LocalVariable($"arg{i}"); - if (i != paramTpes.Count - 1) - { - eventFuncDeclear += ","; - } - } - eventFuncDeclear += ")"; - - CS.Writer.Start(eventFuncDeclear); - CS.Writer.WriteLine("Exception __e = null"); - CS.Writer.Start("try"); - //_logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2)); - var callCmd = $"{_member}("; - var targetObj = ""; - - for (int i = 0; i < paramTpes.Count; i++) - { - var p = paramTpes[i]; - var param = TypeResolver.Resolve(p).Unbox($"arg{i}"); - - if (i == 0 && !isStaticMember) - { - targetObj = param + "."; - continue; - } - - callCmd += param; - if (i != paramTpes.Count - 1) - callCmd += ","; - } - callCmd += ")"; - - if (!string.IsNullOrEmpty(targetObj)) - callCmd = targetObj + callCmd; - if (returnType != null) - callCmd = $"var res = " + callCmd; - - CS.Writer.WriteLine(callCmd); - if (returnType != null) - { - var res = TypeResolver.Resolve(returnType).Box("res"); - CS.Writer.WriteLine($"return {res}"); - } - CS.Writer.End();//try - CS.Writer.Start("catch(Exception e)"); - CS.Writer.WriteLine("__e = e"); - CS.Writer.End();//catch - CS.Writer.WriteLine("if(__e != null)", false); - CS.Writer.WriteLine("ScriptEngine.OnException(__e.ToString())"); - if (returnType != null) - CS.Writer.WriteLine($"return default({returnTypeName})"); - - CS.Writer.End();//method - - } - - /* - static Action logMessageReceived; - static Action logMessageReceivedAction; - static void OnlogMessageReceived(string arg0, string arg1, LogType arg2) - { - logMessageReceived(box(arg0), box(arg1), box(arg2)); - } - - */ - void WriteUnboxedMember(string name) - { - if (contextMember == null) - return; - - var varName = uniqueName + name; - - if (UnBoxedMemberSet.Contains(varName)) - return; - UnBoxedMemberSet.Add(varName); - - string _member = _Member(name);// _logMessageReceived - - var paramTpes = Utils.GetDelegateParams(type, isStaticMember ? null : declarType, out var returnType); // string , string , LogType ,returnType - var returnTypeName = returnType != null ? TypeResolver.Resolve(returnType).RealTypeName() : "void"; - var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStaticMember ? null : declarType); //Action - - //static void OnlogMessageReceived(string arg0, string arg1, LogType arg2) - var eventFuncDeclear = $"static {returnTypeName} On{name}("; - for (int i = 0; i < paramTpes.Count; i++) - { - var p = paramTpes[i]; - if (!isStaticMember && i == 0) - eventFuncDeclear += "this "; - eventFuncDeclear += $"{TypeResolver.Resolve(p).RealTypeName()} arg{i}"; - if (i != paramTpes.Count - 1) - { - eventFuncDeclear += ","; - } - } - eventFuncDeclear += ")"; - - - CS.Writer.WriteLine($"static {eventDeclear} {_member}"); - - CS.Writer.Start(eventFuncDeclear); - - var callCmd = $"{_member}("; - if (returnType != null) - { - var localVar = TypeResolver.Resolve(returnType).Paramer("res"); - if(localVar.StartsWith("ref ")) - localVar = localVar.Replace("ref ", ""); - callCmd = localVar + " = " + callCmd; - } - - for (int i = 0; i < paramTpes.Count; i++) - { - var p = paramTpes[i]; - callCmd += TypeResolver.Resolve(p).Box($"arg{i}"); - - if (i != paramTpes.Count - 1) - callCmd += ","; - } - - callCmd += ")"; - CS.Writer.WriteLine(callCmd); - CS.Writer.WriteLine("ScriptEngine.CheckException()"); - if (returnType != null) - { - var res = TypeResolver.Resolve(returnType).Unbox("res"); - CS.Writer.WriteLine($"return {res}"); - } - - CS.Writer.End(); - - } - public override string Box(string name) { - var memberUniqueName = $"{uniqueName}_{name}"; - using (new LP(CS.Writer.GetLinePoint("//member"))) - { - WriteBoxedMember(memberUniqueName); - } - - var _action = _Action(memberUniqueName); - var _member = _Member(memberUniqueName); - - CS.Writer.WriteLine($"var {memberUniqueName}_p = Marshal.GetFunctionPointerForDelegate({_action})"); - return $"{memberUniqueName}_p"; + CS.Writer.WriteLine($"var {name}_p = Marshal.GetFunctionPointerForDelegate({name})"); + return $"{name}_p"; } - public override string Unbox(string name, bool previous) { - var memberUniqueName = $"{uniqueName}_{name}"; - - if(!contextMember.IsRemoveOn) - { - using (new LP(CS.Writer.GetLinePoint("//Method"))) - { - WriteUnboxedMember(memberUniqueName); - } - - string _member = _Member(memberUniqueName);// _logMessageReceived - - string ptrName = $"{name}_p"; - - var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStaticMember ? null : declarType); - - var unboxCmd = $"{_member} = {ptrName} == IntPtr.Zero ? null: Marshal.GetDelegateForFunctionPointer<{eventDeclear}>({ptrName})"; - if (previous) - CS.Writer.WritePreviousLine(unboxCmd); - else - CS.Writer.WriteLine(unboxCmd); - } - - var resCmd = $"On{memberUniqueName}"; - if (!isStaticMember) - resCmd = "thizObj." + resCmd; - - return resCmd; + var typeName = RealTypeName(); + if (type.IsGenericInstance) + typeName = Utils.GetGenericTypeName(type); + var unboxCmd = $"var {name}_r = Marshal.GetDelegateForFunctionPointer<{typeName}>({name}_p)"; + if (previous) + CS.Writer.WritePreviousLine(unboxCmd); + else + CS.Writer.WriteLine(unboxCmd); + return $"{name}_r"; } } diff --git a/BindGenerater/Generater/CodeWriter.cs b/BindGenerater/Generater/CodeWriter.cs index ad36f3e..872256f 100644 --- a/BindGenerater/Generater/CodeWriter.cs +++ b/BindGenerater/Generater/CodeWriter.cs @@ -73,8 +73,6 @@ public CodeWriter(TextWriter _writer) UsePointer(CreateLinePoint("// auto gengerated !")); } - public TextWriter GetWriter() { return writer; } - public void Write(string str) { if (lines.Count == 0) diff --git a/BindGenerater/Generater/Config.cs b/BindGenerater/Generater/Config.cs deleted file mode 100644 index f7cd0ee..0000000 --- a/BindGenerater/Generater/Config.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Generater -{ - public class Config - { - /// - /// 黑名单,排除一些不需要绑定的程序集,如:UnityEngine.UnityAnalyticsModule.dll - /// - public HashSet IgnoreAssemblySet; - - /// - /// 黑名单,排除一些不支持的类型,这里是匹配规则,即可以排除整个命名空间,如:UnityEditor / UnityEngine.TestTools - /// - public HashSet CSharpIgnorTypes; - - /// - /// 白名单,强制保留整个类型在Mono内执行,如:UnityEngine.Transform - /// - public HashSet ForceRetainTypes; - - /// - /// 排除掉没用的using,如:UnityEngine.Internal / UnityEngine.Scripting.APIUpdating - /// - public HashSet StripUsing; - - /// - /// 黑名单,ICall绑定时不支持的类型,如:System.Reflection - /// - public HashSet ICallIgnorTypes; - - private static Config _instance; - public static Config Instance - { - get { - if(_instance == null) - { - var json = File.ReadAllText("binder.json"); - _instance = JsonConvert.DeserializeObject(json); - } - return _instance; - } - } - } -} diff --git a/BindGenerater/Generater/TypeDefinitionExtensions.cs b/BindGenerater/Generater/TypeDefinitionExtensions.cs index 7fbea36..63d05c5 100644 --- a/BindGenerater/Generater/TypeDefinitionExtensions.cs +++ b/BindGenerater/Generater/TypeDefinitionExtensions.cs @@ -19,19 +19,13 @@ public static bool IsSubclassOf(this TypeDefinition childTypeDef, TypeDefinition .EnumerateBaseClasses() .Any(b => b.MetadataToken == parentTypeDef.MetadataToken); - public static bool IsSubclassOf(this TypeDefinition childTypeDef, string fullName) => - childTypeDef.FullName == fullName - || childTypeDef - .EnumerateBaseClasses() - .Any(b => b.FullName == fullName); - - /// - /// Does childType inherit from parentInterface - /// - /// - /// - /// - public static bool DoesAnySubTypeImplementInterface(this TypeDefinition childType, TypeDefinition parentInterfaceDef) + /// + /// Does childType inherit from parentInterface + /// + /// + /// + /// + public static bool DoesAnySubTypeImplementInterface(this TypeDefinition childType, TypeDefinition parentInterfaceDef) { Debug.Assert(parentInterfaceDef.IsInterface); return childType @@ -54,20 +48,13 @@ public static bool DoesSpecificTypeImplementInterface(this TypeDefinition childT .Any(ifaceDef => DoesSpecificInterfaceImplementInterface(ifaceDef.InterfaceType.Resolve(), parentInterfaceDef)); } - public static bool DoesSpecificTypeImplementInterface(this TypeDefinition childTypeDef, string interfaceName) - { - return childTypeDef - .Interfaces - .Any(ifaceDef => ifaceDef.InterfaceType.Name == interfaceName); - } - - /// - /// Does interface iface0 equal or implement interface iface1 - /// - /// - /// - /// - public static bool DoesSpecificInterfaceImplementInterface(TypeDefinition iface0, TypeDefinition iface1) + /// + /// Does interface iface0 equal or implement interface iface1 + /// + /// + /// + /// + public static bool DoesSpecificInterfaceImplementInterface(TypeDefinition iface0, TypeDefinition iface1) { Debug.Assert(iface1.IsInterface); Debug.Assert(iface0.IsInterface); diff --git a/BindGenerater/Generater/Utils.cs b/BindGenerater/Generater/Utils.cs index ae4ecb8..668bde0 100644 --- a/BindGenerater/Generater/Utils.cs +++ b/BindGenerater/Generater/Utils.cs @@ -1,6 +1,4 @@ -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.TypeSystem; -using Mono.Cecil; +using Mono.Cecil; using System; using System.Collections.Generic; using System.IO; @@ -79,7 +77,7 @@ public static string BindMethodParamDefine(MethodDefinition method, bool declear } else { - param += TypeResolver.Resolve(p.ParameterType, method).Box(p.Name) + (p == lastP ? "" : ", "); + param += TypeResolver.Resolve(p.ParameterType).Box(p.Name) + (p == lastP ? "" : ", "); } } @@ -88,7 +86,7 @@ public static string BindMethodParamDefine(MethodDefinition method, bool declear return param; } - public static string ReName(string name) + static string ReName(string name) { return name.Replace("::", "_").Replace(".", "_").Replace("/","_"); } @@ -149,7 +147,7 @@ public static bool Filter(PropertyDefinition property) public static bool Filter(MethodDefinition method) { - if (!Filter(method.ReturnType) || !Filter(method.DeclaringType) || method.DeclaringType.IsNotPublic) + if (!Filter(method.ReturnType)) return false; if (IsObsolete(method)) @@ -172,11 +170,6 @@ public static bool Filter(MethodDefinition method) return false; } - if (method.ReturnType.FullName == "System.Threading.Tasks.Task") // async - { - return false; - } - return true; } @@ -223,12 +216,10 @@ public static bool IsObsolete(ICustomAttributeProvider method) private static HashSet DropTypes = new HashSet(); public static bool Filter(TypeReference type) { + if (DropTypes.Contains(type)) return false; - if (Binder.retainTypes.Contains(type.FullName)) - return true; - foreach (var t in IgnoreTypeSet) { if (type.FullName.Contains(t)) @@ -252,7 +243,7 @@ public static bool Filter(TypeReference type) } } - if (type.IsGeneric() && !(IsDelegate(type))) // + if (type.IsGeneric() && !IsDelegate(type)) // { Log("ignorType: " + type.FullName); DropTypes.Add(type); @@ -289,11 +280,6 @@ public static bool Filter(TypeReference type) if (td != null && td.IsStruct()) { - if(!IsFullValueType(td)) - { - DropTypes.Add(type); - return false; - } foreach (var f in td.Fields) { if (!f.IsStatic && !Utils.Filter(f.FieldType)) @@ -320,20 +306,6 @@ public static bool Filter(TypeReference type) return true; } - public static bool Filter(ITypeDefinition type) - { - var tName = type.FullTypeName.ReflectionName.Replace("+", "/"); - TypeReference tref = Binder.curModule.GetType(tName); - if (tref == null) - Binder.curModule.TryGetTypeReference(tName, out tref); - if(tref != null) - { - return Filter(tref); - } - - return true; - } - public static bool IsAttribute(TypeReference type) { var td = type.Resolve(); @@ -477,7 +449,7 @@ public static string GetGenericTypeName(TypeReference type, bool boxedType = fal return type.Name; var typeName = TypeResolver.Resolve(type).RealTypeName(); - var baseType = typeName.Substring(0, typeName.IndexOf('<')); + var baseType = typeName.Substring(0, typeName.IndexOf('`')); var param = "<"; @@ -520,21 +492,10 @@ public static List GetDelegateParams(TypeReference type, TypeRefe if (delegateTarget != null) types.Add(delegateTarget); - var invokMethod = type.Resolve().Methods.Where(m => m.Name == "Invoke").FirstOrDefault(); - if (type.IsGenericInstance) - { - var gType = type as GenericInstanceType; - types.AddRange(gType.GenericArguments); - returnType = null; + - if (type.Name.StartsWith("Func")) - { - returnType = types.Last(); - types.Remove(returnType); - } - return types; - } - else if(invokMethod != null) + var invokMethod = type.Resolve().Methods.Where(m => m.Name == "Invoke").FirstOrDefault(); + if(invokMethod != null) { foreach (var p in invokMethod.Parameters) { @@ -549,6 +510,19 @@ public static List GetDelegateParams(TypeReference type, TypeRefe else returnType = invokMethod.ReturnType; } + else if (type.IsGenericInstance) + { + var gType = type as GenericInstanceType; + types.AddRange(gType.GenericArguments); + returnType = null; + + if (type.Name.StartsWith("Func")) + { + returnType = types.Last(); + types.Remove(returnType); + } + return types; + } else { returnType = null; @@ -613,14 +587,6 @@ public static HashSet GetNameSpaceRef(MethodDefinition method) { set.Add(p.ParameterType.Namespace); } - - foreach(var attr in method.CustomAttributes) - { - var ns = attr.AttributeType.Namespace; - if (ns.StartsWith("System")) - set.Add(ns); - } - set.Remove(""); return set; } @@ -630,25 +596,13 @@ public static bool IsManagedValueType(TypeReference _type) return _type.IsValueType && !IsFullValueType(_type); } - public static bool IsFullValueType(IType _type) - { - var tn = _type.GetDefinition().FullTypeName.ReflectionName.Replace("+", "/"); - - var td = Binder.curModule.GetType(tn); - if (td != null) - return IsFullValueType(td); - else if (Binder.curModule.TryGetTypeReference(tn, out var tref)) - return IsFullValueType(tref); - - return false; - } - public static bool IsFullValueType(TypeReference _type) { - if (_type.IsPointer) - _type = _type.GetElementType(); var type = _type.Resolve(); - + if (!_type.IsValueType) + { + return false; + } if (type == null) return false; @@ -657,11 +611,6 @@ public static bool IsFullValueType(TypeReference _type) return true; } - if (!_type.IsValueType) - { - return false; - } - foreach (var field in type.Fields) { if (!field.IsStatic && !IsFullValueType(field.FieldType)) @@ -802,68 +751,6 @@ public static bool IsWin32() return os.Platform.ToString().StartsWith("Win"); } - public static void CollectMonoAssembly(string entry, string dir, HashSet adapterSet,HashSet outSet) - { - if (outSet.Contains(entry)) - return; - - var file = Path.Combine(dir, entry); - if (!File.Exists(file)) - return; - - outSet.Add(entry); - var assembly = AssemblyDefinition.ReadAssembly(file); - var refs = assembly.MainModule.AssemblyReferences; - foreach(var aref in refs) - { - var refName = aref.Name; - if (!refName.EndsWith(".dll")) - refName += ".dll"; - - if (adapterSet.Contains(refName)) - continue; - - CollectMonoAssembly(refName, dir, adapterSet, outSet); - } - } - - - public static Dictionary TokenMap; - public static string GetMemberDelcear(IMemberDefinition member, HashSet stripInterface = null) - { - var method = member as MethodDefinition; - if(method != null) - { - if (method.IsConstructor && method.Parameters.Count == 0) - { - return $"public {method.DeclaringType.Name}()"; - } - } - - var token = member.MetadataToken.ToInt32(); - StringWriter writer = new StringWriter(); - var output = new MemberDeclearVisitor(false, writer, Binder.DecompilerSetting.CSharpFormattingOptions); - if (stripInterface != null) - output.stripInterfaceSet = stripInterface; - TokenMap[token].AcceptVisitor(output); - return writer.ToString(); - } - - public static void CopyDir(string src,string tar,string postfix) - { - if (!Directory.Exists(tar)) - Directory.CreateDirectory(tar); - - foreach (string fi in Directory.GetFiles(src)) - { - if(fi.EndsWith(postfix)) - { - string fname = Path.GetFileName(fi); - string targetfname = Path.Combine(tar, fname); - File.Copy(fi, targetfname, true); - } - } - } } public class NameCounter diff --git a/BindGenerater/Generater/Visitor/CustomOutputVisitor.cs b/BindGenerater/Generater/Visitor/CustomOutputVisitor.cs deleted file mode 100644 index 9b32685..0000000 --- a/BindGenerater/Generater/Visitor/CustomOutputVisitor.cs +++ /dev/null @@ -1,368 +0,0 @@ -using Generater; -using ICSharpCode.Decompiler.CSharp.OutputVisitor; -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.CSharp.Transforms; -using ICSharpCode.Decompiler.Semantics; -using ICSharpCode.Decompiler.TypeSystem; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; -using Attribute = ICSharpCode.Decompiler.CSharp.Syntax.Attribute; - -public class CustomOutputVisitor : CSharpOutputVisitor -{ - static HashSet IgnoreUsing = Config.Instance.StripUsing; - - protected bool isNested; - public List nestedUsing = new List(); - public HashSet IgnoreNestType = new HashSet(); - public HashSet InternalTypeRef = new HashSet(); - public HashSet stripInterfaceSet = new HashSet(); - - public bool AddWObject = false; - public bool isFullRetain = false; - string curTypeName = null; - - public CheckTypeRefVisitor checkTypeRefVisitor; - public CustomOutputVisitor(bool _isNested, TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(textWriter, formattingPolicy) - { - isNested = _isNested; - } - - protected override void WriteAttributes(IEnumerable attributes) - { - foreach (var attSec in attributes) - { - foreach (var att in attSec.Attributes) - { - var t = att.Type.Annotation(); // .Annotations.First() as ResolveResult - if(t != null) - { - var td = t.Type as ITypeDefinition; - if (td != null ) - { - if(td.IsBuiltinAttribute() == KnownAttribute.None) - att.Remove(); - } - - if (t.Type.Name == "StructLayoutAttribute") // fix StructLayoutAttribute bug - { - var firstArg = att.Arguments.First(); - var primitExp = firstArg as PrimitiveExpression; - if(primitExp != null) - { - if(primitExp.Value.GetType() == typeof(int)) - { - var layout = (LayoutKind)primitExp.Value; - firstArg.ReplaceWith(new IdentifierExpression("LayoutKind."+ layout)); - } - } - } - - } - } - - if (attSec.Attributes.Count() <= 0) - attSec.Remove(); - } - if (attributes.Count() > 0) - { - base.WriteAttributes(attributes); - } - } - - public override void VisitUsingDeclaration(UsingDeclaration usingDeclaration) - { - if (isNested) - { - nestedUsing.Add(usingDeclaration.Namespace); - return; - } - - if (!IgnoreUsing.Contains(usingDeclaration.Namespace)) - base.VisitUsingDeclaration(usingDeclaration); - } - - protected void ResolveTypeDeclear(TypeDeclaration typeDeclaration) - { - var curRes = typeDeclaration.Annotation(); - var curTypeName = curRes.Type.GetDefinition().FullTypeName.ReflectionName; - - if (typeDeclaration.ClassType == ClassType.Struct || typeDeclaration.ClassType == ClassType.Class) - { - typeDeclaration.Modifiers |= Modifiers.Partial; - if (typeDeclaration.HasModifier(Modifiers.Readonly)) - typeDeclaration.Modifiers ^= Modifiers.Readonly; - if(typeDeclaration.HasModifier(Modifiers.Internal) && Binder.retainTypes.Contains(curTypeName)) - { - var imt = typeDeclaration.ModifierTokens.First(mt => mt.Modifier == Modifiers.Internal); - imt.Modifier = Modifiers.Public; - } - } - /*else if(typeDeclaration.ClassType == ClassType.Interface) - { - typeDeclaration.BaseTypes.Add(new SimpleType("IWObject")); - }*/ - - List dList = new List(); - foreach (var t in typeDeclaration.BaseTypes) - { - var res = t.Annotation(); - var td = res.Type.GetDefinition(); - var fullName = td == null ? res.Type.FullName : td.FullTypeName.ReflectionName; - if ((res.Type.Kind == TypeKind.Interface && !res.Type.Namespace.StartsWith("System") && !Binder.retainTypes.Contains(fullName)) || stripInterfaceSet.Contains(res.Type.Name)) - dList.Add(t); - } - foreach (var t in dList) - typeDeclaration.BaseTypes.Remove(t); - - if (AddWObject) - typeDeclaration.BaseTypes.InsertBefore(typeDeclaration.BaseTypes.FirstOrDefault(),new SimpleType("WObject")); - - /*var wrapFlag = new AttributeSection(); - var wrapAttr = new Attribute(); - wrapAttr.Type = new SimpleType("WrapperClass"); - wrapAttr.Arguments.Add(new PrimitiveExpression(Binder.curModule.Name)); - wrapFlag.Attributes.Add(wrapAttr); - typeDeclaration.Attributes.Add(wrapFlag);*/ - } - - public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) - { - if (!string.IsNullOrEmpty(curTypeName) && !isFullRetain) - return; - - curTypeName = typeDeclaration.Name; - var type = typeDeclaration.Annotation().Type; - if (IgnoreNestType.Contains(type.Name)) - return; - - ResolveTypeDeclear(typeDeclaration); - - base.VisitTypeDeclaration(typeDeclaration); - } - - public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) - { - if(checkTypeRefVisitor != null) - { - var collectRes = methodDeclaration.AcceptVisitor(checkTypeRefVisitor); - if (collectRes != CheckTypeRefVisitor.Result.Ok) - return; - } - - - base.VisitMethodDeclaration(methodDeclaration); - } - - public override void VisitSimpleType(SimpleType simpleType) - { - var res = simpleType.Resolve() as TypeResolveResult; - if(res != null ) - { - var td = res.Type.GetDefinition(); - if(td != null && !td.Namespace.StartsWith("System")) - InternalTypeRef.Add(td.FullTypeName.ReflectionName); - } - base.VisitSimpleType(simpleType); - } -} - -public class BlittablePartOutputVisitor : CustomOutputVisitor -{ - public BlittablePartOutputVisitor(bool _isNested, TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(_isNested, textWriter, formattingPolicy) - { - } - - public override void VisitFieldDeclaration(FieldDeclaration fieldDeclaration) - { - - if(fieldDeclaration.HasModifier(Modifiers.Static) && !fieldDeclaration.HasModifier(Modifiers.Readonly)) - return; - - if (fieldDeclaration.HasModifier(Modifiers.Static) && fieldDeclaration.HasModifier(Modifiers.Readonly) && !fieldDeclaration.HasModifier(Modifiers.Public)) - return; - - base.VisitFieldDeclaration(fieldDeclaration); - } - - public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration) - { - return; - } - - public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration) - { - return; - } - - public override void VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration) - { - return; - } - - public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) - { - return; - } - public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) - { - return; - } -} - - -public class MemberDeclearVisitor: CustomOutputVisitor -{ - bool hasBodyBlock; - - public MemberDeclearVisitor(bool outputBodyBlock,TextWriter textWriter, CSharpFormattingOptions formattingPolicy) : base(false, textWriter, formattingPolicy) - { - hasBodyBlock = outputBodyBlock; - } - - protected override void WriteMethodBody(BlockStatement body, BraceStyle style) - { - if (!hasBodyBlock) - return; - base.WriteMethodBody(body, style); - } - - public override void VisitConstructorInitializer(ConstructorInitializer constructorInitializer) - { - if (!hasBodyBlock) - return; - base.VisitConstructorInitializer(constructorInitializer); - } - - public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) - { - if (!hasBodyBlock) - { - StartNode(propertyDeclaration); - WriteAttributes(propertyDeclaration.Attributes); - WriteModifiers(propertyDeclaration.ModifierTokens); - propertyDeclaration.ReturnType.AcceptVisitor(this); - Space(); - WritePrivateImplementationType(propertyDeclaration.PrivateImplementationType); - WriteIdentifier(propertyDeclaration.NameToken); - EndNode(propertyDeclaration); - return; - } - base.VisitPropertyDeclaration(propertyDeclaration); - } - - public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) - { - ResolveTypeDeclear(typeDeclaration); - - if (!hasBodyBlock) - { - StartNode(typeDeclaration); - WriteModifiers(typeDeclaration.ModifierTokens); - BraceStyle braceStyle; - switch (typeDeclaration.ClassType) - { - case ClassType.Enum: - WriteKeyword(Roles.EnumKeyword); - braceStyle = policy.EnumBraceStyle; - break; - case ClassType.Interface: - WriteKeyword(Roles.InterfaceKeyword); - braceStyle = policy.InterfaceBraceStyle; - break; - case ClassType.Struct: - WriteKeyword(Roles.StructKeyword); - braceStyle = policy.StructBraceStyle; - break; - default: - WriteKeyword(Roles.ClassKeyword); - braceStyle = policy.ClassBraceStyle; - break; - } - WriteIdentifier(typeDeclaration.NameToken); - WriteTypeParameters(typeDeclaration.TypeParameters); - if (typeDeclaration.BaseTypes.Any()) - { - Space(); - WriteToken(Roles.Colon); - Space(); - WriteCommaSeparatedList(typeDeclaration.BaseTypes); - } - - return; - } - - base.VisitTypeDeclaration(typeDeclaration); - } - -} - -public class CheckTypeRefVisitor:DepthFirstAstVisitor -{ - public enum Result - { - Ok = 0, - Error = 1, - } - public Func CheckRefFunc; - public HashSet TypeRefSet = new HashSet(); - public HashSet IgnorRefSet = new HashSet(); - - public CheckTypeRefVisitor(Func func) - { - CheckRefFunc = func; - } - - protected override Result VisitChildren(AstNode node) - { - Result res = Result.Ok; - AstNode next; - for (var child = node.FirstChild; child != null; child = next) - { - next = child.NextSibling; - res |= child.AcceptVisitor(this); - if (res == Result.Error && !(node is TypeDeclaration)) - return Result.Error; - } - return res; - } - - public override Result VisitSimpleType(SimpleType simpleType) - { - var res = simpleType.Resolve() as TypeResolveResult; - if (res != null) - { - var td = res.Type.GetDefinition(); - if (td != null && !td.Namespace.StartsWith("System")) - { - var name = td.FullTypeName.ReflectionName; - if (TypeRefSet.Contains(name)) - return Result.Ok; - else if (IgnorRefSet.Contains(name)) - return Result.Error; - - if (CheckRefFunc(name)) - { - TypeRefSet.Add(name); - return Result.Ok; - } - else - { - IgnorRefSet.Add(name); - return Result.Error; - } - } - } - return base.VisitSimpleType(simpleType); - } - - public override Result VisitAttributeSection(AttributeSection attributeSection) - { - return Result.Ok; - } -} \ No newline at end of file diff --git a/BindGenerater/Generater/Visitor/RetainFilter.cs b/BindGenerater/Generater/Visitor/RetainFilter.cs deleted file mode 100644 index 4cdc5a4..0000000 --- a/BindGenerater/Generater/Visitor/RetainFilter.cs +++ /dev/null @@ -1,371 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using Generater; -using ICSharpCode.Decompiler.CSharp; -using ICSharpCode.Decompiler.CSharp.OutputVisitor; -using ICSharpCode.Decompiler.CSharp.Resolver; -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.CSharp.Transforms; -using ICSharpCode.Decompiler.Semantics; -using ICSharpCode.Decompiler.TypeSystem; -using AstAttribute = ICSharpCode.Decompiler.CSharp.Syntax.Attribute; - - -public class RetainFilter :DepthFirstAstVisitor -{ - public Dictionary RetainDic = new Dictionary(); - public HashSet NamespaceRef = new HashSet(); - private int targetTypeToken; - private MetadataModule module; - public Dictionary TokenMap = new Dictionary(); - private HashSet pendingSet = new HashSet(); - private string curTypeName; - public bool InUnsafeNS; - public bool isFullValueType; - - - public RetainFilter(int tarTypeToken, CSharpDecompiler decompiler) - { - module = decompiler.TypeSystem.MainModule; - targetTypeToken = tarTypeToken; - } - - // return true if need Wrap - protected override bool VisitChildren(AstNode node) - { - bool res = false; - AstNode next; - for (var child = node.FirstChild; child != null; child = next) - { - next = child.NextSibling; - StartNode(child); - res |= child.AcceptVisitor(this); - EndNode(child); - if (res && !(node is TypeDeclaration)) - return true; - } - return res; - } - - void StartNode(AstNode node) - { - pendingSet.Add(node); - } - void EndNode(AstNode node) - { - pendingSet.Remove(node); - } - - #region Declaration - - public override bool VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) - { - bool wrap = base.VisitPropertyDeclaration(propertyDeclaration); - - if(!wrap) - { - var res = propertyDeclaration.Resolve() as MemberResolveResult; - RetainDic[res.Member.MetadataToken.GetHashCode()] = propertyDeclaration; - RequiredNamespaceCollector.CollectNamespaces(res.Member,module, NamespaceRef); - } - - return wrap; - } - - public override bool VisitMethodDeclaration(MethodDeclaration methodDeclaration) - { - var res = methodDeclaration.Resolve() as MemberResolveResult; - var imethod = res.Member as IMethod; - - bool retain = false; - - var isICall = IsInternCallNode(methodDeclaration); - if (!isICall && InUnsafeNS) - return true; - - if (isICall || methodDeclaration.HasModifier(Modifiers.Public)) - retain = !base.VisitMethodDeclaration(methodDeclaration); - - if (!retain) - { - if (methodDeclaration.Name == "ToString" && methodDeclaration.Parameters.Count == 2) // IFormattable - retain = true; - } - - if (retain) - { - RetainDic[res.Member.MetadataToken.GetHashCode()] = methodDeclaration; - RequiredNamespaceCollector.CollectNamespaces(res.Member, module, NamespaceRef); - } - - return !retain; - } - - public override bool VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration) - { - - var retain = !base.VisitConstructorDeclaration(constructorDeclaration); - if (retain) - { - var res = constructorDeclaration.Resolve() as MemberResolveResult; - RetainDic[res.Member.MetadataToken.GetHashCode()] = constructorDeclaration; - RequiredNamespaceCollector.CollectNamespaces(res.Member, module, NamespaceRef); - } - - return !retain; - } - - public override bool VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration) - { - var retain = !base.VisitIndexerDeclaration(indexerDeclaration); - if (retain) - { - var res = indexerDeclaration.Resolve() as MemberResolveResult; - RetainDic[res.Member.MetadataToken.GetHashCode()] = indexerDeclaration; - RequiredNamespaceCollector.CollectNamespaces(res.Member, module, NamespaceRef); - } - - return !retain; - } - - public override bool VisitFieldDeclaration(FieldDeclaration fieldDeclaration) - { - if (isFullValueType) - { - if (fieldDeclaration.HasModifier(Modifiers.Static) && !fieldDeclaration.HasModifier(Modifiers.Readonly)) - return true; - if(fieldDeclaration.HasModifier(Modifiers.Static) && fieldDeclaration.HasModifier(Modifiers.Readonly) && !fieldDeclaration.HasModifier(Modifiers.Public)) - return true; - - return false; - } - - //return fieldDeclaration.HasModifier(Modifiers.Public); - return true; - } - - public override bool VisitAccessor(Accessor accessor) - { - if (accessor.Body.IsNull) - { - return !IsInternCallNode(accessor); - } - - return base.VisitAccessor(accessor); - } - - #endregion - - #region Filter - - public override bool VisitTypeDeclaration(TypeDeclaration typeDeclaration) - { - if (typeDeclaration.GetToken() != targetTypeToken) - return false; - - curTypeName = typeDeclaration.Name; - return base.VisitTypeDeclaration(typeDeclaration); - } - - public override bool VisitAttribute(ICSharpCode.Decompiler.CSharp.Syntax.Attribute attribute) - { - return false; - } - - // aa(bb); - public override bool VisitInvocationExpression(InvocationExpression invocationExpression) - { - var target = invocationExpression.Resolve() as CSharpInvocationResolveResult; - - if (target != null) - { - bool res = NeedWrap(target.Member, invocationExpression); - if (res) - return true; - } - return base.VisitInvocationExpression(invocationExpression); - } - - public override bool VisitObjectCreateExpression(ObjectCreateExpression objectCreateExpression) - { - var target = objectCreateExpression.Resolve() as CSharpInvocationResolveResult; - if (target != null) - { - bool res = NeedWrap(target.Member); - if (res) - return true; - } - - return base.VisitObjectCreateExpression(objectCreateExpression); - } - - // T0.xx / T1 func(T2 aa,T3 bb) / (T5)xx - public override bool VisitSimpleType(SimpleType simpleType) - { - var res = simpleType.Resolve() as TypeResolveResult; - if(res != null && res.Type.Kind != TypeKind.TypeParameter) - { - var td = res.Type.GetDefinition(); - if (td!= null) - { - if(Binder.retainTypes.Contains(td.FullTypeName.ReflectionName)) - return false; - if (!td.Namespace.StartsWith("System") && !Utils.Filter(td)) - return true; - } - - if (td == null || (td.Accessibility != Accessibility.Public && !Utils.IsFullValueType(td))) - return true; - } - - return base.VisitSimpleType(simpleType); - } - - public override bool VisitIdentifierExpression(IdentifierExpression identifierExpression) - { - var member = identifierExpression.Resolve(); - if(member != null) - { - var mres = member as MemberResolveResult; - if (mres != null) - { - bool res = NeedWrap(mres.Member); - if (res) - return true; - } - } - - return base.VisitIdentifierExpression(identifierExpression); - } - - //aa.bb - public override bool VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression) - { - IMember imember = null; - var member = memberReferenceExpression.Target.Resolve(); - var typeMember = member as TypeResolveResult; - if (typeMember != null ) - { - if (typeMember.Type.Kind == TypeKind.Enum || Binder.retainTypes.Contains(typeMember.Type.ReflectionName) || typeMember.Type.Namespace.StartsWith("System")) - return false; - - return true; - } - - member = memberReferenceExpression.MemberNameToken.Resolve(); - if(member == null) - member = memberReferenceExpression.Resolve(); - var mres = member as MemberResolveResult; - if (mres != null) - { - bool res = NeedWrap(mres.Member); - if (res) - return true; - } - - return base.VisitMemberReferenceExpression(memberReferenceExpression); - } - - public override bool VisitConstructorInitializer(ConstructorInitializer constructorInitializer) - { - var target = constructorInitializer.Resolve() as CSharpInvocationResolveResult; - - if (target != null) - { - bool res = NeedWrap(target.Member); - if (res) - return true; - } - - return base.VisitConstructorInitializer(constructorInitializer); - } - - #endregion - - protected bool NeedWrap(IMember member, AstNode pNode = null) - { - if (member.DeclaringType.Namespace.StartsWith("System")) - return false; - if (Binder.retainTypes.Contains(member.DeclaringTypeDefinition.ReflectionName)) - return false; - - bool res = true; - var kind = member.SymbolKind; - var accable = member.Accessibility; - - if(kind == SymbolKind.Property || kind == SymbolKind.Method || kind == SymbolKind.Field || kind == SymbolKind.Constructor) - { - var token = member.MetadataToken.GetHashCode(); - if(TokenMap.TryGetValue(token,out var node)) - { - if (pendingSet.Contains(node)) - return false; - StartNode(node); - res = node.AcceptVisitor(this); - EndNode(node); - - if(!res && pNode != null) - { - var pEntity = pNode.GetParentOf(); - var cEntity = node as EntityDeclaration; - if (cEntity.HasModifier(Modifiers.Unsafe) && !pEntity.HasModifier(Modifiers.Unsafe)) - pEntity.Modifiers |= Modifiers.Unsafe; - } - } - } - - return res; - } - - protected bool NeedWrap(IMethod method) - { - var accable = method.AccessorOwner != null ? method.AccessorOwner.Accessibility : method.Accessibility; - if (accable == Accessibility.Public) - return false; - - var attr = method.GetAttribute(KnownAttribute.MethodImpl); - if (attr != null) - { - var arg = attr.FixedArguments.FirstOrDefault(); - if ((int)arg.Value == (int)MethodImplOptions.InternalCall) - return false; - } - - return true; - } - - protected bool IsInternCallNode(AstNode node) - { - var attrs = node.GetChildsOf() ; - var attr = attrs.Find(at => at.Type.SimpleTypeName() == "MethodImpl"); - if(attr != null) - { - var arg = attr.Arguments.FirstOrDefault() as MemberReferenceExpression; - if(arg != null && arg.MemberName == "InternalCall") - { - return true; - } - } - return false; - - /*var res = Resolve(node) as MemberResolveResult; - if(res != null) - { - var attr = res.Member.GetAttribute(KnownAttribute.MethodImpl); - if (attr != null) - { - var arg = attr.FixedArguments.FirstOrDefault(); - if ((int)arg.Value == (int)MethodImplOptions.InternalCall) - return true; - } - } - return false;*/ - } - - - -} diff --git a/BindGenerater/Generater/Visitor/TokenMapVisitor.cs b/BindGenerater/Generater/Visitor/TokenMapVisitor.cs deleted file mode 100644 index 8cddc80..0000000 --- a/BindGenerater/Generater/Visitor/TokenMapVisitor.cs +++ /dev/null @@ -1,56 +0,0 @@ -using ICSharpCode.Decompiler.CSharp.Syntax; -using ICSharpCode.Decompiler.Semantics; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -public class TokenMapVisitor: DepthFirstAstVisitor -{ - public Dictionary TokenMap = new Dictionary(); - - public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) - { - InsertMap(propertyDeclaration); - base.VisitPropertyDeclaration(propertyDeclaration); - } - public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) - { - InsertMap(methodDeclaration); - base.VisitMethodDeclaration(methodDeclaration); - } - public override void VisitFieldDeclaration(FieldDeclaration fieldDeclaration) - { - InsertMap(fieldDeclaration); - base.VisitFieldDeclaration(fieldDeclaration); - } - public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration) - { - InsertMap(constructorDeclaration); - base.VisitConstructorDeclaration(constructorDeclaration); - } - - public override void VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration) - { - InsertMap(operatorDeclaration); - base.VisitOperatorDeclaration(operatorDeclaration); - } - public override void VisitAccessor(Accessor accessor) - { - InsertMap(accessor); - base.VisitAccessor(accessor); - } - - public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) - { - InsertMap(typeDeclaration); - base.VisitTypeDeclaration(typeDeclaration); - } - - void InsertMap(AstNode node) - { - TokenMap[node.GetToken()] = node; - } - -} diff --git a/BindGenerater/Program.cs b/BindGenerater/Program.cs index 7bdedda..f421aab 100644 --- a/BindGenerater/Program.cs +++ b/BindGenerater/Program.cs @@ -1,5 +1,4 @@ using Generater; -using Generater.C; using Mono.Cecil; using Newtonsoft.Json; using System; @@ -20,7 +19,7 @@ class BindOptions public string ScriptEngineDir; public HashSet AdapterSet; public HashSet InterpSet; - public HashSet Entry; + public Dictionary> StripDic; } public enum BindTarget { @@ -31,6 +30,10 @@ public enum BindTarget static BindOptions options; + private static HashSet IgnoreAssemblySet = new HashSet + { + "PureScript.dll","Adapter.gen.dll","UnityEngine.UnityAnalyticsModule.dll", + }; public static string ToolsetPath; public static BindTarget Mode; @@ -39,20 +42,16 @@ static int Main(string[] args) //TestWriter(); //return; Console.WriteLine("OS: " + Environment.OSVersion); - - //StartBinder(args); - //StartTestBinder(); - try - { - StartBinder(args); - //StartTestBinder(); - Utils.Log("Binder All Done.."); - } - catch(Exception e) - { - Console.Error.WriteLine(e.ToString()); - return 2; - } + try + { + StartBinder(args); + Utils.Log("Binder All Done.."); + } + catch(Exception e) + { + Console.Error.WriteLine(e.ToString()); + return 2; + } return 0; } @@ -75,73 +74,69 @@ static void StartBinder(string[] args) options = JsonConvert.DeserializeObject(json); string managedDir = Path.Combine(options.ScriptEngineDir, "Managed"); - string orignDir = Path.Combine(options.ScriptEngineDir, "Managed_orign"); string adapterDir = Path.Combine(options.ScriptEngineDir, "Adapter"); - - Utils.CopyDir(orignDir,managedDir, ".dll"); ReplaceMscorlib("lib", managedDir); Binder.Init(Path.Combine(adapterDir, "glue")); - CSCGenerater.Init(ToolsetPath, adapterDir,managedDir, options.AdapterSet); + CSCGenerater.Init(ToolsetPath, adapterDir, managedDir, options.AdapterSet); CBinder.Init(Path.Combine(options.ScriptEngineDir, "generated")); - AOTGenerater.Init(options.ScriptEngineDir); - - var assemblySet = new HashSet(); - foreach(var entry in options.Entry) - { - Utils.CollectMonoAssembly(entry, orignDir, options.AdapterSet, assemblySet); - } - - options.AdapterSet.UnionWith(assemblySet.Where(assem => assem.StartsWith("UnityEngine."))); + AOTGenerater.Init(options.ScriptEngineDir, options.StripDic); - foreach (var assembly in options.AdapterSet) - { - if (Config.Instance.IgnoreAssemblySet.Contains(assembly)) - continue; - - var filePath = Path.Combine(orignDir, assembly); - if(File.Exists(filePath)) - { - Binder.Bind(filePath); - } - - } - Binder.End(); - CSCGenerater.End(); - - if (Mode == BindTarget.All) + foreach (var filePath in Directory.GetFiles(managedDir)) { - // CBinder.Bind(CSCGenerater.AdapterWrapperCompiler.outName); + var file = Path.GetFileName(filePath); - foreach (var filePath in Directory.GetFiles(managedDir)) + if (file.EndsWith(".dll") && !IgnoreAssemblySet.Contains(file)) { - var file = Path.GetFileName(filePath); - if (file.EndsWith(".dll") && !Config.Instance.IgnoreAssemblySet.Contains(file)) + if (options.AdapterSet.Contains(file)) { - if(options.InterpSet.Contains(file)) - { - Console.WriteLine("interp: " + file); - ICallGenerater.AddReloableAssembly(file); - } - else if (options.AdapterSet.Contains(file) || file == "Adapter.wrapper.dll") + Binder.Bind(filePath); + } + else if(Mode == BindTarget.All) + { + if (!options.InterpSet.Contains(file)) { - if (file.StartsWith("UnityEngine.")) - { - CBinder.Bind(filePath); - } - Console.WriteLine("aot: " + file); AOTGenerater.AddAOTAssembly(filePath); } + + if (file.StartsWith("UnityEngine.")) + { + Console.WriteLine("bind icall: " + file); + CBinder.Bind(filePath); + } + else + { + if (options.InterpSet.Contains(file)) + Console.WriteLine("Interpreter runtime: " + file); + } } } + } + Binder.End(); + CSCGenerater.End(); + + if (Mode == BindTarget.All) + { CBinder.End(); AOTGenerater.End(); } + foreach(var file in options.AdapterSet) + { + var path = Path.Combine(managedDir, file); + if (File.Exists(path)) + { + var tempDir = Path.Combine(managedDir, "..", "temp"); + if (!Directory.Exists(tempDir)) + Directory.CreateDirectory(tempDir); + File.Copy(path, Path.Combine(tempDir, file), true); + File.Delete(path); + } + } } public static void ReplaceMscorlib(string libDir, string outDir) @@ -154,10 +149,7 @@ public static void ReplaceMscorlib(string libDir, string outDir) { var tarPath = Path.Combine(outDir, fi.Name); if (File.Exists(tarPath) || fi.Name == "netstandard.dll") // netstandard reserved for unity2020 build bug - { File.Copy(Path.Combine(srcDir, fi.Name), tarPath, true); - AOTGenerater.AddAOTAssembly(tarPath); - } } } @@ -173,7 +165,7 @@ static void StartTestBinder() { var file = Path.GetFileName(filePath); - if (file.EndsWith(".dll") && !Config.Instance.IgnoreAssemblySet.Contains(file)) + if (file.EndsWith(".dll") && !IgnoreAssemblySet.Contains(file)) { TestBinder.TestBind(filePath); } diff --git a/DemoProject/Assets/Plugins/AdapterTest/ExceptionTest.cs b/DemoProject/Assets/Plugins/AdapterTest/ExceptionTest.cs index e40e3bd..dfe932c 100644 --- a/DemoProject/Assets/Plugins/AdapterTest/ExceptionTest.cs +++ b/DemoProject/Assets/Plugins/AdapterTest/ExceptionTest.cs @@ -21,13 +21,6 @@ public void NullPointException() } } - public void RegistCallback(Action action) - { - Debug.LogError("RegistCallback 1"); - callback = action; - Debug.LogError("RegistCallback 2"); - } - public void TestCallBack() { Debug.LogError("TestCallBack 1"); diff --git a/DemoProject/Assets/Plugins/PureScript/Editor/PureScriptBuilder.cs b/DemoProject/Assets/Plugins/PureScript/Editor/PureScriptBuilder.cs index 3e881ed..bda4b37 100644 --- a/DemoProject/Assets/Plugins/PureScript/Editor/PureScriptBuilder.cs +++ b/DemoProject/Assets/Plugins/PureScript/Editor/PureScriptBuilder.cs @@ -17,7 +17,7 @@ public static class PureScriptBuilder { public static bool Enable; static string ScriptEngineDir; - static string il2cppWorkDir; + static string il2cppDir; static bool Inbuild = false; static PureScriptBuilder() @@ -64,36 +64,27 @@ public static void BuildDll() //MoveAssemblys(outputDir, buildDir, true); } - - /// - /// resolve all bind task after strip. - /// called by UnityEditor when IL2CPPBuilder.RunIl2CppWithArguments. + /// bind adapter before strip. + /// called by UnityEditor when AssemblyStripper.StripAssemblies. + /// "replace assembly" after strip will trigger il2cpp.exe`s error. /// - public static void RunBinderAfterStrip(string workingDirectory) + /// + public static void RunBinderBeforeStrip(System.String managedAssemblyFolderPath) { Inbuild = false; - if (workingDirectory != null) - il2cppWorkDir = workingDirectory; - else - il2cppWorkDir = "Temp/StagingArea/Data/Managed"; - - - //copy all striped assemblys + il2cppDir = managedAssemblyFolderPath; var managedPath = Path.Combine(ScriptEngineDir, "Managed"); - var managedOrign = Path.Combine(ScriptEngineDir, "Managed_orign"); - CreateOrCleanDirectory(managedPath); - CopyManagedFile(il2cppWorkDir, managedOrign); + //copy all assemblys + CopyManagedFile(il2cppDir, managedPath); - // call binder,bind icall and adapter - CallBinder("All"); - - BackupDir(il2cppWorkDir, true); + // call binder,bind adapter + CallBinder("Adapter"); // replace adapter by generated assembly var generatedAdapter = Path.Combine(managedPath, "Adapter.gen.dll"); - var adapterGenPath = Path.Combine(il2cppWorkDir, "Adapter.gen.dll"); + var adapterGenPath = Path.Combine(il2cppDir, "Adapter.gen.dll"); if (File.Exists(generatedAdapter)) { File.Copy(generatedAdapter, adapterGenPath, true); @@ -101,24 +92,25 @@ public static void RunBinderAfterStrip(string workingDirectory) } } - public static void BackupDir(string workingDirectory, bool revert = false) + /// + /// resolve all bind task after strip. + /// called by UnityEditor when IL2CPPBuilder.RunIl2CppWithArguments. + /// + public static void RunBinderBeforeIl2cpp(string workingDirectory) { - string BackupDir = workingDirectory + "_back"; + Inbuild = false; + if (workingDirectory != null) + il2cppDir = workingDirectory; + //copy all striped assemblys + var managedPath = Path.Combine(ScriptEngineDir, "Managed"); + CopyManagedFile(il2cppDir, managedPath); - if (revert) - { - CopyManagedFile(BackupDir, workingDirectory); - Directory.Delete(BackupDir, true); - } - else - { - CopyManagedFile(workingDirectory, BackupDir); - } + // call binder,bind icall and adapter + CallBinder("All"); } public static void CallBinder(string mode) { - bool debug = true; var binderPath = Path.Combine(ScriptEngineDir, "Tools", "Binder.exe"); var configPath = Path.GetFullPath(Path.Combine(ScriptEngineDir, "Tools", "config.json")); var toolsetPath = GetEnginePath(Path.Combine("Tools", "Roslyn")); @@ -147,18 +139,12 @@ public static void CallBinder(string mode) string debugger = "--debug"; //debugger += " --debugger-agent=transport=dt_socket,address=127.0.0.1:8089,server=y,suspend=y "; - var argStr = debugger + " --runtime=v4.0.30319 \"" + binderPath + "\" \"" + string.Join("\" \"", args.ToArray()) + "\""; - - binder.StartInfo.Arguments = argStr; + binder.StartInfo.Arguments = debugger + " --runtime=v4.0.30319 \"" + binderPath + "\" \"" + string.Join("\" \"", args.ToArray()) + "\""; binder.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; binder.StartInfo.RedirectStandardOutput = true; binder.StartInfo.RedirectStandardError = true; binder.StartInfo.UseShellExecute = false; binder.StartInfo.CreateNoWindow = true; - -#if UNITY_EDITOR_WIN - binder.StartInfo.StandardOutputEncoding = System.Text.Encoding.GetEncoding("GBK"); -#endif binder.Start(); while (!binder.StandardOutput.EndOfStream) @@ -171,7 +157,6 @@ public static void CallBinder(string mode) if (binder.ExitCode != 0) { - Debug.LogError("Run: " + argStr); var errorInfo = "Binder.exe run error. \n" + binder.StandardError.ReadToEnd(); UnityEngine.Debug.LogError(errorInfo); throw new Exception(errorInfo); @@ -227,8 +212,57 @@ static void CreateOrCleanDirectory(string dir) - #region InsertBuildTask +#region InsertBuildTask + static MethodHooker stripHooker; + static MethodHooker il2cppHooker; + +#if UNITY_2020_1_OR_NEWER + public static void RunIl2CppWithArguments(object obj, List arguments, Action setupStartInfo) + { + + if (il2cppHooker != null) + { + il2cppHooker.Dispose(); + il2cppHooker = null; + } + + RunBinderBeforeIl2cpp(null); + + // call the realy method + if (obj != null) + RunIl2CppWithArgumentsWrap(obj, arguments, setupStartInfo); + } + + //redirect to IL2CPPBuilder.RunIl2CppWithArguments + public static void RunIl2CppWithArgumentsWrap(object obj, List arguments, Action setupStartInfo) + { + throw new NotImplementedException(); + } + +#else + public static void RunIl2CppWithArguments(object obj, List arguments, Action setupStartInfo, string workingDirectory) + { + + if (il2cppHooker != null) + { + il2cppHooker.Dispose(); + il2cppHooker = null; + } + + RunBinderBeforeIl2cpp(workingDirectory); + + // call the realy method + if (obj != null) + RunIl2CppWithArgumentsWrap(obj, arguments, setupStartInfo, workingDirectory); + } + + //redirect to IL2CPPBuilder.RunIl2CppWithArguments + public static void RunIl2CppWithArgumentsWrap(object obj, List arguments, Action setupStartInfo, string workingDirectory) + { + throw new NotImplementedException(); + } +#endif #if UNITY_2019_1_OR_NEWER public static void StripAssemblies(string managedAssemblyFolderPath, object unityLinkerPlatformProvider, object il2cppPlatformProvider, object rcr, ManagedStrippingLevel managedStrippingLevel) @@ -241,20 +275,7 @@ public static void StripAssemblies(string managedAssemblyFolderPath, object plat stripHooker.Dispose(); stripHooker = null; } - - /* Modifying the assembly after step 'Strip', will result in an error in step 'Il2cpp' .. - * so after modifying 'Adapter.gen.dll', we need to re-execute step 'Strip'. */ - - BackupDir(managedAssemblyFolderPath); - - // call the realy method -#if UNITY_2019_1_OR_NEWER - StripAssembliesWrap(managedAssemblyFolderPath, unityLinkerPlatformProvider, il2cppPlatformProvider, rcr, managedStrippingLevel); -#else - StripAssembliesWrap(managedAssemblyFolderPath, platformProvider, rcr, managedStrippingLevel); -#endif - - RunBinderAfterStrip(managedAssemblyFolderPath); + RunBinderBeforeStrip(managedAssemblyFolderPath); // call the realy method #if UNITY_2019_1_OR_NEWER @@ -262,7 +283,6 @@ public static void StripAssemblies(string managedAssemblyFolderPath, object plat #else StripAssembliesWrap(managedAssemblyFolderPath, platformProvider, rcr, managedStrippingLevel); #endif - } //redirect to AssemblyStripper.StripAssemblies @@ -272,10 +292,9 @@ public static void StripAssembliesWrap(string managedAssemblyFolderPath, object public static void StripAssembliesWrap(string managedAssemblyFolderPath, object platformProvider, object rcr, ManagedStrippingLevel managedStrippingLevel) #endif { - Debug.LogError("In Unity2020 ,need [Switch to debug mode]"); throw new NotImplementedException(); } - + private static void InsertBuildTask() { if (stripHooker == null) @@ -286,9 +305,20 @@ private static void InsertBuildTask() MethodBase wrap2Orign = typeof(PureScriptBuilder).GetMethod("StripAssembliesWrap"); stripHooker = new MethodHooker(orign, custom, wrap2Orign); } + + if (il2cppHooker == null) + { + var builderType = typeof(Editor).Assembly.GetType("UnityEditorInternal.IL2CPPBuilder"); + MethodBase orign = builderType.GetMethod("RunIl2CppWithArguments", BindingFlags.Instance | BindingFlags.NonPublic); + MethodBase custom = typeof(PureScriptBuilder).GetMethod("RunIl2CppWithArguments"); + MethodBase wrap2Orign = typeof(PureScriptBuilder).GetMethod("RunIl2CppWithArgumentsWrap"); + il2cppHooker = new MethodHooker(orign, custom, wrap2Orign); + } } #endregion + + #region internal private class MethodHooker : IDisposable diff --git a/DemoProject/Assets/Plugins/PureScript/ScriptEngine/ScriptWrapper/MonoBehaviourWrapper.cs b/DemoProject/Assets/Plugins/PureScript/ScriptEngine/ScriptWrapper/MonoBehaviourWrapper.cs index 35d5a40..6369be7 100644 --- a/DemoProject/Assets/Plugins/PureScript/ScriptEngine/ScriptWrapper/MonoBehaviourWrapper.cs +++ b/DemoProject/Assets/Plugins/PureScript/ScriptEngine/ScriptWrapper/MonoBehaviourWrapper.cs @@ -33,7 +33,7 @@ public void Init() FuncPtr[i] = WrapperUtils.GetFuncPtr(this, method.ToString()); if (FuncPtr[i] != IntPtr.Zero) - Debug.Log("bind method: " + method); + Debug.LogError("bind method: " + method); } if(awakeAfterInit) diff --git a/DemoProject/Assets/Scenes/SampleScene.unity b/DemoProject/Assets/Scenes/SampleScene.unity index 2febf38..851dec2 100644 --- a/DemoProject/Assets/Scenes/SampleScene.unity +++ b/DemoProject/Assets/Scenes/SampleScene.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 170076734} - m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641258, b: 0.5748172, a: 1} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.49641287, b: 0.5748173, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -98,7 +98,7 @@ LightmapSettings: m_TrainingDataDestination: TrainingData m_LightProbeSampleCountMultiplier: 4 m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 4890085278179872738, guid: d9683a022a2cd4a46b5d6e8173731dfa, + m_LightingSettings: {fileID: 4890085278179872738, guid: 17b7a9e3e4a6443aa8fb8d770095325b, type: 2} --- !u!196 &4 NavMeshSettings: @@ -124,6 +124,85 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &109510634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 109510635} + - component: {fileID: 109510637} + - component: {fileID: 109510636} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &109510635 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109510634} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 626114514} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &109510636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109510634} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &109510637 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109510634} + m_CullTransparentMesh: 1 --- !u!1 &163445170 GameObject: m_ObjectHideFlags: 0 @@ -167,6 +246,85 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 182f7f64e9c08c943a9de8dd57b59188, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &166265007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 166265008} + - component: {fileID: 166265010} + - component: {fileID: 166265009} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &166265008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 166265007} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2121273855} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &166265009 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 166265007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Button +--- !u!222 &166265010 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 166265007} + m_CullTransparentMesh: 1 --- !u!1 &170076733 GameObject: m_ObjectHideFlags: 0 @@ -199,7 +357,7 @@ Light: m_Intensity: 1 m_Range: 10 m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 + m_InnerSpotAngle: 21.802082 m_CookieSize: 10 m_Shadows: m_Type: 2 @@ -260,7 +418,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &317407178 +--- !u!1 &208180661 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -268,78 +426,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 317407179} - - component: {fileID: 317407181} - - component: {fileID: 317407180} + - component: {fileID: 208180662} + - component: {fileID: 208180664} + - component: {fileID: 208180663} m_Layer: 5 - m_Name: Text + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &317407179 +--- !u!224 &208180662 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317407178} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 208180661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 645583482} - m_RootOrder: 1 + m_Father: {fileID: 219586495} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -0.5} - m_SizeDelta: {x: -20, y: -13} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 155, y: 345} + m_SizeDelta: {x: 184, y: 60} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &317407180 +--- !u!114 &208180663 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317407178} + m_GameObject: {fileID: 208180661} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 1 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &317407181 + m_Sprite: {fileID: 21300000, guid: 1117e89bfeb6e40639bacf1c44d048c8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &208180664 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317407178} + m_GameObject: {fileID: 208180661} m_CullTransparentMesh: 1 ---- !u!1 &479553869 +--- !u!1 &219586491 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -347,94 +501,103 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 479553873} - - component: {fileID: 479553872} - - component: {fileID: 479553871} - - component: {fileID: 479553870} - m_Layer: 0 - m_Name: Cube + - component: {fileID: 219586495} + - component: {fileID: 219586494} + - component: {fileID: 219586493} + - component: {fileID: 219586492} + m_Layer: 5 + m_Name: Canvas m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!65 &479553870 -BoxCollider: +--- !u!114 &219586492 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 479553869} - m_Material: {fileID: 0} - m_IsTrigger: 0 + m_GameObject: {fileID: 219586491} m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &479553871 -MeshRenderer: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &219586493 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 479553869} + m_GameObject: {fileID: 219586491} m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &479553872 -MeshFilter: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &219586494 +Canvas: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 479553869} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &479553873 -Transform: + m_GameObject: {fileID: 219586491} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 534669904} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &219586495 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 479553869} + m_GameObject: {fileID: 219586491} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 682345347} + - {fileID: 1017748137} + - {fileID: 208180662} + - {fileID: 2121273855} + - {fileID: 626114514} m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &534669902 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &405082495 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -442,111 +605,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 534669905} - - component: {fileID: 534669904} - - component: {fileID: 534669903} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera + - component: {fileID: 405082496} + - component: {fileID: 405082498} + - component: {fileID: 405082497} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!81 &534669903 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_Enabled: 1 ---- !u!20 &534669904 -Camera: +--- !u!224 &405082496 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &534669905 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 534669902} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &539278593 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 539278594} - - component: {fileID: 539278596} - - component: {fileID: 539278595} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &539278594 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 539278593} + m_GameObject: {fileID: 405082495} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 645583482} + m_Father: {fileID: 626114514} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -554,13 +634,13 @@ RectTransform: m_AnchoredPosition: {x: 0, y: -0.5} m_SizeDelta: {x: -20, y: -13} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &539278595 +--- !u!114 &405082497 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 539278593} + m_GameObject: {fileID: 405082495} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} @@ -588,149 +668,15 @@ MonoBehaviour: m_VerticalOverflow: 0 m_LineSpacing: 1 m_Text: Enter text... ---- !u!222 &539278596 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 539278593} - m_CullTransparentMesh: 1 ---- !u!1 &566549355 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 566549356} - - component: {fileID: 566549358} - - component: {fileID: 566549357} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &566549356 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 566549355} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 880300249} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 83.17} - m_SizeDelta: {x: 200, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &566549357 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 566549355} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: New Text - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &566549358 +--- !u!222 &405082498 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 566549355} + m_GameObject: {fileID: 405082495} m_CullTransparentMesh: 1 ---- !u!1 &645583481 +--- !u!1 &534669902 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -738,246 +684,82 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 645583482} - - component: {fileID: 645583485} - - component: {fileID: 645583484} - - component: {fileID: 645583483} - m_Layer: 5 - m_Name: InputField - m_TagString: Untagged + - component: {fileID: 534669905} + - component: {fileID: 534669904} + - component: {fileID: 534669903} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &645583482 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 645583481} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 539278594} - - {fileID: 317407179} - m_Father: {fileID: 880300249} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 119.7} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &645583483 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 645583481} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 645583484} - m_TextComponent: {fileID: 317407180} - m_Placeholder: {fileID: 539278595} - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_CharacterValidation: 0 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_ShouldActivateOnSelect: 1 ---- !u!114 &645583484 -MonoBehaviour: +--- !u!81 &534669903 +AudioListener: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 645583481} + m_GameObject: {fileID: 534669902} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &645583485 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 645583481} - m_CullTransparentMesh: 1 ---- !u!1 &880300245 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 880300249} - - component: {fileID: 880300248} - - component: {fileID: 880300247} - - component: {fileID: 880300246} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &880300246 -MonoBehaviour: +--- !u!20 &534669904 +Camera: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880300245} + m_GameObject: {fileID: 534669902} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: serializedVersion: 2 m_Bits: 4294967295 ---- !u!114 &880300247 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880300245} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &880300248 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880300245} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 25 - m_SortingLayerID: 0 - m_SortingOrder: 0 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} m_TargetDisplay: 0 ---- !u!224 &880300249 -RectTransform: + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &534669905 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880300245} + m_GameObject: {fileID: 534669902} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 566549356} - - {fileID: 1414186853} - - {fileID: 2078063756} - - {fileID: 645583482} - - {fileID: 1974553717} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &1414186852 +--- !u!1 &626114513 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -985,78 +767,142 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1414186853} - - component: {fileID: 1414186855} - - component: {fileID: 1414186854} + - component: {fileID: 626114514} + - component: {fileID: 626114517} + - component: {fileID: 626114516} + - component: {fileID: 626114515} m_Layer: 5 - m_Name: Text + m_Name: InputField m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1414186853 +--- !u!224 &626114514 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1414186852} + m_GameObject: {fileID: 626114513} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 880300249} - m_RootOrder: 1 + m_Children: + - {fileID: 405082496} + - {fileID: 109510635} + m_Father: {fileID: 219586495} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 249.99998} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1414186854 +--- !u!114 &626114515 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1414186852} + m_GameObject: {fileID: 626114513} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 626114516} + m_TextComponent: {fileID: 109510636} + m_Placeholder: {fileID: 405082497} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &626114516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 626114513} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 2 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: New Text ---- !u!222 &1414186855 + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &626114517 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1414186852} + m_GameObject: {fileID: 626114513} m_CullTransparentMesh: 1 ---- !u!1 &1457590924 +--- !u!1 &682345346 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1064,9 +910,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1457590925} - - component: {fileID: 1457590927} - - component: {fileID: 1457590926} + - component: {fileID: 682345347} + - component: {fileID: 682345349} + - component: {fileID: 682345348} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1074,32 +920,32 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1457590925 +--- !u!224 &682345347 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457590924} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 682345346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 1974553717} + m_Father: {fileID: 219586495} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 60} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1457590926 +--- !u!114 &682345348 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457590924} + m_GameObject: {fileID: 682345346} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} @@ -1115,123 +961,27 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 30 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 3 m_MaxSize: 40 - m_Alignment: 4 + m_Alignment: 0 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: Button ---- !u!222 &1457590927 + m_Text: New Text +--- !u!222 &682345349 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457590924} + m_GameObject: {fileID: 682345346} m_CullTransparentMesh: 1 ---- !u!1 &1528469502 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1528469506} - - component: {fileID: 1528469505} - - component: {fileID: 1528469504} - - component: {fileID: 1528469503} - m_Layer: 0 - m_Name: Plane - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!64 &1528469503 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528469502} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1528469504 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528469502} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 3ba95793fe8af734a9375f231f4a4202, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1528469505 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528469502} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1528469506 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528469502} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -1.85, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1634601562 +--- !u!1 &731469936 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1239,9 +989,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1634601565} - - component: {fileID: 1634601564} - - component: {fileID: 1634601563} + - component: {fileID: 731469939} + - component: {fileID: 731469938} + - component: {fileID: 731469937} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -1249,13 +999,13 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1634601563 +--- !u!114 &731469937 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1634601562} + m_GameObject: {fileID: 731469936} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} @@ -1268,13 +1018,13 @@ MonoBehaviour: m_InputActionsPerSecond: 10 m_RepeatDelay: 0.5 m_ForceModuleActive: 0 ---- !u!114 &1634601564 +--- !u!114 &731469938 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1634601562} + m_GameObject: {fileID: 731469936} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} @@ -1283,21 +1033,21 @@ MonoBehaviour: m_FirstSelected: {fileID: 0} m_sendNavigationEvents: 1 m_DragThreshold: 10 ---- !u!4 &1634601565 +--- !u!4 &731469939 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1634601562} + m_GameObject: {fileID: 731469936} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1974553716 +--- !u!1 &1017748136 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1305,88 +1055,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1974553717} - - component: {fileID: 1974553720} - - component: {fileID: 1974553719} - - component: {fileID: 1974553718} + - component: {fileID: 1017748137} + - component: {fileID: 1017748139} + - component: {fileID: 1017748138} + - component: {fileID: 1017748140} m_Layer: 5 - m_Name: Button + m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1974553717 +--- !u!224 &1017748137 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1974553716} + m_GameObject: {fileID: 1017748136} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1457590925} - m_Father: {fileID: 880300249} - m_RootOrder: 4 + m_Children: [] + m_Father: {fileID: 219586495} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 73.70001} - m_SizeDelta: {x: 160, y: 30} + m_AnchoredPosition: {x: 0, y: 345} + m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1974553718 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1974553716} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1974553719} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1974553719 +--- !u!114 &1017748138 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1974553716} + m_GameObject: {fileID: 1017748136} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1400,8 +1105,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -1410,15 +1115,34 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1974553720 +--- !u!222 &1017748139 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1974553716} + m_GameObject: {fileID: 1017748136} m_CullTransparentMesh: 1 ---- !u!1 &2078063755 +--- !u!95 &1017748140 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1017748136} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: a7cbbea03f7504542bd282101d9c6617, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!1 &2121273854 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1426,42 +1150,88 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2078063756} - - component: {fileID: 2078063758} - - component: {fileID: 2078063757} + - component: {fileID: 2121273855} + - component: {fileID: 2121273858} + - component: {fileID: 2121273857} + - component: {fileID: 2121273856} m_Layer: 5 - m_Name: Image + m_Name: Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2078063756 +--- !u!224 &2121273855 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2078063755} + m_GameObject: {fileID: 2121273854} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 880300249} - m_RootOrder: 2 + m_Children: + - {fileID: 166265008} + m_Father: {fileID: 219586495} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 284.5, y: -221.3} - m_SizeDelta: {x: 184, y: 60} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 198} + m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2078063757 +--- !u!114 &2121273856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2121273854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2121273857} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2121273857 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2078063755} + m_GameObject: {fileID: 2121273854} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1475,8 +1245,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 838e799aabdeec34296bbb40ad690fdb, type: 3} - m_Type: 0 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -1485,11 +1255,11 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &2078063758 +--- !u!222 &2121273858 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2078063755} + m_GameObject: {fileID: 2121273854} m_CullTransparentMesh: 1 diff --git a/DemoProject/Assets/Scripts/Code/Demo/DebugHelper.cs b/DemoProject/Assets/Scripts/Code/Demo/DebugHelper.cs index be99fec..86a4513 100644 --- a/DemoProject/Assets/Scripts/Code/Demo/DebugHelper.cs +++ b/DemoProject/Assets/Scripts/Code/Demo/DebugHelper.cs @@ -1,8 +1,10 @@ using UnityEngine; +using UnityEngine.Internal; using System; using System.IO; using System.Text; +[ExecuteInEditMode] public class DebugHelper { public const string DEBUG_TAG_KEY = "debug_tag"; @@ -150,7 +152,7 @@ public static void DrawLine(Vector3 start, Vector3 end, Color color, float durat // // Summary: // Draws a line between specified start and end points. - public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration, bool depthTest) + public static void DrawLine(Vector3 start, Vector3 end, [DefaultValue("Color.white")] Color color, [DefaultValue("0.0f")] float duration, [DefaultValue("true")] bool depthTest) { UnityEngine.Debug.DrawLine(start, end, color, duration, depthTest); } @@ -178,7 +180,7 @@ public static void DrawRay(Vector3 start, Vector3 dir, Color color, float durati // // Summary: // Draws a line from start to start + dir in world coordinates. - public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration, bool depthTest) + public static void DrawRay(Vector3 start, Vector3 dir, [DefaultValue("Color.white")] Color color, [DefaultValue("0.0f")] float duration, [DefaultValue("true")] bool depthTest) { UnityEngine.Debug.DrawRay(start, dir, color, duration, depthTest); } diff --git a/DemoProject/Assets/Scripts/Code/Demo/TestBehaviourScript.cs b/DemoProject/Assets/Scripts/Code/Demo/TestBehaviourScript.cs index 472afa6..012450e 100644 --- a/DemoProject/Assets/Scripts/Code/Demo/TestBehaviourScript.cs +++ b/DemoProject/Assets/Scripts/Code/Demo/TestBehaviourScript.cs @@ -10,9 +10,6 @@ public class TestBehaviourScript : MonoBehaviour // Start is called before the first frame update void Start() { - Debug.LogError($"TestBehaviourScript: Start"); - - testObj = GameObject.CreatePrimitive(PrimitiveType.Cube); testTrans = testObj.transform; moveTarget = new Vector3(1, 0, 0); @@ -22,7 +19,6 @@ void Start() StartCoroutine(RunCoroutineTest("teststr",1)); StartCoroutine(StartTestGC()); TestGetComponent(); - Debug.LogError($"TestBehaviourScript: Start End"); } // Update is called once per frame @@ -38,6 +34,7 @@ void Update() testTrans.position = curPos + moveTarget * Time.deltaTime* 3; } + IEnumerator RunCoroutineTest(string str, int a = 1) { Debug.LogError("===== RunCoroutineTest ===== " + str); @@ -45,7 +42,7 @@ IEnumerator RunCoroutineTest(string str, int a = 1) yield return null; Debug.LogError("FFF"); - + yield return StartCoroutine(TestSecendEnumerator()); Debug.LogError("00" + str); @@ -79,8 +76,6 @@ IEnumerator RunCoroutineTest(string str, int a = 1) IEnumerator TestSecendEnumerator() { - System.GC.Collect(); - Debug.LogError("TestSecendEnumerator >>"); yield return new WaitForSeconds(1.0f); Debug.LogError("aaaa"); diff --git a/DemoProject/Assets/Scripts/Code/Demo/TestUGUI.cs b/DemoProject/Assets/Scripts/Code/Demo/TestUGUI.cs deleted file mode 100644 index 5fca33e..0000000 --- a/DemoProject/Assets/Scripts/Code/Demo/TestUGUI.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using UnityEngine.UI; - -class TestUGUI : MonoBehaviour -{ - Canvas canvas; - private void Start() - { - Debug.LogError("start UGUI..."); - canvas = GameObject.FindObjectOfType(); - var input = canvas.gameObject.GetComponentInChildren(); - var btn = canvas.gameObject.GetComponentInChildren