diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index 029a5ec5..9ba39189 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -100,8 +100,8 @@ public class ActionHelper return BtnsAction.Allocate(act.Value); case "Anim": { - var strAction = (XMLTool.StringListAction)act; - return QFramework.AnimationAction.Allocate(act.Value, strAction.args[0], strAction.args[1]); + var strAction = (XMLTool.DictionaryAction)act; + return QFramework.AnimationAction.Allocate(act.Value, strAction.args); } case "UITools": { @@ -159,8 +159,8 @@ public class ActionHelper } case "HighLight": { - var strAction = (XMLTool.StringListAction)act; - return HighLightAction.Allocate(act.Value, strAction.args[0], strAction.args[1]); + var strAction = (XMLTool.DictionaryAction)act; + return HighLightAction.Allocate(act.Value, strAction.args); } case "LoadRes": { diff --git a/Assets/Scripts/Actions/AnimationAction.cs b/Assets/Scripts/Actions/AnimationAction.cs index c211d434..b7d4420d 100644 --- a/Assets/Scripts/Actions/AnimationAction.cs +++ b/Assets/Scripts/Actions/AnimationAction.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using UnityEngine; +using UnityEngine.Rendering.Universal; namespace QFramework { @@ -20,17 +22,19 @@ namespace QFramework string path; string animName; - bool reset = false; Animation anim; - public static AnimationAction Allocate(string path, string animName, string reset, System.Action OnFinished = null) + string frame; + string speed; + public static AnimationAction Allocate(string path, Dictionary datas, System.Action OnFinished = null) { var retNode = mPool.Allocate(); retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.Deinited = false; retNode.Reset(); retNode.path = path; - retNode.animName = animName; - bool.TryParse(reset, out retNode.reset); + retNode.animName = datas.ContainsKey("animName") ? datas["animName"] : ""; + retNode.frame = datas.ContainsKey("frame") ? datas["frame"] : ""; + retNode.speed = datas.ContainsKey("speed") ? datas["speed"] : ""; retNode.OnFinished = OnFinished; return retNode; } @@ -45,10 +49,25 @@ namespace QFramework if (obj != null) { anim = obj.GetComponent(); - anim.Play(animName); - if (reset) + + if (string.IsNullOrEmpty(frame) == false && frame != "-1") { - ActionKit.DelayFrame(1, () => anim.Stop()); + int curFrame = 0; + int.TryParse(frame, out curFrame); + anim[animName].time = curFrame / anim.clip.frameRate; + anim[animName].speed = 0; + anim.Play(animName); + this.Finish(); + } + else + { + float curSpeed = 1; + if (string.IsNullOrEmpty(speed)==false) + { + float.TryParse(speed, out curSpeed); + } + anim[animName].speed = curSpeed; + anim.Play(animName); } } else diff --git a/Assets/Scripts/Actions/HighLightAction.cs b/Assets/Scripts/Actions/HighLightAction.cs index 3ffdb92d..ce7e9687 100644 --- a/Assets/Scripts/Actions/HighLightAction.cs +++ b/Assets/Scripts/Actions/HighLightAction.cs @@ -1,5 +1,6 @@ using HighlightPlus; using System; +using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -22,18 +23,26 @@ namespace QFramework string path; Color color = Color.green; bool isHigh = true; - public static HighLightAction Allocate(string path, string isHigh, string color, System.Action OnFinished = null) + string deviceName = string.Empty; + public static HighLightAction Allocate(string path, Dictionary datas, System.Action OnFinished = null) { var retNode = mPool.Allocate(); retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.Deinited = false; retNode.Reset(); retNode.path = path; - if (string.IsNullOrEmpty(color) == false) + + if (datas.ContainsKey("color")) { - retNode.color = Utility.ToColor(color); + + retNode.color = Utility.ToColor(datas["color"]); + } - bool.TryParse(isHigh, out retNode.isHigh); + if (datas.ContainsKey("isHigh")) + { + bool.TryParse(datas["isHigh"], out retNode.isHigh); + } + retNode.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : string.Empty; retNode.OnFinished = OnFinished; return retNode; } @@ -44,7 +53,16 @@ namespace QFramework public void OnStart() { - GameObject obj = Utility.FindObj(path); + GameObject obj = null; + if (string.IsNullOrEmpty(deviceName) == false) + { + obj = DeviceController.Instance.GetDeviceObj(deviceName); + } + else + { + obj = Utility.FindObj(path); + } + if (obj != null) { if (isHigh) diff --git a/Assets/Scripts/Controller/OperationController.cs b/Assets/Scripts/Controller/OperationController.cs index 0992e08b..dfad5464 100644 --- a/Assets/Scripts/Controller/OperationController.cs +++ b/Assets/Scripts/Controller/OperationController.cs @@ -124,55 +124,72 @@ public class OperationController : MonoSingleton { if (this.index < targetIndex) { - for (int i = this.index + 1; i < targetIndex; i++) + var seq = ActionKit.Sequence(); + if (this.index >= 0) { - // 完成动作 直接执行 - IAction finishAction = ActionHelper.GetActionAndSub(steps[i].Finished); - if (finishAction != null) + for (int i = this.index; i < targetIndex; i++) { - finishAction.Start(this); + // 完成动作 直接执行 + IAction finishAction = ActionHelper.GetActionAndSub(steps[i].Finished); + TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = i, status = StepStatus.Finished }); + if (finishAction != null) + { + seq.Append(finishAction); + } } - TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = i, status = StepStatus.Finished }); - } - curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); + seq.Start(this, () => + { + curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); + RunCurAction(curAction, targetIndex); + }); } else if (this.index > targetIndex) { + var seq = ActionKit.Sequence(); for (int i = this.index; i > targetIndex; i--) { // 重置动作 直接重置 IAction resetAction = ActionHelper.GetActionAndSub(steps[i].Reset); if (resetAction != null) { - resetAction.Start(this); + seq.Append(resetAction); } TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = i, status = StepStatus.NoStart }); - } - curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); - } - else - { - curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); - } - if (curAction != null) - { - this.index = targetIndex; - isStepRun = true; - TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Start }); - curAction.Start(this, () => + seq.Start(this, () => { - isStepRun = false; - TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished }); + curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); + RunCurAction(curAction, targetIndex); }); } else { - this.index = targetIndex; - TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished }); - Execute(this.index + 1); + curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start); + RunCurAction(curAction, targetIndex); } + + } + } + + public void RunCurAction(IAction curAction, int targetIndex) + { + if (curAction != null) + { + this.index = targetIndex; + isStepRun = true; + TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Start }); + curAction.Start(this, () => + { + isStepRun = false; + TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished }); + }); + } + else + { + this.index = targetIndex; + TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished }); + Execute(this.index + 1); } } } diff --git a/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs b/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs new file mode 100644 index 00000000..0f451c54 --- /dev/null +++ b/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs @@ -0,0 +1,84 @@ +锘 +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.IO; +using System.Text.RegularExpressions; +using System; +using System.IO; + + +public class FbxAnimListPostprocessor : MonoBehaviour +{ + [MenuItem("Assets/SplitAnimNew")] + public static void SplitAnim() + { + UnityEngine.Object obj = Selection.activeObject; + if( null != obj ) + { + string assetPath = AssetDatabase.GetAssetPath(obj); + try + { + string fileAnim; + fileAnim = assetPath; + string ClipText = Path.ChangeExtension(fileAnim, ".txt"); + StreamReader file = new StreamReader(ClipText); + string sAnimList = file.ReadToEnd(); + file.Close(); + // + if (EditorUtility.DisplayDialog("FBX Animation Import from file", + fileAnim, "Import", "Cancel")) + { + System.Collections.ArrayList List = new ArrayList(); + ParseAnimFile(sAnimList, ref List); + + ModelImporter modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter; + modelImporter.animationType = ModelImporterAnimationType.Legacy; + //modelImporter.clipAnimations. = true; + modelImporter.clipAnimations = (ModelImporterClipAnimation[]) + List.ToArray(typeof(ModelImporterClipAnimation)); + AssetDatabase.ImportAsset(assetPath); + + EditorUtility.DisplayDialog("瀵煎叆鎴愬姛", + "Number of imported clips: " + + modelImporter.clipAnimations.GetLength(0).ToString(), "OK"); + } + } + catch { } + // (Exception e) { EditorUtility.DisplayDialog("Imported animations", e.Message, "OK"); } + } + } + + static void ParseAnimFile(string sAnimList, ref System.Collections.ArrayList List) + { + Regex regexString = new Regex(" *(?[0-9]+) *- *(?[0-9]+) *(?(loop|noloop| )) *(?[^\r^\n]*[^\r^\n^ ])", + RegexOptions.Compiled | RegexOptions.ExplicitCapture); + + Match match = regexString.Match(sAnimList, 0); + while (match.Success) + { + ModelImporterClipAnimation clip = new ModelImporterClipAnimation(); + + if (match.Groups["firstFrame"].Success) + { + clip.firstFrame = System.Convert.ToInt32(match.Groups["firstFrame"].Value, 10); + } + if (match.Groups["lastFrame"].Success) + { + clip.lastFrame = System.Convert.ToInt32(match.Groups["lastFrame"].Value, 10); + } + if (match.Groups["loop"].Success) + { + clip.loop = match.Groups["loop"].Value == "loop"; + } + if (match.Groups["name"].Success) + { + clip.name = match.Groups["name"].Value; + } + + List.Add(clip); + + match = regexString.Match(sAnimList, match.Index + match.Length); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs.meta b/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs.meta new file mode 100644 index 00000000..968a154f --- /dev/null +++ b/Assets/Scripts/Editor/FbxAnimListPostprocessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: deca3cf63294eda47b1155de672f9698 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Launch.cs b/Assets/Scripts/Launch.cs index 2a13b1b4..ed089f65 100644 --- a/Assets/Scripts/Launch.cs +++ b/Assets/Scripts/Launch.cs @@ -56,9 +56,8 @@ public class Launch : MonoBehaviour } - IEnumerator PreLoad() - { - yield return null; - } + + + } diff --git a/Assets/Scripts/TimeScaleController.cs b/Assets/Scripts/TimeScaleController.cs new file mode 100644 index 00000000..1e4272b6 --- /dev/null +++ b/Assets/Scripts/TimeScaleController.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class TimeScaleController : MonoBehaviour +{ + + [Range(0, 10)] + public float animSpeed = 1.0f; + + +#if UNITY_EDITOR + private void Update() + { + Time.timeScale = animSpeed; + } +#endif +} diff --git a/Assets/Scripts/TimeScaleController.cs.meta b/Assets/Scripts/TimeScaleController.cs.meta new file mode 100644 index 00000000..d2e999e7 --- /dev/null +++ b/Assets/Scripts/TimeScaleController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2c08eae7cce6c9479adebcaad5706c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Xml/XmlParser.cs b/Assets/Scripts/Xml/XmlParser.cs index 5e112adf..3fcc3afd 100644 --- a/Assets/Scripts/Xml/XmlParser.cs +++ b/Assets/Scripts/Xml/XmlParser.cs @@ -358,24 +358,21 @@ namespace XMLTool break; case "Anim": { - var act = new StringListAction(); + var act = new DictionaryAction(); var animName = action.Attribute("animName"); if (animName != null) { - act.args.Add(animName.Value); + act.args.Add("animName",animName.Value); } - else + var frame = action.Attribute("frame"); + if (frame != null) { - act.args.Add(""); + act.args.Add("frame", frame.Value); } - var reset = action.Attribute("reset"); - if (reset != null) + var speed = action.Attribute("speed"); + if (speed != null) { - act.args.Add(reset.Value); - } - else - { - act.args.Add("false"); + act.args.Add("speed", speed.Value); } newAction = act; @@ -763,24 +760,21 @@ namespace XMLTool break; case "HighLight": { - var act = new StringListAction(); + var act = new DictionaryAction(); XAttribute isHigh = action.Attribute("isHigh"); if (isHigh != null) { - act.args.Add(isHigh.Value); - } - else - { - act.args.Add("true"); + act.args.Add("isHigh", isHigh.Value); } XAttribute color = action.Attribute("color"); if (color != null) { - act.args.Add(color.Value); + act.args.Add("color", color.Value); } - else + XAttribute deviceName = action.Attribute("deviceName"); + if (deviceName != null) { - act.args.Add(""); + act.args.Add("deviceName", deviceName.Value); } newAction = act; } diff --git a/Doc/Xml閰嶇疆鏂囨。.xml b/Doc/Xml閰嶇疆鏂囨。.xml index 667baeb6..e59c82cd 100644 --- a/Doc/Xml閰嶇疆鏂囨。.xml +++ b/Doc/Xml閰嶇疆鏂囨。.xml @@ -17,8 +17,8 @@ - - + + @@ -57,8 +57,8 @@ - - + + - - + + @@ -111,7 +111,7 @@ needClick濡傛灉涓簍rue 鍔ㄧ敾缁撴潫鍚庝笉浼氳嚜鍔ㄥ皬鏃 闇瑕佺偣鍑荤┖鐧藉 reverse 鏄椂閽熷掕鏃跺姩鐢绘槸鍚﹀掑簭鎾斁 format="{0:F1}" F1浠h〃淇濈暀1浣嶅皬鏁 F2浠h〃2浣 F0浠h〃涓嶄繚鐣欏皬鏁 - --> + -->