diff --git a/Assets/Art/UIPrefab/UIOperationList.prefab b/Assets/Art/UIPrefab/UIOperationList.prefab index e387fe22..1f4d179f 100644 --- a/Assets/Art/UIPrefab/UIOperationList.prefab +++ b/Assets/Art/UIPrefab/UIOperationList.prefab @@ -465,8 +465,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 131.91986, y: 0} - m_SizeDelta: {x: 263.8398, y: -752.1277} + m_AnchoredPosition: {x: 216.55383, y: 0} + m_SizeDelta: {x: 433.1077, y: -752.1277} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &9008854919363526693 CanvasRenderer: @@ -725,7 +725,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -1274,7 +1274,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index b1ff7e73..78c97d2f 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -173,6 +173,11 @@ public class ActionHelper var strAction = (XMLTool.DictionaryAction)act; return HighLightAction.Allocate(act.Value, strAction.args); } + case "HighLightFlash": + { + var strAction = (XMLTool.DictionaryAction)act; + return HighLightFlashAction.Allocate(act.Value, strAction.args); + } case "LoadRes": { var dictAction = (XMLTool.DictionaryAction)act; @@ -254,7 +259,7 @@ public class ActionHelper /// public static ICondition GetCondition(XMLTool.ActionItem condition) { - if (condition!=null) + if (condition != null) { switch (condition.Type) { @@ -269,8 +274,15 @@ public class ActionHelper case "UIClick": return UIClickCondition.Allocate(condition.Value); case "ObjClick": - var dict = (XMLTool.DictionaryCondition)condition; - return ObjClickCondition.Allocate(dict.Value, dict.args); + { + var dict = (XMLTool.DictionaryCondition)condition; + return ObjClickCondition.Allocate(dict.Value, dict.args); + } + case "ObjClickLong": + { + var dict = (XMLTool.DictionaryCondition)condition; + return ObjClickLongCondition.Allocate(dict.Value, dict.args); + } case "Input": return InputCondition.Allocate(condition.Value); case "Var": diff --git a/Assets/Scripts/Actions/HighLightAction.cs b/Assets/Scripts/Actions/HighLightAction.cs index c8da574f..03ae7af9 100644 --- a/Assets/Scripts/Actions/HighLightAction.cs +++ b/Assets/Scripts/Actions/HighLightAction.cs @@ -25,6 +25,7 @@ namespace QFramework bool isHigh = true; string deviceName = string.Empty; string isIndependent; + string visibility; public static HighLightAction Allocate(string path, Dictionary datas, System.Action OnFinished = null) { var retNode = mPool.Allocate(); @@ -45,6 +46,7 @@ namespace QFramework } retNode.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : string.Empty; retNode.isIndependent = datas.ContainsKey("isIndependent") ? datas["isIndependent"] : string.Empty; + retNode.visibility = datas.ContainsKey("visibility") ? datas["visibility"] : string.Empty; retNode.OnFinished = OnFinished; return retNode; } @@ -72,6 +74,9 @@ namespace QFramework var effect = obj.GetOrAddComponent(); effect.outlineColor = color; effect.highlighted = true; + Visibility visibility = Visibility.Normal; + Enum.TryParse(this.visibility, out visibility); + effect.outlineVisibility = visibility; obj.GetOrAddComponent(); if (string.IsNullOrEmpty(isIndependent) == false) { @@ -93,6 +98,11 @@ namespace QFramework { effect.highlighted = false; } + var flash = obj.GetComponent(); + if (flash) + { + flash.Stop(); + } } } diff --git a/Assets/Scripts/Actions/HighLightFlashAction.cs b/Assets/Scripts/Actions/HighLightFlashAction.cs new file mode 100644 index 00000000..71baafb7 --- /dev/null +++ b/Assets/Scripts/Actions/HighLightFlashAction.cs @@ -0,0 +1,154 @@ +using HighlightPlus; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace QFramework +{ + internal class HighLightFlashAction : IAction + { + + + public System.Action OnFinished { get; set; } + + + private HighLightFlashAction() + { + } + + private static readonly SimpleObjectPool mPool = + new SimpleObjectPool(() => new HighLightFlashAction(), null, 10); + + string path; + Color color = Color.green; + bool isHigh = true; + string deviceName = string.Empty; + string isIndependent; + string count; + string time; + string finishedEvent; + string visibility; + public static HighLightFlashAction 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 (datas.ContainsKey("color")) + { + + retNode.color = Utility.ToColor(datas["color"]); + + } + if (datas.ContainsKey("isHigh")) + { + bool.TryParse(datas["isHigh"], out retNode.isHigh); + } + retNode.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : string.Empty; + retNode.isIndependent = datas.ContainsKey("isIndependent") ? datas["isIndependent"] : string.Empty; + retNode.count = datas.ContainsKey("count") ? datas["count"] : string.Empty; + retNode.time = datas.ContainsKey("time") ? datas["time"] : string.Empty; + retNode.finishedEvent = datas.ContainsKey("finishedEvent") ? datas["finishedEvent"] : string.Empty; + retNode.visibility = datas.ContainsKey("visibility") ? datas["visibility"] : string.Empty; + retNode.OnFinished = OnFinished; + return retNode; + } + + + public ulong ActionID { get; set; } + public ActionStatus Status { get; set; } + + public void OnStart() + { + GameObject obj = null; + if (string.IsNullOrEmpty(deviceName) == false) + { + obj = DeviceController.Instance.GetDeviceObj(deviceName); + } + else + { + obj = Utility.FindObj(path); + } + + if (obj != null) + { + var flash = obj.GetOrAddComponent(); + if (isHigh) + { + var effect = obj.GetOrAddComponent(); + effect.outlineColor = color; + effect.highlighted = true; + Visibility visibility = Visibility.Normal; + Enum.TryParse(this.visibility, out visibility); + effect.outlineVisibility = visibility; + obj.GetOrAddComponent(); + if (string.IsNullOrEmpty(isIndependent) == false) + { + switch (isIndependent) + { + case "true": + effect.outlineIndependent = true; + break; + case "false": + effect.outlineIndependent = false; + break; + } + } + float time = 1; + int count = -1; + float.TryParse(this.time, out time); + int.TryParse(this.count, out count); + flash.Init(time, count, finishedEvent); + } + else + { + var effect = obj.GetComponent(); + if (effect) + { + effect.highlighted = false; + } + if (flash) + { + flash.Stop(); + } + + } + } + } + + public void OnExecute(float dt) + { + this.Finish(); + OnFinished?.Invoke(); + } + + public void OnFinish() + { + } + + public void Reset() + { + Status = ActionStatus.NotStart; + Paused = false; + } + + public bool Paused { get; set; } + + public void Deinit() + { + if (!Deinited) + { + OnFinished = null; + Deinited = true; + mPool.Recycle(this); + } + } + + public bool Deinited { get; set; } + } + + +} \ No newline at end of file diff --git a/Assets/Scripts/Actions/HighLightFlashAction.cs.meta b/Assets/Scripts/Actions/HighLightFlashAction.cs.meta new file mode 100644 index 00000000..7a9e45dc --- /dev/null +++ b/Assets/Scripts/Actions/HighLightFlashAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96e63ca598764cf4abec4ed34f827731 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Actions/LedAction.cs b/Assets/Scripts/Actions/LedAction.cs index 2b4d020a..86e3a110 100644 --- a/Assets/Scripts/Actions/LedAction.cs +++ b/Assets/Scripts/Actions/LedAction.cs @@ -58,7 +58,6 @@ namespace QFramework var mat = obj.GetComponent().material; //"99.99" char item = number[i]; - Debug.LogError(item); if (item == '.') { isPoint = true; @@ -90,6 +89,8 @@ namespace QFramework mat.mainTexture = Resources.Load($"Number/Mask").As(); } } + + this.Finish(); } public void OnExecute(float dt) diff --git a/Assets/Scripts/Actions/UIShowAction.cs b/Assets/Scripts/Actions/UIShowAction.cs index d05108e1..5f7bda9e 100644 --- a/Assets/Scripts/Actions/UIShowAction.cs +++ b/Assets/Scripts/Actions/UIShowAction.cs @@ -47,19 +47,37 @@ public class UIShowAction : IAction public void OnStart() { - if (isShow) + Type type = null; + if (ActionHelper.typeDict.ContainsKey(uiName)) { - UIKit.OpenPanelAsync(ActionHelper.typeDict[uiName], assetBundleName: uiName).ToAction().StartGlobal(() => this.Finish()); + type = ActionHelper.typeDict[uiName]; + } + else if (CustomUIMap.typeDict.ContainsKey(uiName)) + { + type = CustomUIMap.typeDict[uiName]; + } + + if (type == null) + { + Debug.LogError($"{uiName} 类型没有找到"); } else { - if (UIKit.GetPanel(ActionHelper.typeDict[uiName]) != null) + if (isShow) { - UIKit.HidePanel(ActionHelper.typeDict[uiName]); + UIKit.OpenPanelAsync(type, assetBundleName: uiName).ToAction().StartGlobal(() => this.Finish()); } + else + { + if (UIKit.GetPanel(type) != null) + { + UIKit.HidePanel(type); + } - this.Finish(); + this.Finish(); + } } + } public void Reset() diff --git a/Assets/Scripts/Conditions/ObjClickLongCondition.cs b/Assets/Scripts/Conditions/ObjClickLongCondition.cs new file mode 100644 index 00000000..c8a490d9 --- /dev/null +++ b/Assets/Scripts/Conditions/ObjClickLongCondition.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace QFramework +{ + public class ObjClickLongCondition : ICondition + { + + private static SimpleObjectPool mSimpleObjectPool = + new SimpleObjectPool(() => new ObjClickLongCondition(), null, 10); + + private ObjClickLongCondition() { } + public GameObject obj = null; + string path; + string deviceName; + float time; + float curTime; + bool isDown = false; + public static ObjClickLongCondition Allocate(string path, Dictionary datas) + { + var conditionAction = mSimpleObjectPool.Allocate(); + conditionAction.ActionID = ActionKit.ID_GENERATOR++; + conditionAction.Deinited = false; + conditionAction.Reset(); + conditionAction.path = path; + conditionAction.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : null; + if (datas.ContainsKey("time")) + { + float.TryParse(datas["time"], out conditionAction.time); + } + return conditionAction; + } + public bool Check() + { + if (obj == null) + { + if (string.IsNullOrEmpty(deviceName)) + { + obj = Utility.FindObj(path); + } + else + { + obj = DeviceController.Instance.GetDeviceObj(deviceName); + if (obj == null) + { + Debug.LogError($"没有找到 path:{path} deviceName:{deviceName}"); + } + } + } + + // 检测鼠标左键按下 + if (Input.GetMouseButtonDown(0)) + { + OnMouseDown(); + } + + // 检测鼠标左键松开 + if (Input.GetMouseButtonUp(0)) + { + OnMouseUp(); + } + + if (isDown && EventSystem.current.IsPointerOverGameObject() == false) + { + Vector3 mousePos = Input.mousePosition; + Ray ray = Camera.main.ScreenPointToRay(mousePos); + RaycastHit hit; + if (Physics.Raycast(ray, out hit)) + { + if (obj == hit.collider.gameObject) + { + curTime -= Time.deltaTime; + if (curTime <= 0) + { + return true; + } + } + + } + } + + return false; + } + + public void OnMouseDown() + { + curTime = this.time; + isDown = true; + } + + public void OnMouseUp() + { + isDown = false; + } + + + public bool Paused { get; set; } + public bool Deinited { get; set; } + public ulong ActionID { get; set; } + public ActionStatus Status { get; set; } + public void OnStart() + { + } + + public void OnExecute(float dt) + { + if (Check()) + { + this.Finish(); + } + } + + public void OnFinish() + { + } + + public void Deinit() + { + if (!Deinited) + { + Deinited = true; + obj = null; + path = null; + mSimpleObjectPool.Recycle(this); + } + } + + public void Reset() + { + curTime = 0; + Paused = false; + Status = ActionStatus.NotStart; + } + } + + //public static class ObjClickLongConditionExtension + //{ + // public static ISequence ObjClickLongCondition(this ISequence self, string uipath) + // { + // return self.Append(QFramework.ObjClickLongCondition.Allocate(uipath)); + // } + //} +} \ No newline at end of file diff --git a/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta b/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta new file mode 100644 index 00000000..91bfa937 --- /dev/null +++ b/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 297e67e3bc7868a4cae6623426c359b9 +timeCreated: 1647673104 \ No newline at end of file diff --git a/Assets/Scripts/Custom.meta b/Assets/Scripts/Custom.meta new file mode 100644 index 00000000..e4015f1e --- /dev/null +++ b/Assets/Scripts/Custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4af85a692b427464ebde5004dd992d5e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Custom/UIMap.meta b/Assets/Scripts/Custom/UIMap.meta new file mode 100644 index 00000000..b5608759 --- /dev/null +++ b/Assets/Scripts/Custom/UIMap.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb813d5416f284549bb272f36e3423e5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Custom/UIMap/CustomUIMap.cs b/Assets/Scripts/Custom/UIMap/CustomUIMap.cs new file mode 100644 index 00000000..48752043 --- /dev/null +++ b/Assets/Scripts/Custom/UIMap/CustomUIMap.cs @@ -0,0 +1,18 @@ +using QFramework.Example; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class CustomUIMap : MonoBehaviour +{ + + // 注意:此处专门给支线用的 主线的UI类型映射填写到 ActionHelper.cs的typeDict中 + public static readonly Dictionary typeDict = new Dictionary() + { + //{ "UIOperationList", typeof(UIOperationList) }, + + }; + + +} diff --git a/Assets/Scripts/Custom/UIMap/CustomUIMap.cs.meta b/Assets/Scripts/Custom/UIMap/CustomUIMap.cs.meta new file mode 100644 index 00000000..48849b68 --- /dev/null +++ b/Assets/Scripts/Custom/UIMap/CustomUIMap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 399446e5e27181e439731e9cbd025286 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Item/HighLightFlashItem.cs b/Assets/Scripts/Item/HighLightFlashItem.cs new file mode 100644 index 00000000..e0cf67a8 --- /dev/null +++ b/Assets/Scripts/Item/HighLightFlashItem.cs @@ -0,0 +1,41 @@ +using DG.Tweening; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +using HighlightPlus; +using QFramework; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class HighLightFlashItem : MonoBehaviour +{ + + HighlightEffect high; + TweenerCore dotw; + + public void Init(float time, int count = -1, string finishedEvent = null) + { + high = GetComponent(); + high.outline = 0.01f; + dotw = DOTween.To(() => high.outline, (v) => high.outline = v, 1, time).SetEase(Ease.OutFlash).SetLoops(count, LoopType.Yoyo).OnComplete(() => + { + if (string.IsNullOrEmpty(finishedEvent)==false) + { + StringEventSystem.Global.Send(finishedEvent); + } + this.Stop(); + }); + } + + public void Stop() + { + if (dotw != null) + { + dotw.Kill(); + dotw = null; + } + high.highlighted = false; + } + + +} diff --git a/Assets/Scripts/Item/HighLightFlashItem.cs.meta b/Assets/Scripts/Item/HighLightFlashItem.cs.meta new file mode 100644 index 00000000..5eebf192 --- /dev/null +++ b/Assets/Scripts/Item/HighLightFlashItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2f23e7e41ba93044ab80cdc6be2e101 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/UIOperationList.cs b/Assets/Scripts/UI/UIOperationList.cs index 82693fb9..5384d58d 100644 --- a/Assets/Scripts/UI/UIOperationList.cs +++ b/Assets/Scripts/UI/UIOperationList.cs @@ -7,6 +7,7 @@ using TMPro; using System.Collections.Generic; using static OperationController; using System; +using UnityEditor.Hardware; namespace QFramework.Example { public class UIOperationListData : UIPanelData @@ -20,7 +21,7 @@ namespace QFramework.Example protected override void OnInit(IUIData uiData = null) { mData = uiData as UIOperationListData ?? new UIOperationListData(); - TypeEventSystem.Global.Register((arg)=>Hide()).UnRegisterWhenGameObjectDestroyed(gameObject); + TypeEventSystem.Global.Register((arg) => Hide()).UnRegisterWhenGameObjectDestroyed(gameObject); } private void OnStepChanged(StepStatusOnChange change) @@ -88,54 +89,60 @@ namespace QFramework.Example StepContent.RemoveAllChildren(); foreach (var item in op.Steps) { - GameObject obj = GameObject.Instantiate(Step.gameObject, StepContent); - Transform title = obj.transform.Find("Title"); - var name = title.Find("Name").GetComponent(); - name.text = item.Name; - var arrow = title.Find("Arrow").transform; - Image highIcon = title.Find("HighIcon").GetComponent(); - Color highColor = new Color(25f / 255f, 224f / 255f, 224f / 255f); - GameObject subContent = obj.transform.Find("SubContent").gameObject; - Button btn = title.GetComponent