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