附录
# 附录
主要介绍3D平台二开时常用的接口、API、类以及常量等内容。
# Interface
主要包括设备接口、设备图标接口、UI控件接口以及UI弹窗/面板接口。
设备接口
设备接口:IDevice
属性
IsCameraMoved:bool类型,表示摄像机是否移动。
DeviceLogic:DeviceLogic类型,表示绑定的设备。
YcItemDatas:List<YcItemData>类型,表示设备的遥测点列表。
YxItemDatas:List<YxItemData>类型,表示设备的遥信点列表。
提示
YcItemData和YxItemData可以参考本节关于常用类介绍部分的内容
方法
CameraMoved:摄像机移动到设备最佳视角时。
CameraLeaved:摄像机离开设备时。
Show:显示设备时。
Hide:隐藏设备时。
Init:初始化设备时。
OnClick:点击设备时。
OnLocal:定位设备时。
SetAlarm:设置告警时。
Review:还原视角时。
Select:选中时。
UnSelect:取消选中时。
AnimationPlay:动画播放时。
设备图标接口
设备图标接口:IDeviceIcon
方法:
OnInit:初始化时。
OnIconClick:图标点击时。
SetState:状态刷新时。
MouseEnter:鼠标进入时。
MouseExit:鼠标离开时。
OnSelect:选中时。
UnSelect:取消选中时。
SetAlarm:设置告警时。
Show:显示时。
Hide:隐藏时。
UI控件接口
UI控件接口:IUIControl
方法:
OnInit:初始化。
OnOpen:UI显示。
OnClose:UI隐藏。
UI弹窗/面板接口
UI控件接口:IUIForm
属性
SerialId:int类型,表示获取界面序列编号。
UIFormAssetName:string类型,表示获取界面资源名称。
Handle:object类型,表示获取界面实例。
UIGroup:IUIGroup类型。表示获取界面所属的界面组。
DepthInUIGroup:int类型,表示获取界面在界面组中的深度。
PauseCoveredUIForm:bool类型,表示获取是否暂停被覆盖的界面。
方法:
OnInit:初始化。
OnRecycle:恢复界面时。
OnOpen:打开界面时。
OnClose:关闭界面时。
OnPause:暂停界面时。
OnResume:恢复界面时。
OnCover:覆盖界面时。
OnReveal:显示界面时。
OnRefocus:聚焦界面时。
OnUpdate:更新界面时。
OnDepthChanged:层级发生变化时。
# API
IoTCenter3D提供的可调用接口。包括DeviceModule、RPCModule、SceneModule以及UIModule。
使用以上接口时需添加IoT3D.Framework
引用
using IoT3D.Framework
DeviceModule
属性
/// <summary> /// 选中的设备 /// </summary> DeviceLogic SelectionDevice { get; set; } /// <summary> /// 当前的设备 /// </summary> DeviceLogic CurrentDevice { get; set; } /// <summary> /// 设备选中变化事件 /// </summary> event Action<DeviceLogic> DeviceSelectChanged;
方法
/// <summary> /// 获取所有已部署的设备 /// </summary> /// <returns></returns> List<DeviceLogic> GetAllDevice(); /// <summary> /// 通过设备号获取一个设备 /// </summary> /// <param name="equipNo"></param> /// <returns></returns> DeviceLogic GetDeviceByEquipNo(int equipNo); /// <summary> /// 获取设备模板数据 /// </summary> /// <param name="resId"></param> /// <returns></returns> DeviceDataModel GetDeviceResData(string resId); /// <summary> /// 实例化设备图标 /// </summary> /// <param name="deviceIcon">自定义图标</param> /// <returns></returns> GameObject InstantiateIcon(IDeviceIcon deviceIcon); /// <summary> /// 实例化默认设备图标 /// </summary> /// <returns></returns> GameObject InstantiateIcon(); /// <summary> /// 注册一个设备 /// </summary> /// <param name="device"></param> void RegisterDevice(DeviceLogic device); /// <summary> /// 取消注册一个设备 /// </summary> /// <param name="device"></param> void UnRegisterDevice(DeviceLogic device); /// <summary> /// 选中一个设备 /// </summary> /// <param name="device">设备</param> void OnSelectionDevice(DeviceLogic device); /// <summary> /// 取消选中一个设备 /// </summary> /// <param name="device">设备</param> void UnSelectDevice(DeviceLogic device);
RPCModule
GetYcValueData
/// <summary> /// 获取遥测数据 /// </summary> /// <param name="equipNo">设备号</param> /// <param name="ycNo">遥测号</param> /// <returns>string</returns> Task<string> GetYcValueData(int equipNo, int ycNo);
示例
//获取1000号设备的1号测点数据 _ = await RPCModule.Rpc.GetYcValueData(1000, 1);
GetYxValueData
/// <summary> /// 获取遥信数据 /// </summary> /// <param name="equipNo">设备号</param> /// <param name="ycNo">遥信号</param> /// <returns>string</returns> Task<string> GetYxValueData(int equipNo, int ycNo);
示例
//获取1000号设备的1号遥信数据 _ = await RPCModule.Rpc.GetYxValueData(1000, 1);
GetYcpListItemAsync
/// <summary> /// 获取设备所有遥测列表 /// </summary> /// <param name="equipNo">设备号</param> /// <returns>List<YcItemData></returns> Task<List<YcItemData>> GetYcpListItemAsync(int equipNo);
示例
//获取1000号设备 _ = await RPCModule.Rpc.GetYcpListItemAsync(1000);
GetYxpListItemAsync
/// <summary> /// 获取设备所有遥信列表 /// </summary> /// <param name="equipNo">设备号</param> /// <returns>List<YxItemData></returns> Task<List<YxItemData>> GetYxpListItemAsync(int equipNo);
示例
//获取1000号设备 _ = await RPCModule.Rpc.GetYcpListItemAsync(1000);
GetAsyncSQLData
/// <summary> /// 获取数据库表数据 /// </summary> /// <typeparam name="T">Json 序列化类</typeparam> /// <param name="sql">查询Sql语句</param> /// <returns></returns> Task<T> GetAsyncSQLData<T>(string sql);
示例
List<Model> Models = await RPCModule.Rpc.GetAsyncSQLData<List<Model>>("select ID,Name from GW_Models"); public class Model { public string ID; public string Name; }
SetParam
/// <summary> /// 执行设备控制命令 /// </summary> /// <param name="s_no">设备号</param> /// <param name="n_no">控制命令号</param> void SetParam(int s_no, int n_no); /// <summary> /// 执行设备控制命令 /// </summary> /// <param name="s_no">设备号</param> /// <param name="n_no">控制命令号</param> /// <param name="s_value">参数</param> void SetParam(int s_no, int n_no, string s_value);
示例
RPCModule.Rpc.SetParam(1000,1,"value");
GetDataFromCurveAsync
/// <summary> /// 获取测点历史数据 /// </summary> /// <param name="dateTimes">时间数组</param> /// <param name="eqNo">设备号</param> /// <param name="ycNo">遥测号</param> /// <param name="type">测点类型</param> /// <returns></returns> Task<List<myCurveData>> GetDataFromCurveAsync(List<DateTime> dateTimes, int eqNo, int ycNo, string type = "C");
GetChangedDataFromCurveAsync
/// <summary> /// 获取已变化的测点历史数据 /// </summary> /// <param name="bgn">开始时间</param> /// <param name="end">结束时间</param> /// <param name="eqNo">设备号</param> /// <param name="ycNo">遥测号</param> /// <param name="type">测点类型</param> /// <returns></returns> Task<List<myCurveData>> GetChangedDataFromCurveAsync(DateTime bgn, DateTime end, int eqNo, int ycNo, string type = "C");
SceneModule
CurrentSceneNode属性。
/// <summary> /// 当前场景 /// </summary> public static SceneNode CurrentSceneNode { get; }
示例
//打印当前场景名称 Debug.log(SceneModule.CurrentSceneNode.name);
LoadScene方法
/// <summary> /// 加载场景 /// </summary> /// <param name="sceneName">场景名称</param> public static void LoadScene(string sceneName);
示例
//加载首页场景 SceneModule.LoadScene("首页");
GetSceneNode方法
/// <summary> /// 获取指定场景 /// </summary> /// <param name="sceneName">场景名称</param> /// <returns></returns> public static SceneNode GetSceneNode(string sceneName);
示例
//获取首页所有设备 var devs = SceneModule.GetSceneNode("首页").DeviceRoot.GetDevices<DeviceLogic>();
SetCameraActive方法
/// <summary> /// 控制摄像机是否可以交互 /// 如 鼠标控制缩放、旋转、平移等 /// </summary> /// <param name="active"></param> public static void SetCameraActive(bool active);
示例
//取消交互画面会固定住 SceneModule.SetCameraActive(false);
SetCameraPoint方法
/// <summary> /// 设置摄像头位置 /// </summary> /// <param name="pos">坐标</param> /// <param name="rot">旋转角度</param> /// <param name="centerpoint">中心点位置</param> /// <param name="speed">速度</param> public static void SetCameraPoint(Vector3 pos, Vector3 rot, Vector3 centerpoint, float speed = 0)
AddSceneChangedListener
/// <summary> /// 切换场景时回调 /// </summary> /// <param name="unityAction">回调方法</param> public static void AddSceneChangedListener(UnityAction<SceneNode> unityAction);
示例
SceneModule.AddSceneChangedListener(OnSceneEnterChanged); void OnSceneEnterChanged(SceneNode sceneNode) { Debug.log(sceneNode.name); }
UIModule
OpenUIForm。该接口可以打开所有构建在
uiforms.assetbundle
里的UI资源。/// <summary> /// 打开指定UI面板 /// </summary> /// <param name="uiFormAssetName">UI名称</param> /// <param name="groupName">UI层级</param> /// <returns>IUIForm</returns> public static IUIForm OpenUIForm(string uiFormAssetName, string groupName) /// <summary> /// 打开指定UI面板 /// </summary> /// <param name="uiFormAssetName">UI名称</param> /// <param name="groupName">UI层级</param> /// <param name="userData">UI面板接收的数据</param> /// <returns>IUIForm</returns> public static IUIForm OpenUIForm(string uiFormAssetName, string groupName, object userData)
示例
//打开TimeselectorForm界面,层级为Dialog,传输数据为当前脚本对象 IUIForm uIForm = UIModule.OpenUIForm("TimeselectorForm", "Dialog", this);
CloseUIForm。
/// <summary> /// 关闭指定页面 /// </summary> /// <param name="uIForm">要关闭的UI</param> public static void CloseUIForm(IUIForm uIForm)
示例
IUIForm uIForm = UIModule.OpenUIForm("TimeselectorForm", "Dialog", this); if (uIForm != null) UIModule.CloseUIForm(uIForm);
# Class
在编写脚本时可能需要使用的一些最常用和最重要的IoTCenter3D内置类。包括DeviceLogic、DeviceBase、DeviceDataModel、DeviceIconBase、DeviceUIFormBase、RealTimeValue、SceneNode、UIControl、UIFormLogic、YcItemData以及YxItemData。
DeviceLogic
设备基类,所有设备必须显式派生DeviceLogic类。该类继承自MonoBehaviour (opens new window)类。
变量
IsWar:bool类型,表示是否是报警状态。
IsShow:bool类型,你表示是否是显示状态。
deviceData:DeviceDataModel类型,表示设备可保存数据,用于下次打开后初始化。
ExceedDistance:float类型,表示摄像机和设备的安全距离,当摄像机远离设备时,如果超过设置的距离,会调用CameraLeaved()。
m_Animation:Animation类型。
Locking:bool类型。
IsContainer:bool类型。
m_Icon:Sprite类型,表示设备图标。
Device:IDevice类型,表示IoT设备对象。
DeviceResData:DeviceDataModel类型,表示获取用户配置的数据。
方法
Awake:在加载脚本实例时调用,查看详情 (opens new window) 。
Start:查看详情 (opens new window)。
Init:初始化设备。
Show:显示设备。
OnClick:点击设备图标时执行。
Hide:隐藏设备。
OnLocal:定位设备时调用。
CameraMoved:摄像机移动到设备位置时调用。
CameraLeaved:摄像机离开设备时调用。
AnimationPlay
SetAlarm:设备图标报警状态。
OnInitialized
DeviceBase
设备自定义基类,设备的基本功能实现,所有自定义设备都可以派生自该类,二次开发也可以重写实现逻辑。继承自DeviceLogic类。
变量
DeviceFormId:DeviceFormId类型,表示UI弹窗面板枚举,点击设备时所弹出的UI弹窗。
m_DeviceForm:IUIForm类型,表示点击设备时所弹出的UI弹窗对象。
m_DeviceAlarmForm:DeviceAlarmUIForm类型。
UseDefaultIocn:bool类型。
DeviceIconTemplate:DeviceIconBase类型,表示设备图标模板。
ClassifyShow:bool类型。
DeviceAlarmForm IUIForm类型。
方法
Init:初始化设备
Start:查看详情 (opens new window)
OnClick:点击设备时调用。
Show:显示设备。
Hide:隐藏设备。
CameraMoved:摄像机移动到设备位置时调用。
CameraLeaved:摄像机离开设备时调用。
OnLocal:定位设备时调用。
Update:每帧调用Update,查看详情 (opens new window)。
ShowDeviceIcon:显示设备图标。
HideDeviceIcon:隐藏设备图标。
SetAlarm:设备图标报警状态。
DeviceDataModel
设备可保存的数据,该类用于持久化数据,用户所编辑的数据都会被保存为JSON (opens new window)格式的文件,编辑数据文件存放在\IoTCenter 3D\IoTCenter 3D_Data\StreamingAssets\Data
目录下。
变量
EquipNo:int类型,表示对应IoT平台中的设备号。
YcyxNo:int类型,表示对应IoT平台中的设备的遥测遥信号。
DataType:EquipDataType(Equip|YC|YX)类型,表示当前设备所绑定测点的类型。
Name:string类型,表示设备名称。
ShowName:string类型,你表示鼠标移动到图标上的名称。
m_Desc:string类型,表示设备介绍。
ResId:string类型,表示设备对应的资源Id。
BestViewPos:Vector3 (opens new window)类型,表示设备的位置。
BestViewRot:Vector3 (opens new window)类型,表示设备的旋转。
ValueCMD:string类型,表示设备的设置命令。
SetParams:List<SetParamData>类型。表示绑定设备设置点集合。
EquipData:EquipRelateData类型。
AutoLocal:bool类型。
RelatedVideo:string类型。
方法
- SetResId:设置设备对应的资源Id。
DeviceIconBase
设备图标基类,继承MonoBehaviour (opens new window)类,并实现了IDeviceIcon接口。
变量
Icon:Image类型,表示设备图标文件。
Device:DeviceLogic类型,表示设备。
方法
OnInit:初始化图标。
OnIconClick:点击设备图标时调用。
Show:显示图标。
Hide:隐藏图标。
MouseEnter:鼠标进入图标时。
MouseExit:鼠标离开图标时。
OnSelect:图标选中时。
UnSelect:取消选中时。
SetState:刷新状态时。
DeviceUIFormBase
UI弹窗基类,继承UIFormLogic
类。
RealTimeValue
根据IoTCenter平台上设置的类型,返回不同的数据格式,拥有以下属性:
StringValue:string类型,表示字符串类型数据
DoubleValue:double类型,表示浮点数类型数据,
Temp:int类型,表示整数类型数据。
BoolValue:bool类型,表示布尔类型数据。
SceneNode
场景对象,拥有以下属性:
UiPageRoot:DeviceNodeBase类型,表示UI节点根目录。
DeviceRoot:DeviceNodeBase类型,表示Device节点根目录。
Loaded:bool类型,表示完成加载。
SceneName:string类型,表示场景名称。
SceneId:string类型,表示场景ID。
ShowNavButton:bool类型,表示是否显示导航按钮。
SceneNode
UI控件基类,所有UI控件必须显式派生自UIControl类。
变量
uIResEnum:UIResEnum枚举类型,表示UI面板分类。
rectTransform:RectTransform类型,查看详情 (opens new window)。
RectCanvas:Canvas类型,表示包含当前UI的Canvas。
IsOpen:bool类型,表示是否是显示状态。
Name:string类型,表示UI面板的名称。
ResId:string类型,表示UI控件的资源Id。
方法
OnSerialized:数据序列化完成。
SetAllDirty
OnInit:初始化。
OnOpen:打开面板。
RefreshData
UpdateUI
OnClose:关闭面板。
OnCloseAll
UIResEnum枚举
Basics:基本。
None:无。
Other:其他。
Custom:定制化。
LineChart:折线图。
CurveChart:曲线图。
PieChart:饼图。
RingChart:环形图。
BarChart:柱状图。
Button 按钮。
BackgroundBlock:图片。
Text:文本。
List:列表。
Navigation:按钮。
Video:视频。
UIFormLogic
UI弹窗基类,所有UI弹窗必须显式派生自UIFormLogic。该类继承自MonoBehaviour (opens new window)。
变量
DepthFactor:int类型。
OriginalDepth:int类型
Depth:int类型。
方法
SetMainFont
OnInit:初始化
OnRecycle:恢复界面时
OnOpen:打开界面时
OnClose:关闭界面时
OnPause:暂停界面时
OnResume:恢复界面时
OnCover:覆盖界面时
OnReveal:显示界面时
OnRefocus:聚焦界面时
OnUpdate
OnDepthChanged:层级发生变化时
SetAlarm:设置告警时
YcItemData
IoTCenter的遥测点对象,拥有以下属性:
YcValue:RealTimeValue类型,表示实时值。
EquipNo:int类型,表示设备号。
Bufang:bool类型,表示是否布防。
YcNo:int类型,表示遥测号。
YcName:string类型,表示遥测名称。
Unit:string类型,表示遥测点的单位。
RelatedVideo:string类型,表示关联视频。
RelatedPic:string类型,表示关联图片。
ZiChanID:string类型,表示资产ID。
PlanNo:string类型,表示计划编号。
IsAlarm:bool类型,表示是否告警。
AdviceMsg:string类型,表示通知消息。
HasHistoryCcurve:bool类型,表示是否有历史曲线。
EquipState:int类型,表示设备状态。
YxItemData
IoTCenter的遥信点对象,拥有以下属性:
YXValue:RealTimeValue类型,表示实时数据。
EquipNo:int类型,表示设备号。
Bufang:bool类型,表示是否布防。
YXNo:int类型,表示遥信号。
YxName:string类型,表示遥信名称。
State:string类型,表示状态名称。
RelatedVideo:string类型,表示关联视频。
RelatedPic:string类型,表示关联图片。
ZiChanID:string类型,表示资产ID。
PlanNo:string类型,表示计划编号。
IsAlarm:YXAlarm类型,表示是否告警。
AdviceMsg:string类型,表示通知消息。
HasHistoryCcurve:bool类型,表示是否有历史曲线。
EquipState:int类型,表示设备状态。
# 常量
主要介绍IoTCenter3D平台中常用的固定参数。
设备
AssetBundles
信息开发者需要按照规定设置设备预制体的
AssetBundleName
和AssetBundleVariantName
AssetBundleName:必须为deviceres。
AssetBundleVariantName:必须为assetbundle。
AssetBundles
路径当开发者在
Unity
中构建AssetBundles
包后,将构建后的AssetBundles
放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Devices\deviceres.assetbundle
路径。
UI控件
AssetBundles
信息开发者需要按照规定设置UI控件预制体的
AssetBundleName
和AssetBundleVariantName
AssetBundleName:必须为uicontrols。
AssetBundleVariantName:必须为assetbundle。
AssetBundles
路径当开发者在
Unity
中构建AssetBundles
包后,将构建后的AssetBundles
放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Devices\uicontrols.assetbundle
路径下。
UI弹窗
AssetBundles
信息开发者需要按照规定设置UI弹窗预制体的
AssetBundleName
和AssetBundleVariantName
AssetBundleName:必须为uiforms。
AssetBundleVariantName:必须为assetbundle。
AssetBundles
路径当开发者在
Unity
中构建AssetBundles
包后,将构建后的AssetBundles
放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Devices\uiforms.assetbundle
路径下。
dll
dll编译文件
当开发者在IDE (opens new window)(如Visual Studio (opens new window)、Visual Studio Code (opens new window))或者文本编辑器 (opens new window)里写完代码后,Unity会开始编译代码 (opens new window),并会在该目录 (opens new window)(
\Library\ScriptAssemblies
)下生成项目中所有程序集的dll文件dll路径
当开发者在
Unity
中编写的代码都需要放在Scene.Module
程序集里,将编译后的Scene.Module.dll
文件放在\IoTCenter 3D_Data\Managed\Scene.Module.dll
路径
场景
AssetBundles
信息开发者需要按照规定设置场景的
AssetBundleName
和AssetBundleVariantName
AssetBundleName:必须为确保名称唯一并且是全部小写(如scene_1)。
AssetBundleVariantName:必须为assetbundle。
AssetBundles
路径当开发者在
Unity
中构建AssetBundles
包后,将构建后的AssetBundles
放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Scenes
路径下。
编辑数据
用户在编辑模式保存后,所有数据都会保存在\IoTCenter 3D_Data\StreamingAssets\Data
路径下,包括设备、场景、UI。
# FAQ
安装编辑器工具出错。
这种问题通常来自于开发者按照编辑器工具安装文档进行安装,但是还没有单独提供编辑器工具压缩包,默认集成在二次开发包里。
制作的
UI
控件在IOT
平台无法点击。建议开发者使用编辑器工具创建
UI
控件,因为编辑器工具将一些必须设置的重复操作都自动完成,开发者直接在生成后的预制体内制作UI即可。已知会导致该问题的情况:根节点不对,将Canvas制作成UI控件根节点。
解决方法如下:
删除
Graphic Raycaster
组件。使用
Canvas
里的子节点制作预制体,如上图就是Button
作为预制体的根节点。
可以使用哪些版本的 Unity?
2021以上版本均支持。
是否可以使用自己创建的
Camera
对于
Camera
有提供接口SetCameraActive
取消Camera
的控制逻辑。示例如下:Camera camera = Camera.main; // Add this line camera.gameObject.SetActive(false);
但是并不建议这样做,因为
IoTCenter3D
平台的多个功能与Camera
关联,关闭后会导致某些问题。注意:
已知问题如下:
- 切换场景
Camera
无法移动 - 设备图标无法正常显示
- 切换场景