Show和CameraSwitch 两个Action支持以Device为目标

This commit is contained in:
shenjianxing 2024-12-23 11:30:18 +08:00
parent cee4f3b3b6
commit efb2195571
8 changed files with 141 additions and 76 deletions

View File

@ -18,6 +18,12 @@ namespace XMLTool
} }
public class DictionaryAction : Action
{
public Dictionary<string, string> args = new Dictionary<string, string>();
}
} }

View File

@ -128,7 +128,7 @@ public class ActionHelper
case "Show": case "Show":
{ {
var strAction = (XMLTool.StringListAction)act; var strAction = (XMLTool.StringListAction)act;
return ShowAction.Allocate(act.Value, strAction.args[0]); return ShowAction.Allocate(act.Value, strAction.args[0], strAction.args[1]);
} }
case "TextTip": case "TextTip":
{ {
@ -144,8 +144,8 @@ public class ActionHelper
return SetScoreAction.Allocate(act.Name, act.Value); return SetScoreAction.Allocate(act.Name, act.Value);
case "CameraSwitch": case "CameraSwitch":
{ {
var strAction = (XMLTool.StringListAction)act; var dictAction = (XMLTool.DictionaryAction)act;
return CameraSwitchAction.Allocate(strAction.args[0], strAction.args[1], strAction.args[2], strAction.args[3], strAction.args[4], strAction.args[5], strAction.args[6]); return CameraSwitchAction.Allocate(dictAction.args);
} }
case "CameraLock": case "CameraLock":
{ {

View File

@ -1,5 +1,6 @@
using QFramework.Example; using QFramework.Example;
using System; using System;
using System.Collections.Generic;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
@ -17,27 +18,16 @@ namespace QFramework
private static readonly SimpleObjectPool<CameraSwitchAction> mPool = private static readonly SimpleObjectPool<CameraSwitchAction> mPool =
new SimpleObjectPool<CameraSwitchAction>(() => new CameraSwitchAction(), null, 10); new SimpleObjectPool<CameraSwitchAction>(() => new CameraSwitchAction(), null, 10);
string nearPos;
string nearRot; Dictionary<string, string> datas;
string normalPos; public static CameraSwitchAction Allocate(Dictionary<string, string> dict, System.Action OnFinished = null)
string normalRot;
string isNear;
string nearTime;
string farTime;
public static CameraSwitchAction Allocate(string nearPos, string nearRot, string nearTime, string normalPos, string normalRot, string farTime, string isNear, System.Action OnFinished = null)
{ {
var retNode = mPool.Allocate(); var retNode = mPool.Allocate();
retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.ActionID = ActionKit.ID_GENERATOR++;
retNode.Deinited = false; retNode.Deinited = false;
retNode.Reset(); retNode.Reset();
retNode.OnFinished = OnFinished; retNode.OnFinished = OnFinished;
retNode.nearPos = nearPos; retNode.datas = dict;
retNode.nearRot = nearRot;
retNode.nearTime = nearTime;
retNode.normalPos = normalPos;
retNode.normalRot = normalRot;
retNode.farTime = farTime;
retNode.isNear = isNear;
return retNode; return retNode;
} }
@ -48,11 +38,37 @@ namespace QFramework
public void OnStart() public void OnStart()
{ {
UICameraSwitchData data = new UICameraSwitchData(); UICameraSwitchData data = new UICameraSwitchData();
data.nearPos = Utility.GetVector3FromStrArray(nearPos);
data.nearRot = Utility.GetVector3FromStrArray(nearRot); if (datas.ContainsKey("nearDevice"))
data.normalPos = Utility.GetVector3FromStrArray(normalPos); {
data.normalRot = Utility.GetVector3FromStrArray(normalRot); GameObject obj = DeviceController.Instance.GetDeviceObj(datas["nearDevice"]);
bool.TryParse(isNear, out data.isNear); data.nearPos = obj.Position();
data.nearRot = obj.EulerAngles();
}
else
{
data.nearPos = Utility.GetVector3FromStrArray(datas["nearPos"]);
data.nearRot = Utility.GetVector3FromStrArray(datas["nearRot"]);
}
if (datas.ContainsKey("normalDevice"))
{
GameObject obj = DeviceController.Instance.GetDeviceObj(datas["normalDevice"]);
data.normalPos = obj.Position();
data.normalRot = obj.EulerAngles();
}
else
{
data.normalPos = Utility.GetVector3FromStrArray(datas["normalPos"]);
data.normalRot = Utility.GetVector3FromStrArray(datas["normalRot"]);
}
bool.TryParse(datas["isNear"], out data.isNear);
float.TryParse(datas["nearTime"], out data.nearTime);
float.TryParse(datas["normalTime"], out data.normalTime);
UIKit.OpenPanelAsync<UICameraSwitch>(uiData: data, canvasLevel: UILevel.RightBottom).ToAction().StartGlobal(() => this.Finish()); UIKit.OpenPanelAsync<UICameraSwitch>(uiData: data, canvasLevel: UILevel.RightBottom).ToAction().StartGlobal(() => this.Finish());
} }

View File

@ -18,7 +18,8 @@ public class ShowAction : IAction
new SimpleObjectPool<ShowAction>(() => new ShowAction(), null, 10); new SimpleObjectPool<ShowAction>(() => new ShowAction(), null, 10);
string path; string path;
bool isShow = true; bool isShow = true;
public static ShowAction Allocate(string path, string isShow, System.Action onDelayFinish = null) bool isDevice = false;
public static ShowAction Allocate(string path, string isShow, string isDevice, System.Action onDelayFinish = null)
{ {
var retNode = mPool.Allocate(); var retNode = mPool.Allocate();
retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.ActionID = ActionKit.ID_GENERATOR++;
@ -26,6 +27,7 @@ public class ShowAction : IAction
retNode.Reset(); retNode.Reset();
retNode.path = path; retNode.path = path;
bool.TryParse(isShow, out retNode.isShow); bool.TryParse(isShow, out retNode.isShow);
bool.TryParse(isDevice, out retNode.isDevice);
return retNode; return retNode;
} }
@ -50,8 +52,16 @@ public class ShowAction : IAction
public void OnStart() public void OnStart()
{ {
GameObject obj = null;
if (isDevice)
{
obj = DeviceController.Instance.GetDeviceObj(path);
}
else
{
GameObject obj = Utility.FindObj(path); obj = Utility.FindObj(path);
}
if (obj == null) if (obj == null)
{ {
Debug.LogError("没有找到物体 :" + path); Debug.LogError("没有找到物体 :" + path);

View File

@ -2,16 +2,20 @@ using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
using QFramework; using QFramework;
using DG.Tweening; using DG.Tweening;
using System.Collections.Generic;
namespace QFramework.Example namespace QFramework.Example
{ {
public class UICameraSwitchData : UIPanelData public class UICameraSwitchData : UIPanelData
{ {
public string nearDevice;
public string normalDevice;
public Vector3 nearPos; public Vector3 nearPos;
public Vector3 nearRot; public Vector3 nearRot;
public Vector3 normalPos; public Vector3 normalPos;
public Vector3 normalRot; public Vector3 normalRot;
public float nearTime;
public float normalTime;
public bool isNear = false; public bool isNear = false;
} }
@ -25,8 +29,7 @@ namespace QFramework.Example
{ {
if (isOn) if (isOn)
{ {
Camera.main.transform.DOMove(mData.nearPos, 0); SetNear();
Camera.main.transform.DORotate(mData.nearRot, 0);
} }
Near.transform.Find("Bg/Line").gameObject.SetActive(isOn); Near.transform.Find("Bg/Line").gameObject.SetActive(isOn);
}); });
@ -34,16 +37,31 @@ namespace QFramework.Example
{ {
if (isOn) if (isOn)
{ {
Camera.main.transform.DOMove(mData.normalPos, 0); SetNormal();
Camera.main.transform.DORotate(mData.normalRot, 0);
} }
Far.transform.Find("Bg/Line").gameObject.SetActive(isOn); Far.transform.Find("Bg/Line").gameObject.SetActive(isOn);
}); });
} }
public void SetNear()
{
Camera.main.transform.DOMove(mData.nearPos, mData.nearTime);
Camera.main.transform.DORotate(mData.nearRot, mData.nearTime);
}
public void SetNormal()
{
Camera.main.transform.DOMove(mData.normalPos, mData.normalTime);
Camera.main.transform.DORotate(mData.normalRot, mData.normalTime);
}
protected override void OnOpen(IUIData uiData = null) protected override void OnOpen(IUIData uiData = null)
{ {
mData = uiData as UICameraSwitchData ?? new UICameraSwitchData(); mData = uiData as UICameraSwitchData ?? new UICameraSwitchData();
if (mData.isNear) if (mData.isNear)
{ {
if (Near.isOn == false) if (Near.isOn == false)
@ -52,8 +70,7 @@ namespace QFramework.Example
} }
else else
{ {
Camera.main.transform.DOMove(mData.nearPos, 0); SetNear();
Camera.main.transform.DORotate(mData.nearRot, 0);
} }
} }
else else
@ -64,8 +81,7 @@ namespace QFramework.Example
} }
else else
{ {
Camera.main.transform.DOMove(mData.normalPos, 0); SetNormal();
Camera.main.transform.DORotate(mData.normalRot, 0);
} }
} }
} }

View File

@ -534,74 +534,87 @@ namespace XMLTool
{ {
act.args.Add("true"); act.args.Add("true");
} }
XAttribute isDevice = action.Attribute("isDevice");
if (isDevice != null)
{
act.args.Add(isDevice.Value);
}
else
{
act.args.Add("false");
}
newAction = act; newAction = act;
} }
break; break;
case "CameraSwitch": case "CameraSwitch":
{ {
var act = new StringListAction(); var act = new DictionaryAction();
XAttribute isShow = action.Attribute("nearPos"); XAttribute nearDevice = action.Attribute("nearDevice");
if (isShow != null) if (nearDevice != null)
{ {
act.args.Add(isShow.Value); act.args.Add("nearDevice", nearDevice.Value);
} }
else else
{ {
act.args.Add("0,0,0"); XAttribute nearPos = action.Attribute("nearPos");
if (nearPos != null)
{
act.args.Add("nearPos", nearPos.Value);
}
XAttribute nearRot = action.Attribute("nearRot");
if (nearRot != null)
{
act.args.Add("nearRot", nearRot.Value);
}
} }
XAttribute nearRot = action.Attribute("nearRot");
if (nearRot != null) XAttribute normalDevice = action.Attribute("normalDevice");
if (normalDevice != null)
{ {
act.args.Add(nearRot.Value); act.args.Add("normalDevice", normalDevice.Value);
} }
else else
{ {
act.args.Add("0,0,0"); XAttribute normalPos = action.Attribute("normalPos");
if (normalPos != null)
{
act.args.Add("normalPos", normalPos.Value);
}
XAttribute normalRot = action.Attribute("normalRot");
if (normalRot != null)
{
act.args.Add("normalRot", normalRot.Value);
}
} }
XAttribute nearTime = action.Attribute("nearTime"); XAttribute nearTime = action.Attribute("nearTime");
if (nearTime != null) if (nearTime != null)
{ {
act.args.Add(nearTime.Value); act.args.Add("nearTime", nearTime.Value);
} }
else else
{ {
act.args.Add("0"); act.args.Add("nearTime","0");
} }
XAttribute normalPos = action.Attribute("normalPos");
if (normalPos != null) XAttribute normalTime = action.Attribute("farTinormalTimeme");
if (normalTime != null)
{ {
act.args.Add(normalPos.Value); act.args.Add("normalTime", normalTime.Value);
} }
else else
{ {
act.args.Add("0,0,0"); act.args.Add("normalTime","0");
}
XAttribute normalRot = action.Attribute("normalRot");
if (normalRot != null)
{
act.args.Add(normalRot.Value);
}
else
{
act.args.Add("0,0,0");
}
XAttribute farTime = action.Attribute("farTime");
if (farTime != null)
{
act.args.Add(farTime.Value);
}
else
{
act.args.Add("0");
} }
XAttribute isNear = action.Attribute("isNear"); XAttribute isNear = action.Attribute("isNear");
if (isNear != null) if (isNear != null)
{ {
act.args.Add(isNear.Value); act.args.Add("isNear", isNear.Value);
} }
else else
{ {
act.args.Add("false"); act.args.Add("isNear", "false");
} }
newAction = act; newAction = act;
} }

View File

@ -639,6 +639,10 @@
</Reset> </Reset>
<Start> <Start>
<Action type="Sequence"> <Action type="Sequence">
<!--<Action type="CameraSwitch" nearDevice="肠钳" normalDevice="组织钳" isNear="false"></Action>-->
<Action type="CameraSwitch" nearPos="-3.543,3.007,-1.463" nearRot="27.9597,270,2.899792E-06" normalPos="-3.206,3.24,-1.425" normalRot="27.9597,270,2.899792E-06" isNear="false"></Action>
<Condition type="StrEvent" value="close"></Condition>
<!--string audioType, string loop, string waitFinished, string volume, string isPlay,--> <!--string audioType, string loop, string waitFinished, string volume, string isPlay,-->
<Action type="Audio" audioType="Voice" value="q001.mp3" loop="false" waitFinished="true" volumen="1" isPlay="true"></Action> <Action type="Audio" audioType="Voice" value="q001.mp3" loop="false" waitFinished="true" volumen="1" isPlay="true"></Action>
<Action type="Log" value="0000"></Action> <Action type="Log" value="0000"></Action>
@ -758,7 +762,7 @@
</Reset> </Reset>
<Start> <Start>
<Action type="Sequence"> <Action type="Sequence">
<Action type="LockCamera" value="true" /> <Action type="CameraLock" value="true" />
<Action type="TextTip" value="这里是文字描述\n11111\n22222\n333333" audio="q001.mp3" btns="确定,取消"/> <Action type="TextTip" value="这里是文字描述\n11111\n22222\n333333" audio="q001.mp3" btns="确定,取消"/>
<Action type="Move" value="FlyCamera" to="-3.206,3.24,-1.425" time="0"></Action> <Action type="Move" value="FlyCamera" to="-3.206,3.24,-1.425" time="0"></Action>
<Action type="Rotate" value="FlyCamera" to="27.9597,270,2.899792E-06" time="0"></Action> <Action type="Rotate" value="FlyCamera" to="27.9597,270,2.899792E-06" time="0"></Action>

View File

@ -39,18 +39,18 @@
<Action type="Var" name="变量名" value="1"></Action> <Action type="Var" name="变量名" value="1"></Action>
<!--设置分数 与Score配合使用 步骤名字一定要是step+name--> <!--设置分数 与Score配合使用 步骤名字一定要是step+name-->
<Action type="SetScore" name="步骤名字" value="1"></Action> <Action type="SetScore" name="步骤名字" value="1"></Action>
<!--镜头切换 近距离和默认--> <!--镜头切换 近距离和默认 如果有了nearDevice就可以不用nearPos和nearRot了 按照device的坐标和旋转来处理镜头 normalDevice同理-->
<Action type="CameraSwitch" nearPos="-3.942,3.24,-4.319" nearRot="16.42331,180,0" nearTime="1" normalPos="-3.942,3.24,-3.946" normalRot="16.42331,180,-5.305351E-14" farTime="1" isNear="false"></Action> <Action type="CameraSwitch" nearDevice="肠钳" normalDevice="组织钳" nearPos="-3.942,3.24,-4.319" nearRot="16.42331,180,0" nearTime="1" normalPos="-3.942,3.24,-3.946" normalRot="16.42331,180,-5.305351E-14" normalTime="1" isNear="false"></Action>
<!--文字弹窗 按钮可以多个 点击事件使用UIClick--> <!--文字弹窗 按钮可以多个 点击事件使用UIClick-->
<Action type="TextTip" value="这里是文字描述" audio="q001.mp3" btns="确定,取消"/> <Action type="TextTip" value="这里是文字描述" audio="q001.mp3" btns="确定,取消"/>
<!--锁定镜头 value为是否锁定--> <!--锁定镜头 value为是否锁定-->
<Action type="LockCamera" value="true"></Action> <Action type="CameraLock" value="true"></Action>
<!--播放视频 size为视频窗口大小 offset为窗口中心点偏移 播放完成事件和关闭事件 通常使用关闭事件即可 <!--播放视频 size为视频窗口大小 offset为窗口中心点偏移 播放完成事件和关闭事件 通常使用关闭事件即可
宽度不要小于500 否则进度条看不太清楚--> 宽度不要小于500 否则进度条看不太清楚-->
<Action type="Video" value="test.mp4" size="500,500" offset="10,10" finishedEvent="finished" closeEvent="close"></Action> <Action type="Video" value="test.mp4" size="500,500" offset="10,10" finishedEvent="finished" closeEvent="close"></Action>
<!--物体显隐 用于3D物体 isShow=true为显示 false为隐藏 UI的显隐使用UIShow--> <!--物体显隐 用于3D物体 isShow=true为显示 false为隐藏 UI的显隐使用UIShow isDevice为true的话 value就要写device配置的Name-->
<Action type="Show" value="SM_QvanChangJing/sence/pPlane1" isShow="false"></Action> <Action type="Show" value="SM_QvanChangJing/sence/pPlane1" isShow="false" isDevice="false"></Action>
<!--设置物体高亮 value是物体路径 color是rgba isHigh设置是否显示高亮--> <!--设置物体高亮 value是物体路径 color是rgba isHigh设置是否显示高亮-->
<Action type="HighLight" value="路径" isHigh="true" color="0,255,0,255"></Action> <Action type="HighLight" value="路径" isHigh="true" color="0,255,0,255"></Action>
<!--延迟 value是秒--> <!--延迟 value是秒-->