附录
# 附录
主要介绍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和AssetBundleVariantNameAssetBundleName:必须为deviceres。
AssetBundleVariantName:必须为assetbundle。
AssetBundles路径当开发者在
Unity中构建AssetBundles包后,将构建后的AssetBundles放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Devices\deviceres.assetbundle路径。
UI控件
AssetBundles信息开发者需要按照规定设置UI控件预制体的
AssetBundleName和AssetBundleVariantNameAssetBundleName:必须为uicontrols。
AssetBundleVariantName:必须为assetbundle。
AssetBundles路径当开发者在
Unity中构建AssetBundles包后,将构建后的AssetBundles放在\IoTCenter 3D_Data\StreamingAssets\AssetBundle\Devices\uicontrols.assetbundle路径下。
UI弹窗
AssetBundles信息开发者需要按照规定设置UI弹窗预制体的
AssetBundleName和AssetBundleVariantNameAssetBundleName:必须为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和AssetBundleVariantNameAssetBundleName:必须为确保名称唯一并且是全部小写(如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无法移动 - 设备图标无法正常显示
- 切换场景