diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index 6770f9d6..166975b3 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -231,6 +231,11 @@ public class ActionHelper var dictAction = (XMLTool.DictionaryAction)act; return TimeLineAction.Allocate(act.Value, dictAction.args); } + case "Mat": + { + var dictAction = (XMLTool.DictionaryAction)act; + return MatAction.Allocate(dictAction.args); + } default: Debug.LogError($"没有找到此Action的类型{act.Type}"); break; diff --git a/Assets/Scripts/Actions/HighLightAction.cs b/Assets/Scripts/Actions/HighLightAction.cs index ce7e9687..7efe534f 100644 --- a/Assets/Scripts/Actions/HighLightAction.cs +++ b/Assets/Scripts/Actions/HighLightAction.cs @@ -24,6 +24,7 @@ namespace QFramework Color color = Color.green; bool isHigh = true; string deviceName = string.Empty; + string isIndependent; public static HighLightAction Allocate(string path, Dictionary datas, System.Action OnFinished = null) { var retNode = mPool.Allocate(); @@ -43,6 +44,7 @@ namespace QFramework 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.OnFinished = OnFinished; return retNode; } @@ -70,6 +72,18 @@ namespace QFramework var effect = obj.GetOrAddComponent(); effect.outlineColor = color; effect.highlighted = true; + if (string.IsNullOrEmpty(isIndependent) == false) + { + switch (isIndependent) + { + case "true": + effect.outlineIndependent = true; + break; + case "false": + effect.outlineIndependent = false; + break; + } + } } else { @@ -78,8 +92,8 @@ namespace QFramework { effect.highlighted = false; } - } + } } } diff --git a/Assets/Scripts/Actions/MatAction.cs b/Assets/Scripts/Actions/MatAction.cs new file mode 100644 index 00000000..14af6ca1 --- /dev/null +++ b/Assets/Scripts/Actions/MatAction.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace QFramework +{ + internal class MatAction : IAction + { + + public System.Action OnFinished { get; set; } + + + private MatAction() + { + } + + private static readonly SimpleObjectPool mPool = + new SimpleObjectPool(() => new MatAction(), null, 10); + + + + + string value; + string deviceName; + string matName; + string index; + public static MatAction Allocate(Dictionary datas, System.Action OnFinished = null) + { + var retNode = mPool.Allocate(); + retNode.ActionID = ActionKit.ID_GENERATOR++; + retNode.Deinited = false; + retNode.Reset(); + retNode.value = datas.ContainsKey("value") ? datas["value"] : ""; + retNode.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : ""; + retNode.matName = datas.ContainsKey("matName") ? datas["matName"] : ""; + retNode.index = datas.ContainsKey("index") ? datas["index"] : "0"; + retNode.OnFinished = OnFinished; + return retNode; + } + + + public ulong ActionID { get; set; } + public ActionStatus Status { get; set; } + + public void OnStart() + { + GameObject obj; + if (string.IsNullOrEmpty(deviceName)) + { + obj = Utility.FindObj(value); + } + else + { + obj = DeviceController.Instance.GetDeviceObj(deviceName); + } + var mesh = obj.GetComponent(); + int matIndex = 0; + int.TryParse(index, out matIndex); + mesh.materials[matIndex] = Resources.Load("Mat/" + matName); + this.Finish(); + } + + public void OnExecute(float dt) + { + } + + 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/MatAction.cs.meta b/Assets/Scripts/Actions/MatAction.cs.meta new file mode 100644 index 00000000..40e8f4bd --- /dev/null +++ b/Assets/Scripts/Actions/MatAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05ceca20dad98ea4092091f19ff388a3 +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 bb468c8a..46be7080 100644 --- a/Assets/Scripts/Xml/XmlParser.cs +++ b/Assets/Scripts/Xml/XmlParser.cs @@ -772,7 +772,14 @@ namespace XMLTool act.args.Add("deviceName", deviceName.Value); } newAction = act; + XAttribute isIndependent = action.Attribute("isIndependent"); + if (isIndependent != null) + { + act.args.Add("isIndependent", isIndependent.Value); + } + newAction = act; } + break; case "LoadRes": { @@ -1087,6 +1094,32 @@ namespace XMLTool newAction = act; } break; + case "Mat": + { + var act = new DictionaryAction(); + XAttribute value = action.Attribute("value"); + if (value != null) + { + act.args.Add("value", value.Value); + } + XAttribute deviceName = action.Attribute("deviceName"); + if (deviceName != null) + { + act.args.Add("deviceName", deviceName.Value); + } + XAttribute matName = action.Attribute("matName"); + if (matName != null) + { + act.args.Add("matName", matName.Value); + } + XAttribute index = action.Attribute("index"); + if (index != null) + { + act.args.Add("index", index.Value); + } + newAction = act; + } + break; default: newAction = new Action(); break;