1.完成控制流label/goto的使用2.升级Parse解析器3.Judgement的还原依然存在问题
This commit is contained in:
1
Assets/Plugins/Flee
Submodule
1
Assets/Plugins/Flee
Submodule
Submodule Assets/Plugins/Flee added at a09b3c1eb1
@@ -4,6 +4,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Convention;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Demo.Editor
|
||||
{
|
||||
@@ -18,9 +19,12 @@ namespace Demo.Editor
|
||||
private static void WriteCPPClassBase(StreamWriter stream, Type currentType)
|
||||
{
|
||||
if (currentType == typeof(ScriptableObject))
|
||||
{
|
||||
|
||||
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
// <20><><EFBFBD>ƹ<EFBFBD><C6B9>ߺ<EFBFBD>
|
||||
stream.WriteLine("#define __build_in_pragma #");
|
||||
stream.WriteLine("#define __build_in_to_text(x) #x");
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ඨ<EFBFBD><E0B6A8><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6>
|
||||
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
foreach (var type in asm.GetTypes())
|
||||
{
|
||||
@@ -36,11 +40,31 @@ namespace Demo.Editor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stream.Write(@"/*
|
||||
// <20><><EFBFBD><EFBFBD>Mathf
|
||||
foreach (var method in typeof(Mathf).GetMethods())
|
||||
{
|
||||
stream.WriteLine($"#define {method.Name}({string.Join(',', from param in method.GetParameters() select param.Name)})");
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>label<65><6C>goto
|
||||
stream.Write(@"
|
||||
/*
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ
|
||||
*/
|
||||
");
|
||||
stream.Write($"#define label(label_name) __build_in_pragma define label_name\n\n");
|
||||
stream.Write(@"
|
||||
/*
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>a>bʱ<62><CAB1>ת<EFBFBD><D7AA>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>label<65><6C>
|
||||
*/
|
||||
");
|
||||
stream.Write($"#define goto(a,b,label_name)\n\n");
|
||||
// <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>
|
||||
stream.Write(@"
|
||||
/*
|
||||
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ
|
||||
e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1);
|
||||
*/");
|
||||
*/
|
||||
");
|
||||
stream.Write($"#define with(...)\n\n");
|
||||
return;
|
||||
}
|
||||
@@ -56,9 +80,6 @@ e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1);
|
||||
{
|
||||
if (name == nameof(ScriptableObject.LoadSubScript))
|
||||
{
|
||||
stream.WriteLine("#define __build_in_pragma #");
|
||||
stream.WriteLine("#define __build_in_to_text(x) #x");
|
||||
|
||||
stream.Write("/*\n" + description + "\n*/\n");
|
||||
stream.Write($"#define {name}({string.Join(',', paramList)}) __build_in_pragma include {paramList.ToArray()[1]}\n\n");
|
||||
//stream.Write($"#define {name}({string.Join(',', paramList)})\n\n");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
@@ -8,6 +9,7 @@ using System.Text.RegularExpressions;
|
||||
using Convention;
|
||||
using Convention.WindowsUI.Variant;
|
||||
using Demo.Game;
|
||||
using Flee.PublicTypes;
|
||||
using Sirenix.OdinInspector;
|
||||
using Unity.Profiling;
|
||||
using UnityEngine;
|
||||
@@ -374,10 +376,11 @@ namespace Demo
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上下文系统
|
||||
/// </summary>
|
||||
public partial class ScriptableObject
|
||||
{
|
||||
// 上下文系统
|
||||
|
||||
[Content] public Dictionary<string, float> ScriptContextSpace = new();
|
||||
|
||||
public bool GetCompleteScriptContext(string key, out float value)
|
||||
@@ -391,6 +394,19 @@ namespace Demo
|
||||
return true;
|
||||
}
|
||||
|
||||
public void GetCompleteScriptContext(ref Dictionary<string, float> context)
|
||||
{
|
||||
var current = this;
|
||||
while (current != null)
|
||||
{
|
||||
foreach (var key in current.ScriptContextSpace.Keys)
|
||||
{
|
||||
context[key] = current.ScriptContextSpace[key];
|
||||
}
|
||||
current = current.Parent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置局部上下文变量,将会传递给子物体使用
|
||||
/// </summary>
|
||||
@@ -405,16 +421,28 @@ namespace Demo
|
||||
")]
|
||||
public void SetContext(string name, string value)
|
||||
{
|
||||
ScriptContextSpace[name] = float.Parse(value);
|
||||
ScriptContextSpace[name] = Parse(value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 数值解析工具
|
||||
/// </summary>
|
||||
public partial class ScriptableObject
|
||||
{
|
||||
// 数值解析工具
|
||||
|
||||
private readonly Dictionary<string, DDT> DDTCache = new();
|
||||
private ExpressionContext ExpressionParserCreater()
|
||||
{
|
||||
ExpressionContext context = new();
|
||||
context.Imports.AddType(typeof(Mathf));
|
||||
Dictionary<string, float> vars = new();
|
||||
GetCompleteScriptContext(ref vars);
|
||||
foreach (var item in vars)
|
||||
{
|
||||
context.Variables[item.Key] = item.Value;
|
||||
}
|
||||
return context;
|
||||
}
|
||||
public static float OneBarTime = 1;
|
||||
|
||||
/// <summary>
|
||||
@@ -428,6 +456,10 @@ namespace Demo
|
||||
public float Parse(string value)
|
||||
{
|
||||
value = value.Trim();
|
||||
if(value.StartsWith("\"")&&value.EndsWith("\""))
|
||||
{
|
||||
value = value[1..^1];
|
||||
}
|
||||
if (TimePoints.TryGetValue(value, out var result))
|
||||
return result;
|
||||
if (GetCompleteScriptContext(value, out result))
|
||||
@@ -435,15 +467,19 @@ namespace Demo
|
||||
if(value.EndsWith(']'))
|
||||
{
|
||||
{
|
||||
Regex regex = new(@"^(.+)\[(\d+)\]$");
|
||||
Regex regex = new(@"^(.+)\[(.+)\]$");
|
||||
var match = regex.Match(value);
|
||||
if (match.Success)
|
||||
{
|
||||
if (FindWithPath(match.Groups[1].Value) is DDT ddt)
|
||||
{
|
||||
DDTCache[match.Groups[1].Value] = ddt;
|
||||
}
|
||||
return DDTCache[match.Groups[1].Value].Datas[int.Parse(match.Groups[2].Value)];
|
||||
return (FindWithPath(match.Groups[1].Value) as DDT).Datas[(int)this.Parse(match.Groups[2].Value)];
|
||||
}
|
||||
}
|
||||
{
|
||||
Regex regex = new(@"^(.+)\[\]$");
|
||||
var match = regex.Match(value);
|
||||
if (match.Success)
|
||||
{
|
||||
return (FindWithPath(match.Groups[1].Value) as DDT).Datas.Count;
|
||||
}
|
||||
}
|
||||
throw new ArgumentException("value is end by ']' but not match on any invlid parse");
|
||||
@@ -465,23 +501,34 @@ namespace Demo
|
||||
}
|
||||
try
|
||||
{
|
||||
return float.Parse(value);
|
||||
if (float.TryParse(value, out var _result))
|
||||
return _result;
|
||||
else
|
||||
return ExpressionParserCreater().CompileGeneric<float>(value).Evaluate();
|
||||
}
|
||||
catch
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new FormatException($"{value} is not support any Parser");
|
||||
throw new FormatException($"{value} is not support any Parser", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected T ConvertValue<T>(string str)
|
||||
{
|
||||
return ConventionUtility.convert_xvalue<T>(str);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 先天支持的工具函数
|
||||
/// </summary>
|
||||
public partial class ScriptableObject
|
||||
{
|
||||
// 先天支持的工具函数
|
||||
|
||||
[Content, SerializeField] private Vector3
|
||||
EnterGameLocalPosition = Vector3.zero,
|
||||
EnterGameEulerAngles = Vector3.zero,
|
||||
EnterGameLocalScaling = Vector3.one;
|
||||
[Content, SerializeField] private bool IsSetObjectDisable = false;
|
||||
|
||||
/// <summary>
|
||||
/// 设置坐标
|
||||
@@ -538,13 +585,6 @@ namespace Demo
|
||||
EnterGameLocalScaling = new(Parse(x), Parse(y), Parse(z));
|
||||
}
|
||||
|
||||
public virtual void ResetEnterGameStatus()
|
||||
{
|
||||
transform.localPosition = EnterGameLocalPosition;
|
||||
transform.localEulerAngles = EnterGameEulerAngles;
|
||||
transform.localScale = EnterGameLocalScaling;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭该物体,
|
||||
/// 在面对如多Game场景时关闭某些GameWorld中默认存在的全局灯光等场景时非常有用
|
||||
@@ -557,10 +597,24 @@ namespace Demo
|
||||
")]
|
||||
public void SetObjectDisable()
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
IsSetObjectDisable = true;
|
||||
}
|
||||
|
||||
private void ResetScriptableObjectEnterGameStatus()
|
||||
{
|
||||
transform.localPosition = EnterGameLocalPosition;
|
||||
transform.localEulerAngles = EnterGameEulerAngles;
|
||||
transform.localScale = EnterGameLocalScaling;
|
||||
if (IsSetObjectDisable)
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UpdatePerFrame相关
|
||||
/// </summary>
|
||||
public partial class ScriptableObject
|
||||
{
|
||||
[Content] public int UpdatePerFrame = 1;
|
||||
@@ -584,47 +638,13 @@ namespace Demo
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>使用<see cref="ScriptableCallAttribute"/>标记可编辑脚本所能够调用的函数,并附加注释</para>
|
||||
/// <para>使用<see cref="DefaultScriptAttribute"/>标记派生类,并附加默认模板</para>
|
||||
/// EnableScript相关
|
||||
/// </summary>
|
||||
public partial class ScriptableObject : SerializedMonoBehaviour, IHierarchyItemClickEventListener
|
||||
public partial class ScriptableObject
|
||||
{
|
||||
|
||||
public static Dictionary<string, Type> FastScriptableObjectTypen = new();
|
||||
public static bool IsAutoPlay = false;
|
||||
|
||||
public string SourcePath = "";
|
||||
public string ScriptName = "";
|
||||
public string ScriptPath;
|
||||
public string ScriptTypename;
|
||||
private bool isEnableScript = false;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public ProfilerMarker s_PreparePerfMarker;
|
||||
#endif
|
||||
public ScriptableObject Parent;
|
||||
|
||||
public RootObject GetRoot()
|
||||
{
|
||||
if (Parent == null)
|
||||
return this as RootObject;
|
||||
if (Parent is RootObject result)
|
||||
return result;
|
||||
else return Parent.GetRoot();
|
||||
}
|
||||
|
||||
public List<ScriptableObject> Childs = new();
|
||||
|
||||
// Hierarchy
|
||||
|
||||
public PropertiesWindow.ItemEntry MyHierarchyItem;
|
||||
public static PropertiesWindow.ItemEntry AllScriptableObjectCounterHierarchyItem;
|
||||
public static int AllScriptableObjectCounter = 0;
|
||||
|
||||
// Cache
|
||||
|
||||
public static Dictionary<Type, Dictionary<string, MemberInfo>> MethodInvokerCache = new();
|
||||
|
||||
public void EnableScript(string sourcePath, string scriptPath, string scriptType, ScriptableObject parent)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
@@ -660,6 +680,57 @@ namespace Demo
|
||||
// parentHierarchyItem.GetPropertyListItem().RefreshChilds();
|
||||
}
|
||||
|
||||
public bool EnsureEnableScript()
|
||||
{
|
||||
if (isEnableScript == false)
|
||||
{
|
||||
Debug.LogError("ScriptableObject is currently disableScript", this);
|
||||
}
|
||||
return isEnableScript;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <para>使用<see cref="ScriptableCallAttribute"/>标记可编辑脚本所能够调用的函数,并附加注释</para>
|
||||
/// <para>使用<see cref="DefaultScriptAttribute"/>标记派生类,并附加默认模板</para>
|
||||
/// </summary>
|
||||
public partial class ScriptableObject : SerializedMonoBehaviour, IHierarchyItemClickEventListener
|
||||
{
|
||||
|
||||
public static Dictionary<string, Type> FastScriptableObjectTypen = new();
|
||||
public static bool IsAutoPlay = false;
|
||||
|
||||
public string SourcePath = "";
|
||||
public string ScriptName = "";
|
||||
public string ScriptPath;
|
||||
public string ScriptTypename;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public ProfilerMarker s_PreparePerfMarker;
|
||||
#endif
|
||||
public ScriptableObject Parent;
|
||||
|
||||
public RootObject GetRoot()
|
||||
{
|
||||
if (Parent == null)
|
||||
return this as RootObject;
|
||||
if (Parent is RootObject result)
|
||||
return result;
|
||||
else return Parent.GetRoot();
|
||||
}
|
||||
|
||||
public List<ScriptableObject> Childs = new();
|
||||
|
||||
// Hierarchy
|
||||
|
||||
public PropertiesWindow.ItemEntry MyHierarchyItem;
|
||||
public static PropertiesWindow.ItemEntry AllScriptableObjectCounterHierarchyItem;
|
||||
public static int AllScriptableObjectCounter = 0;
|
||||
|
||||
// Cache
|
||||
|
||||
public static Dictionary<Type, Dictionary<string, MemberInfo>> MethodInvokerCache = new();
|
||||
|
||||
public const string RootObjectQuickPath = "project/";
|
||||
|
||||
public ScriptableObject FindWithPath(string path, bool isMustExist = true)
|
||||
@@ -790,8 +861,6 @@ namespace Demo
|
||||
yield return LoadSubScriptAsync(type, path, null);
|
||||
}
|
||||
|
||||
public object DynamicBindingTarget { get; protected set; } = null;
|
||||
|
||||
private enum ParseStats
|
||||
{
|
||||
None,
|
||||
@@ -899,8 +968,8 @@ namespace Demo
|
||||
if (a > b)
|
||||
{
|
||||
commandIterator = commandLabels[words[2]];
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Functions
|
||||
@@ -988,15 +1057,6 @@ namespace Demo
|
||||
}
|
||||
}
|
||||
|
||||
public bool EnsureEnableScript()
|
||||
{
|
||||
if (isEnableScript == false)
|
||||
{
|
||||
Debug.LogError("ScriptableObject is currently disableScript", this);
|
||||
}
|
||||
return isEnableScript;
|
||||
}
|
||||
|
||||
[Content] private bool IsEnableUpdate = false;
|
||||
|
||||
public virtual IEnumerator LoadScript(string script)
|
||||
@@ -1043,10 +1103,9 @@ namespace Demo
|
||||
}
|
||||
this.isEnableScript = false;
|
||||
this.Parent = null;
|
||||
DynamicBindingTarget = null;
|
||||
this.name = "<Unload>";
|
||||
// 清理Cache
|
||||
DDTCache.Clear();
|
||||
//
|
||||
// 减数
|
||||
AllScriptableObjectCounter--;
|
||||
AllScriptableObjectCounterHierarchyItem.GetHierarchyItem().text = $"ScriptableObjectCount: {AllScriptableObjectCounter}";
|
||||
@@ -1099,9 +1158,9 @@ namespace Demo
|
||||
|
||||
}
|
||||
|
||||
protected T ConvertValue<T>(string str)
|
||||
public virtual void ResetEnterGameStatus()
|
||||
{
|
||||
return ConventionUtility.convert_xvalue<T>(str);
|
||||
ResetScriptableObjectEnterGameStatus();
|
||||
}
|
||||
|
||||
public virtual void OnHierarchyItemRightClick(RectTransform item)
|
||||
|
||||
Reference in New Issue
Block a user