最新修改提交
This commit is contained in:
parent
77176755fa
commit
c5574a995b
@ -31,6 +31,7 @@ RectTransform:
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 7215395422902433694}
|
||||
- {fileID: 522482546413498521}
|
||||
m_Father: {fileID: 1355712093182564075}
|
||||
m_RootOrder: 0
|
||||
@ -102,7 +103,6 @@ GameObject:
|
||||
- component: {fileID: 522482546413498521}
|
||||
- component: {fileID: 579047698137250596}
|
||||
- component: {fileID: 5000131054849129790}
|
||||
- component: {fileID: 2008703339932656136}
|
||||
m_Layer: 5
|
||||
m_Name: bookText
|
||||
m_TagString: Untagged
|
||||
@ -123,12 +123,12 @@ RectTransform:
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 8327629265958355051}
|
||||
m_RootOrder: 0
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 30, y: -84}
|
||||
m_SizeDelta: {x: -29.999998, y: 830}
|
||||
m_Pivot: {x: 0, y: 1}
|
||||
--- !u!222 &579047698137250596
|
||||
CanvasRenderer:
|
||||
@ -160,7 +160,7 @@ MonoBehaviour:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 12800000, guid: be667217d3d3a5447a0231196de062c0, type: 3}
|
||||
m_FontSize: 28
|
||||
m_FontSize: 25
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
@ -172,20 +172,6 @@ MonoBehaviour:
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text:
|
||||
--- !u!114 &2008703339932656136
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 698830716538477079}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalFit: 0
|
||||
m_VerticalFit: 2
|
||||
--- !u!1 &1108802075530485256
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -219,7 +205,7 @@ RectTransform:
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1355712093182564075}
|
||||
- {fileID: 4426448496689443081}
|
||||
- {fileID: 6327963864837876568}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
@ -329,7 +315,7 @@ RectTransform:
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0.000015258789, y: 10}
|
||||
m_AnchoredPosition: {x: 0.000030517578, y: 10}
|
||||
m_SizeDelta: {x: -40.000015, y: -60}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &4538426996848575638
|
||||
@ -384,7 +370,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Content: {fileID: 522482546413498521}
|
||||
m_Horizontal: 0
|
||||
m_Vertical: 1
|
||||
m_Vertical: 0
|
||||
m_MovementType: 1
|
||||
m_Elasticity: 0.1
|
||||
m_Inertia: 1
|
||||
@ -425,18 +411,18 @@ RectTransform:
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3532340770849631787}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 898674588671415498}
|
||||
m_RootOrder: 1
|
||||
m_Father: {fileID: 6327963864837876568}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0}
|
||||
m_AnchorMax: {x: 0.5, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 20}
|
||||
m_SizeDelta: {x: 40, y: 40}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
m_AnchoredPosition: {x: 23.4512, y: 0}
|
||||
m_SizeDelta: {x: 61.0977, y: 40}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &1119868347875695608
|
||||
CanvasRenderer:
|
||||
@ -459,7 +445,7 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
@ -473,13 +459,170 @@ MonoBehaviour:
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 0
|
||||
m_Alignment: 4
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: 1
|
||||
--- !u!1 &5263353154652506651
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 7215395422902433694}
|
||||
- component: {fileID: 1761202182111978314}
|
||||
- component: {fileID: 6874164926691447841}
|
||||
m_Layer: 5
|
||||
m_Name: bookTopText
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &7215395422902433694
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5263353154652506651}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 8327629265958355051}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 70}
|
||||
m_Pivot: {x: 0, y: 1}
|
||||
--- !u!222 &1761202182111978314
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5263353154652506651}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &6874164926691447841
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5263353154652506651}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 12800000, guid: be667217d3d3a5447a0231196de062c0, type: 3}
|
||||
m_FontSize: 28
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 3
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: "\u4E00\u3001\u5BFC\u5C3F\u672F\u7684\u9002\u5E94\u75C7\u4E0E\u7981\u5FCC\u75C7\n"
|
||||
--- !u!1 &6805618407965812769
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6327963864837876568}
|
||||
- component: {fileID: 7375553302854610476}
|
||||
- component: {fileID: 1304429593626385277}
|
||||
m_Layer: 5
|
||||
m_Name: Image
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &6327963864837876568
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6805618407965812769}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 4426448496689443081}
|
||||
m_Father: {fileID: 898674588671415498}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 101, y: 84}
|
||||
m_SizeDelta: {x: 72, y: 32}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &7375553302854610476
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6805618407965812769}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &1304429593626385277
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6805618407965812769}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 21300000, guid: 18293cc9772c80b4fa1c3443c1305d7d, type: 3}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!1 &7249459030306176569
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@ -33,7 +33,7 @@ RectTransform:
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 3906151173181146887}
|
||||
- {fileID: 4500839131076430979}
|
||||
- {fileID: 7015576608080402352}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
@ -181,6 +181,86 @@ MonoBehaviour:
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!1 &844659690061720241
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 358274079551938198}
|
||||
- component: {fileID: 5095144190117216544}
|
||||
- component: {fileID: 661162673703820463}
|
||||
m_Layer: 5
|
||||
m_Name: bookTopText
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &358274079551938198
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 844659690061720241}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 5712826368191145630}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 70}
|
||||
m_Pivot: {x: 0, y: 1}
|
||||
--- !u!222 &5095144190117216544
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 844659690061720241}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &661162673703820463
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 844659690061720241}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 12800000, guid: be667217d3d3a5447a0231196de062c0, type: 3}
|
||||
m_FontSize: 28
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 3
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: "\u4E00\u3001\u5BFC\u5C3F\u672F\u7684\u9002\u5E94\u75C7\u4E0E\u7981\u5FCC\u75C7\n"
|
||||
--- !u!1 &1171872099361499748
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -192,7 +272,6 @@ GameObject:
|
||||
- component: {fileID: 3635586649588463893}
|
||||
- component: {fileID: 3272867475693095438}
|
||||
- component: {fileID: 8037391440435932342}
|
||||
- component: {fileID: 2878836543288473266}
|
||||
m_Layer: 5
|
||||
m_Name: bookText
|
||||
m_TagString: Untagged
|
||||
@ -213,12 +292,12 @@ RectTransform:
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 5712826368191145630}
|
||||
m_RootOrder: 0
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 30, y: -84}
|
||||
m_SizeDelta: {x: -30, y: 830}
|
||||
m_Pivot: {x: 0, y: 1}
|
||||
--- !u!222 &3272867475693095438
|
||||
CanvasRenderer:
|
||||
@ -250,7 +329,7 @@ MonoBehaviour:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 12800000, guid: be667217d3d3a5447a0231196de062c0, type: 3}
|
||||
m_FontSize: 28
|
||||
m_FontSize: 25
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
@ -262,20 +341,6 @@ MonoBehaviour:
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text:
|
||||
--- !u!114 &2878836543288473266
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1171872099361499748}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalFit: 0
|
||||
m_VerticalFit: 2
|
||||
--- !u!1 &2476703880615261714
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -307,6 +372,7 @@ RectTransform:
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 358274079551938198}
|
||||
- {fileID: 3635586649588463893}
|
||||
m_Father: {fileID: 3906151173181146887}
|
||||
m_RootOrder: 0
|
||||
@ -624,7 +690,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Content: {fileID: 3635586649588463893}
|
||||
m_Horizontal: 0
|
||||
m_Vertical: 1
|
||||
m_Vertical: 0
|
||||
m_MovementType: 1
|
||||
m_Elasticity: 0.1
|
||||
m_Inertia: 1
|
||||
@ -640,6 +706,83 @@ MonoBehaviour:
|
||||
m_OnValueChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
--- !u!1 &8842363041953792456
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 7015576608080402352}
|
||||
- component: {fileID: 775016411365987648}
|
||||
- component: {fileID: 7305091546734591109}
|
||||
m_Layer: 5
|
||||
m_Name: Image
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &7015576608080402352
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8842363041953792456}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 4500839131076430979}
|
||||
m_Father: {fileID: 152011631505034571}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 1, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 0}
|
||||
m_AnchoredPosition: {x: -94, y: 68}
|
||||
m_SizeDelta: {x: 72, y: 32}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &775016411365987648
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8842363041953792456}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &7305091546734591109
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8842363041953792456}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 21300000, guid: ad2563472913bc0418b92b41b1645c52, type: 3}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!1 &9019310647496789194
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -665,18 +808,18 @@ RectTransform:
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9019310647496789194}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 152011631505034571}
|
||||
m_RootOrder: 1
|
||||
m_Father: {fileID: 7015576608080402352}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0}
|
||||
m_AnchorMax: {x: 0.5, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 20}
|
||||
m_SizeDelta: {x: 40, y: 40}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
m_AnchoredPosition: {x: -24.528809, y: 0}
|
||||
m_SizeDelta: {x: 58.9424, y: 40}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &8884188765733387939
|
||||
CanvasRenderer:
|
||||
@ -699,7 +842,7 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
@ -713,7 +856,7 @@ MonoBehaviour:
|
||||
m_BestFit: 0
|
||||
m_MinSize: 2
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 0
|
||||
m_Alignment: 4
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
|
||||
BIN
Assets/Art/Sprites/书籍优化/back.png
Normal file
BIN
Assets/Art/Sprites/书籍优化/back.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 399 B |
146
Assets/Art/Sprites/书籍优化/back.png.meta
Normal file
146
Assets/Art/Sprites/书籍优化/back.png.meta
Normal file
@ -0,0 +1,146 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18293cc9772c80b4fa1c3443c1305d7d
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMasterTextureLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Art/Sprites/书籍优化/frontImg.png
Normal file
BIN
Assets/Art/Sprites/书籍优化/frontImg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 385 B |
146
Assets/Art/Sprites/书籍优化/frontImg.png.meta
Normal file
146
Assets/Art/Sprites/书籍优化/frontImg.png.meta
Normal file
@ -0,0 +1,146 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad2563472913bc0418b92b41b1645c52
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMasterTextureLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -1 +1 @@
|
||||
[{"id":1,"group":"1","txt":"公犬导尿术<br>一、导尿术的适应症与禁忌症<br>1.<color=red>适应</color>症<br>1)<color=red>急性尿潴留</color>。<br>2)需<color=red>采集无菌尿液样本</color>或进行<color=red>膀胱灌注</color>治疗。<br>3)尿道梗阻解除后<color=red>维持排尿通路</color>。<br>2.<color=red>禁忌</color>症<br>1)<color=red>尿道破裂</color>或<color=red>严重损伤</color>(需手术修复)。<br>2)泌尿道<color=red>急性感染未控制</color>(避免逆行感染扩散)。<br>3)<color=red>严重凝血功能障碍</color>。"},{"id":2,"group":"1","txt":"二、公犬泌尿系统解剖要点<br>1.尿道结构<br>1)<color=red>公犬尿道</color>分为<color=red>前列腺前部、前列腺部和阴茎部</color>,导尿管需通过阴茎部尿道(<color=red>长约15-20cm</color>)进入膀胱。<br>2)尿道口位于阴茎龟头顶端,被包皮覆盖,<color=red>操作需向后推包皮暴露</color>。<br>2.体表定位标志<br>1)<color=red>坐骨结节为导尿管体外测量的终点</color>(<color=red>尿道口至坐骨结节距离≈尿道长度</color>)。<br>2)膀胱充盈时可在腹后部触及<color=red>球形隆起</color>(<color=red>叩诊浊音</color>)。"},{"id":3,"group":"1","txt":"三、术前准备工作<br>1.物品准备<br>1)核心器械:<color=red>型号适合的硅胶导尿管</color>、无菌外科手套、20ml注射器、0.9%生理盐水、<color=red>利多卡因凝胶</color>、<color=red>氯己定棉球</color>、无菌持物镊等。<br>2)辅助物品:电动剃毛器(<color=red>备皮范围直径5-10cm</color>)、集尿袋、抗生素软膏、一次性医用垫单、医疗污物桶。<br>2.患犬准备<br>1)镇静镇痛:静脉注射<color=red>右美托咪定(5μg/kg)+布托啡诺(0.3mg/kg)</color>,提供深度镇静与镇痛。<br>2)体位:<color=red>右侧卧位,后肢外展固定,充分暴露会阴部</color>。<br>3)备皮:剃除包皮口周围长毛,清洁皮肤碎屑。<br>3.术者准备<br>七步洗手法洗手,戴无菌口罩、帽子、手套。"},{"id":4,"group":"1","txt":"四、规范操作流程<br>1.清洁消毒<br>1)向后推包皮暴露龟头,<color=red>用20ml生理盐水冲洗包皮腔污物</color>。<br>2)氯己定棉球消毒(2次):<br>(1)第1次:<color=red>由内向外环形清洁包皮口及周围皮肤(半径5-10cm)</color>。<br>(2)第2次:重点<color=red>消毒尿道口及龟头表面</color>。<br>2.尿道麻醉:<color=red>食指涂抹利多卡因凝胶,旋转涂抹龟头及尿道口,等待2-3分钟起效</color>。<br>3.导尿管测量与插入<br>1)测量:<color=red>导尿管头端置于尿道口,尾端拉至坐骨结节处标记刻度</color>(体外预估法)。<br>2)插管<br>(1)<color=red>导尿管外涂抗生素软膏润滑</color>。<br>(2)助手<color=red>向后推包皮暴露阴茎2-5cm</color>,术者持导管沿尿道走向<color=red>缓慢插入</color>(遇阻力勿强行推进)。<br>(3)成功标志:<color=red>尿液流入集尿袋,膀胱逐渐塌陷</color>。<br>4.导尿后处理<br>1)<color=red>尿液引流完毕后,缓慢拔出导尿管</color>。<br>2)脱手套,按医疗废物分类处理物品。"},{"id":5,"group":"1","txt":"五、注意事项与并发症预防<br>1.无菌操作<br>1)手套破损需立即更换。<br>2)消毒棉球限单次单向使用。<br>2.操作技巧<br>1)<color=red>尿道痉挛时暂停操作</color>,<color=red>追加利多卡因凝胶</color>(<color=red>禁用暴力插管</color>)。<br>2)<color=red>导尿管插入深度不超过坐骨结节标记点</color>(<color=red>避免膀胱壁损伤</color>)。<br>3)并发症应对<br>(1)尿道损伤:立即停止操作,评估是否需膀胱穿刺或手术。<br>(2)逆行感染:严格无菌操作,术后监测排尿状态及体温。"},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""}]
|
||||
[{"id":1,"group":"1","topTxt":"一、导尿术的适应症与禁忌症","txt":"1.<color=red>适应</color>症<br>1)<color=red>急性尿潴留</color>。<br>2)需<color=red>采集无菌尿液样本</color>或进行<color=red>膀胱灌注</color>治疗。<br>3)尿道梗阻解除后<color=red>维持排尿通路</color>。<br>2.<color=red>禁忌</color>症<br>1)<color=red>尿道破裂</color>或<color=red>严重损伤</color>(需手术修复)。<br>2)泌尿道<color=red>急性感染未控制</color>(避免逆行感染扩散)。<br>3)<color=red>严重凝血功能障碍</color>。"},{"id":2,"group":"1","topTxt":"二、公犬泌尿系统解剖要点","txt":"1.尿道结构<br>1)<color=red>公犬尿道</color>分为<color=red>前列腺前部、前列腺部和阴茎部</color>,导尿管需通过阴茎部尿道(<color=red>长约15-20cm</color>)进入膀胱。<br>2)尿道口位于阴茎龟头顶端,被包皮覆盖,<color=red>操作需向后推包皮暴露</color>。<br>2.体表定位标志<br>1)<color=red>坐骨结节为导尿管体外测量的终点</color>(<color=red>尿道口至坐骨结节距离≈尿道长度</color>)。<br>2)膀胱充盈时可在腹后部触及<color=red>球形隆起</color>(<color=red>叩诊浊音</color>)。"},{"id":3,"group":"1","topTxt":"三、术前准备工作","txt":"1.物品准备<br>1)核心器械:<color=red>型号适合的硅胶导尿管</color>、无菌外科手套、20ml注射器、0.9%生理盐水、<color=red>利多卡因凝胶</color>、<color=red>氯己定棉球</color>、无菌持物镊等。<br>2)辅助物品:电动剃毛器(<color=red>备皮范围直径5-10cm</color>)、集尿袋、抗生素软膏、一次性医用垫单、医疗污物桶。<br>2.患犬准备<br>1)镇静镇痛:静脉注射<color=red>右美托咪定(5μg/kg)+布托啡诺(0.3mg/kg)</color>,提供深度镇静与镇痛。"},{"id":4,"group":"1","topTxt":"","txt":"<br>2)体位:<color=red>右侧卧位,后肢外展固定,充分暴露会阴部</color>。<br>3)备皮:剃除包皮口周围长毛,清洁皮肤碎屑。<br>3.术者准备<br>七步洗手法洗手,戴无菌口罩、帽子、手套。"},{"id":5,"group":"1","topTxt":"四、规范操作流程","txt":"1.清洁消毒<br>1)向后推包皮暴露龟头,<color=red>用20ml生理盐水冲洗包皮腔污物</color>。<br>2)氯己定棉球消毒(2次):<br>(1)第1次:<color=red>由内向外环形清洁包皮口及周围皮肤(半径5-10cm)</color>。<br>(2)第2次:重点<color=red>消毒尿道口及龟头表面</color>。<br>2.尿道麻醉:<color=red>食指涂抹利多卡因凝胶,旋转涂抹龟头及尿道口,等待2-3分钟起效</color>。<br>3.导尿管测量与插入<br>1)测量:<color=red>导尿管头端置于尿道口,尾端拉至坐骨结节处标记刻度</color>(体外预估法)。"},{"id":6,"group":"1","topTxt":"","txt":"<br>2)插管<br>(1)<color=red>导尿管外涂抗生素软膏润滑</color>。<br>(2)助手<color=red>向后推包皮暴露阴茎2-5cm</color>,术者持导管沿尿道走向<color=red>缓慢插入</color>(遇阻力勿强行推进)。<br>(3)成功标志:<color=red>尿液流入集尿袋,膀胱逐渐塌陷</color>。<br>4.导尿后处理<br>1)<color=red>尿液引流完毕后,缓慢拔出导尿管</color>。<br>2)脱手套,按医疗废物分类处理物品。"},{"id":7,"group":"1","topTxt":"五、注意事项与并发症预防","txt":"1.无菌操作<br>1)手套破损需立即更换。<br>2)消毒棉球限单次单向使用。<br>2.操作技巧<br>1)<color=red>尿道痉挛时暂停操作</color>,<color=red>追加利多卡因凝胶</color>(<color=red>禁用暴力插管</color>)。<br>2)<color=red>导尿管插入深度不超过坐骨结节标记点</color>(<color=red>避免膀胱壁损伤</color>)。<br>3)并发症应对<br>(1)尿道损伤:立即停止操作,评估是否需膀胱穿刺或手术。<br>(2)逆行感染:严格无菌操作,术后监测排尿状态及体温。"},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""}]
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
@ -22,7 +23,7 @@ public class ZhuSheQi_10SenSor : Sensor
|
||||
transform.parent.GetComponent<SensorManager>().SendFunction("+++");
|
||||
}
|
||||
|
||||
public override void ReceiveData(string datas)
|
||||
public override void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
base.ReceiveData(datas);
|
||||
if (!datas.Split('%')[0].Split("ID:")[1].Split(',')[0].Equals("ZSQ10")) return;
|
||||
|
||||
@ -2,6 +2,7 @@ using DongWuYiXue.DaoNiaoShu;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
@ -27,7 +28,7 @@ public class ZhuSheQi_20SenSor : Sensor
|
||||
GameManager.Instance.senSor.SendFunction("+++");
|
||||
}
|
||||
|
||||
public override void ReceiveData(string datas)
|
||||
public override void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
base.ReceiveData(datas);
|
||||
if (!datas.Split('%')[0].Split("ID:")[1].Split(',')[0].Equals("ZSQ20"))
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
@ -24,7 +25,7 @@ public class ZhuSheQi_50SenSor : Sensor
|
||||
transform.parent.GetComponent<SensorManager>().SendFunction("+++");
|
||||
}
|
||||
|
||||
public override void ReceiveData(string datas)
|
||||
public override void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
base.ReceiveData(datas);
|
||||
if (!datas.Split('%')[0].Split("ID:")[1].Split(',')[0].Equals("ZSQ50")) return;
|
||||
@ -54,7 +55,7 @@ public class ZhuSheQi_50SenSor : Sensor
|
||||
public override void Display(string datas)
|
||||
{
|
||||
base.Display(datas);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using ZXKFramework;
|
||||
@ -24,14 +25,14 @@ public class ZhuSheQi_5SenSor : Sensor
|
||||
transform.parent.GetComponent<SensorManager>().SendFunction("+++");
|
||||
}
|
||||
|
||||
public override void ReceiveData(string datas)
|
||||
public override void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
base.ReceiveData(datas);
|
||||
if (!datas.Split('%')[0].Split("ID:")[1].Split(',')[0].Equals("ZSQ5")) return;
|
||||
//this.Error(datas);
|
||||
|
||||
//progressValue = ((Convert.ToInt32(datas.Split("%")[0].Split("LEVEL:")[1]))-3) / 7.0f;
|
||||
progressValue = ((Convert.ToInt32(datas.Split("%")[0].Split("LEVEL:")[1]))-3) / 6.0f;
|
||||
progressValue = ((Convert.ToInt32(datas.Split("%")[0].Split("LEVEL:")[1])) - 3) / 6.0f;
|
||||
//this.Error($"µ±Ç°5ml×¢ÉäÆ÷µÄ½ø¶ÈΪ£º{progressValue}");
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
/// <summary>
|
||||
/// 传感器基类
|
||||
@ -20,7 +21,11 @@ public abstract class Sensor : MonoBehaviour
|
||||
if (!gameObject.activeSelf) return;
|
||||
Display(datas);
|
||||
}
|
||||
|
||||
public virtual void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
if (!gameObject.activeSelf) return;
|
||||
Display(datas);
|
||||
}
|
||||
public virtual void Display(string datas)
|
||||
{
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
@ -12,7 +13,7 @@ public class DaoNiao_Sensor : Sensor
|
||||
public float daoNiaoDeep;
|
||||
string data;
|
||||
public Text txt;
|
||||
public override void ReceiveData(string datas)
|
||||
public override void ReceiveData(string datas, SerialPort sp = null)
|
||||
{
|
||||
base.ReceiveData(datas);
|
||||
data = datas.Split("#")[1].Split("%")[0];
|
||||
|
||||
@ -3,6 +3,7 @@ using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlTypes;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
//using UnityEditor.PackageManager.UI;
|
||||
@ -12,14 +13,215 @@ using ZXKFramework;
|
||||
|
||||
public class SensorManager : MonoBehaviour /*MonoSingleton<SensorManager>*/
|
||||
{
|
||||
#region 修改前逻辑
|
||||
//public enum DataType
|
||||
//{
|
||||
// 字符串,
|
||||
// 字节流,
|
||||
//}
|
||||
//#region 串口参数,主要修改串口名与波特率
|
||||
//[Header("串口名")]
|
||||
//public string portName = "COM10";
|
||||
//[Header("波特率")]
|
||||
//public int baudRate = 115200;
|
||||
//[Header("奇偶校验")]
|
||||
//private Parity parity = Parity.None;
|
||||
//[Header("数据位")]
|
||||
//private int dataBits = 8;
|
||||
//[Header("停止位")]
|
||||
//private StopBits stopBits = StopBits.One;
|
||||
//SerialPort sp = null;
|
||||
//Thread dataReceiveThread;
|
||||
//[Header("接收数据格式")]
|
||||
//public DataType dataType;
|
||||
//#endregion
|
||||
//private Dictionary<string, Sensor> allSensor = new Dictionary<string, Sensor>();
|
||||
//StringBuilder sb = new StringBuilder();
|
||||
//private void Start()
|
||||
//{
|
||||
// sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
|
||||
// foreach (Sensor s in GetComponentsInChildren<Sensor>())
|
||||
// {
|
||||
// allSensor.TryAdd(s.GetType().Name, s);
|
||||
// }
|
||||
// switch (dataType)
|
||||
// {
|
||||
// case DataType.字节流:
|
||||
// dataReceiveThread = new Thread(new ThreadStart(DataReceiveBytesThread));
|
||||
// break;
|
||||
// case DataType.字符串:
|
||||
// dataReceiveThread = new Thread(new ThreadStart(DataReceiveStrThread));
|
||||
// break;
|
||||
// }
|
||||
// OpenPort();
|
||||
//}
|
||||
///// <summary>
|
||||
///// 接收字节流
|
||||
///// </summary>
|
||||
//private void DataReceiveBytesThread()
|
||||
//{
|
||||
// while (true)
|
||||
// {
|
||||
// if (sp != null && sp.IsOpen)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// if (sp.BytesToRead > 0)
|
||||
// {
|
||||
// byte[] buffer = new byte[sp.BytesToRead];
|
||||
// sp.Read(buffer, 0, sp.BytesToRead);
|
||||
// string receivedData = Encoding.Default.GetString(buffer);
|
||||
// //Debug.Log(receivedData);
|
||||
// UnityMainThreadDispatcher.Instance().Enqueue(() =>
|
||||
// {
|
||||
// foreach (var s in allSensor)
|
||||
// {
|
||||
// s.Value.ReceiveData(receivedData);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("消息接收失败");
|
||||
// }
|
||||
// }
|
||||
// Thread.Sleep(20);
|
||||
// }
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 接收字符串
|
||||
///// </summary>
|
||||
//private void DataReceiveStrThread()
|
||||
//{
|
||||
// while (true)
|
||||
// {
|
||||
// if (sp != null && sp.IsOpen)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// if (sp.BytesToRead > 0)
|
||||
// {
|
||||
// sb.Append(sp.ReadExisting());
|
||||
// //this.ColorLog(GDLog.LogColorState.Blue, sp.ReadLine());
|
||||
// UnityMainThreadDispatcher.Instance().Enqueue(() =>
|
||||
// {
|
||||
// foreach (var s in allSensor)
|
||||
// {
|
||||
// s.Value.ReceiveData(sb.ToString());
|
||||
// }
|
||||
// sb.Clear();
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("消息接收失败");
|
||||
// }
|
||||
// }
|
||||
// Thread.Sleep(20);
|
||||
// }
|
||||
//}
|
||||
///// <summary>
|
||||
///// 发送消息
|
||||
///// </summary>
|
||||
///// <param name="dataSend"></param>
|
||||
//public void SendFunction(string str)
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// byte[] dataSend = Encoding.ASCII.GetBytes(str);
|
||||
// if (sp != null && sp.IsOpen)
|
||||
// {
|
||||
// if (dataSend != null && dataSend.Length > 0)
|
||||
// {
|
||||
// sp.Write(dataSend, 0, dataSend.Length);
|
||||
// Debug.Log("发送消息成功:" + str);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("发送消息失败:" + str);
|
||||
// }
|
||||
//}
|
||||
////获取指定传感器
|
||||
//public T GetSensor<T>() where T : Sensor
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// string name = typeof(T).Name;
|
||||
// if (!allSensor.ContainsKey(name))
|
||||
// {
|
||||
// allSensor.TryAdd(name, GetComponentInChildren<T>());
|
||||
// allSensor[name].Init(this);
|
||||
// }
|
||||
// //Debug.Log("传感器获取成功");
|
||||
// return allSensor[name] as T;
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("传感器获取失败");
|
||||
// return null;
|
||||
// }
|
||||
//}
|
||||
//#region 串口开启关闭相关
|
||||
////打开串口
|
||||
//public void OpenPort()
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// if (!sp.IsOpen)
|
||||
// {
|
||||
// sp.Open();
|
||||
// dataReceiveThread.Start();
|
||||
// Debug.Log("串口打开成功");
|
||||
// }
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("串口打开失败");
|
||||
// }
|
||||
//}
|
||||
|
||||
////关闭串口
|
||||
//public void ClosePort()
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// sp.Close();
|
||||
// dataReceiveThread.Abort();
|
||||
// Debug.Log("串口关闭");
|
||||
// }
|
||||
// catch (Exception)
|
||||
// {
|
||||
// Debug.Log("串口关闭失败");
|
||||
// }
|
||||
//}
|
||||
//#endregion
|
||||
|
||||
//#region Unity 退出相关
|
||||
//private void OnApplicationQuit()
|
||||
//{
|
||||
// ClosePort();
|
||||
//}
|
||||
//private void OnDisable()
|
||||
//{
|
||||
// this.Log("为什么关闭了:" + gameObject.name);
|
||||
// ClosePort();
|
||||
//}
|
||||
//#endregion
|
||||
#endregion
|
||||
public enum DataType
|
||||
{
|
||||
字符串,
|
||||
字节流,
|
||||
}
|
||||
#region 串口参数,主要修改串口名与波特率
|
||||
[Header("串口名")]
|
||||
public string portName = "COM10";
|
||||
|
||||
#region 串口参数
|
||||
//[Header("端口名(多串口时自动获取)")]
|
||||
//public string portName = "COM3";
|
||||
[Header("波特率")]
|
||||
public int baudRate = 115200;
|
||||
[Header("奇偶校验")]
|
||||
@ -28,38 +230,87 @@ public class SensorManager : MonoBehaviour /*MonoSingleton<SensorManager>*/
|
||||
private int dataBits = 8;
|
||||
[Header("停止位")]
|
||||
private StopBits stopBits = StopBits.One;
|
||||
SerialPort sp = null;
|
||||
Thread dataReceiveThread;
|
||||
[Header("接收数据格式")]
|
||||
public DataType dataType;
|
||||
#endregion
|
||||
|
||||
private Dictionary<string, Sensor> allSensor = new Dictionary<string, Sensor>();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
public GameObject canvas;
|
||||
List<string> COMPorts = new List<string>();
|
||||
List<SerialPort> serialPorts = new List<SerialPort>();
|
||||
List<Thread> dataReceiveThreads = new List<Thread>();
|
||||
// 线程运行状态标志(每个串口对应一个标志)
|
||||
private bool[] isThreadRunning;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
|
||||
COMPorts = GetAllWindowsCOMPorts().ToList();
|
||||
|
||||
// 初始化所有串口
|
||||
for (int i = 0; i < COMPorts.Count; i++)
|
||||
{
|
||||
SerialPort sp = new SerialPort(COMPorts[i], baudRate, parity, dataBits, stopBits);
|
||||
serialPorts.Add(sp);
|
||||
}
|
||||
|
||||
// 初始化传感器
|
||||
foreach (Sensor s in GetComponentsInChildren<Sensor>())
|
||||
{
|
||||
allSensor.TryAdd(s.GetType().Name, s);
|
||||
}
|
||||
switch (dataType)
|
||||
|
||||
// 初始化线程(绑定具体串口索引,避免索引混乱)
|
||||
isThreadRunning = new bool[COMPorts.Count]; // 初始化标志位数组
|
||||
for (int i = 0; i < COMPorts.Count; i++)
|
||||
{
|
||||
case DataType.字节流:
|
||||
dataReceiveThread = new Thread(new ThreadStart(DataReceiveBytesThread));
|
||||
break;
|
||||
case DataType.字符串:
|
||||
dataReceiveThread = new Thread(new ThreadStart(DataReceiveStrThread));
|
||||
break;
|
||||
isThreadRunning[i] = true; // 默认启动线程
|
||||
int portIndex = i; // 捕获当前索引(避免闭包陷阱)
|
||||
Thread thread;
|
||||
|
||||
// 根据数据类型创建对应线程,并绑定端口索引
|
||||
switch (dataType)
|
||||
{
|
||||
case DataType.字节流:
|
||||
thread = new Thread(() => DataReceiveBytesThread(portIndex));
|
||||
break;
|
||||
case DataType.字符串:
|
||||
thread = new Thread(() => DataReceiveStrThread(portIndex));
|
||||
break;
|
||||
default:
|
||||
thread = null;
|
||||
break;
|
||||
}
|
||||
|
||||
if (thread != null)
|
||||
{
|
||||
dataReceiveThreads.Add(thread);
|
||||
}
|
||||
}
|
||||
|
||||
OpenPort();
|
||||
}
|
||||
/// <summary>
|
||||
/// 接收字节流
|
||||
/// </summary>
|
||||
private void DataReceiveBytesThread()
|
||||
|
||||
private void Update()
|
||||
{
|
||||
while (true)
|
||||
if (Input.GetKeyDown(KeyCode.BackQuote))
|
||||
{
|
||||
canvas?.SetActive(!canvas.activeInHierarchy);
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
canvas?.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 字节流接收线程(绑定具体串口索引)
|
||||
/// </summary>
|
||||
private void DataReceiveBytesThread(int portIndex)
|
||||
{
|
||||
// 循环条件:线程标志位为true,且索引有效
|
||||
while (isThreadRunning[portIndex] && portIndex < serialPorts.Count)
|
||||
{
|
||||
SerialPort sp = serialPorts[portIndex];
|
||||
if (sp != null && sp.IsOpen)
|
||||
{
|
||||
try
|
||||
@ -67,34 +318,41 @@ public class SensorManager : MonoBehaviour /*MonoSingleton<SensorManager>*/
|
||||
if (sp.BytesToRead > 0)
|
||||
{
|
||||
byte[] buffer = new byte[sp.BytesToRead];
|
||||
sp.Read(buffer, 0, sp.BytesToRead);
|
||||
sp.Read(buffer, 0, buffer.Length);
|
||||
string receivedData = Encoding.Default.GetString(buffer);
|
||||
//Debug.Log(receivedData);
|
||||
//Debug.Log($"串口 {sp.PortName} 接收字节流:{receivedData}");
|
||||
|
||||
// 主线程处理数据
|
||||
UnityMainThreadDispatcher.Instance().Enqueue(() =>
|
||||
{
|
||||
foreach (var s in allSensor)
|
||||
foreach (var pair in allSensor)
|
||||
{
|
||||
s.Value.ReceiveData(receivedData);
|
||||
pair.Value.ReceiveData(receivedData, sp);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("消息接收失败");
|
||||
Debug.Log($"串口 {sp.PortName} 字节流接收错误:{ex.Message}");
|
||||
}
|
||||
}
|
||||
Thread.Sleep(20);
|
||||
Thread.Sleep(10); // 降低CPU占用
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 接收字符串
|
||||
/// 字符串接收线程(绑定具体串口索引)
|
||||
/// </summary>
|
||||
private void DataReceiveStrThread()
|
||||
private void DataReceiveStrThread(int portIndex)
|
||||
{
|
||||
while (true)
|
||||
// 每个线程独立的StringBuilder(避免多线程冲突)
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
// 循环条件:线程标志位为true,且索引有效
|
||||
while (isThreadRunning[portIndex] && portIndex < serialPorts.Count)
|
||||
{
|
||||
SerialPort sp = serialPorts[portIndex];
|
||||
if (sp != null && sp.IsOpen)
|
||||
{
|
||||
try
|
||||
@ -102,49 +360,63 @@ public class SensorManager : MonoBehaviour /*MonoSingleton<SensorManager>*/
|
||||
if (sp.BytesToRead > 0)
|
||||
{
|
||||
sb.Append(sp.ReadExisting());
|
||||
//this.ColorLog(GDLog.LogColorState.Blue, sp.ReadLine());
|
||||
string receivedData = sb.ToString();
|
||||
|
||||
UnityMainThreadDispatcher.Instance().Enqueue(() =>
|
||||
{
|
||||
foreach (var s in allSensor)
|
||||
{
|
||||
s.Value.ReceiveData(sb.ToString());
|
||||
try
|
||||
{
|
||||
//Debug.LogError(s.Value.name);
|
||||
s.Value.ReceiveData(receivedData, sp);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"传感器处理数据错误:{ex.Message}");
|
||||
}
|
||||
}
|
||||
sb.Clear();
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("消息接收失败");
|
||||
Debug.Log($"串口 {sp.PortName} 字符串接收错误:{ex.Message}");
|
||||
}
|
||||
}
|
||||
Thread.Sleep(20);
|
||||
Thread.Sleep(10); // 降低CPU占用
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送消息
|
||||
/// 发送数据到所有已打开的串口
|
||||
/// </summary>
|
||||
/// <param name="dataSend"></param>
|
||||
public void SendFunction(string str)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] dataSend = Encoding.ASCII.GetBytes(str);
|
||||
if (sp != null && sp.IsOpen)
|
||||
for (int i = 0; i < serialPorts.Count; i++)
|
||||
{
|
||||
if (dataSend != null && dataSend.Length > 0)
|
||||
SerialPort sp = serialPorts[i];
|
||||
if (sp != null && sp.IsOpen && dataSend != null && dataSend.Length > 0)
|
||||
{
|
||||
sp.Write(dataSend, 0, dataSend.Length);
|
||||
Debug.Log("发送消息成功:" + str);
|
||||
Debug.Log($"向串口 {sp.PortName} 发送成功:{str}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("发送消息失败:" + str);
|
||||
Debug.Log($"发送数据失败:{ex.Message},数据:{str}");
|
||||
}
|
||||
}
|
||||
//获取指定传感器
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定类型的传感器
|
||||
/// </summary>
|
||||
public T GetSensor<T>() where T : Sensor
|
||||
{
|
||||
try
|
||||
@ -152,62 +424,129 @@ public class SensorManager : MonoBehaviour /*MonoSingleton<SensorManager>*/
|
||||
string name = typeof(T).Name;
|
||||
if (!allSensor.ContainsKey(name))
|
||||
{
|
||||
allSensor.TryAdd(name, GetComponentInChildren<T>());
|
||||
allSensor[name].Init(this);
|
||||
T sensor = GetComponentInChildren<T>();
|
||||
if (sensor != null)
|
||||
{
|
||||
allSensor.TryAdd(name, sensor);
|
||||
sensor.Init(this);
|
||||
}
|
||||
}
|
||||
//Debug.Log("传感器获取成功");
|
||||
Debug.Log($"获取传感器 {typeof(T).Name} 成功");
|
||||
return allSensor[name] as T;
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("传感器获取失败");
|
||||
Debug.Log($"获取传感器 {typeof(T).Name} 失败:{ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
#region 串口开启关闭相关
|
||||
//打开串口
|
||||
|
||||
#region 串口打开关闭控制
|
||||
/// <summary>
|
||||
/// 打开所有串口并启动对应线程
|
||||
/// </summary>
|
||||
public void OpenPort()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!sp.IsOpen)
|
||||
Debug.Log("正在打开串口...");
|
||||
for (int i = 0; i < serialPorts.Count; i++)
|
||||
{
|
||||
sp.Open();
|
||||
dataReceiveThread.Start();
|
||||
Debug.Log("串口打开成功");
|
||||
SerialPort sp = serialPorts[i];
|
||||
if (sp != null && !sp.IsOpen)
|
||||
{
|
||||
sp.Open();
|
||||
Debug.Log($"串口 {sp.PortName} 打开成功");
|
||||
}
|
||||
|
||||
// 启动对应线程(检查索引有效性)
|
||||
if (i < dataReceiveThreads.Count && dataReceiveThreads[i] != null && !dataReceiveThreads[i].IsAlive)
|
||||
{
|
||||
dataReceiveThreads[i].Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("串口打开失败");
|
||||
Debug.Log($"串口打开失败:{ex.ToString()}");
|
||||
}
|
||||
}
|
||||
|
||||
//关闭串口
|
||||
/// <summary>
|
||||
/// 关闭所有串口并停止线程(安全终止,避免Abort)
|
||||
/// </summary>
|
||||
public void ClosePort()
|
||||
{
|
||||
try
|
||||
for (int i = 0; i < serialPorts.Count; i++)
|
||||
{
|
||||
sp.Close();
|
||||
dataReceiveThread.Abort();
|
||||
Debug.Log("串口关闭");
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
Debug.Log("串口关闭失败");
|
||||
// 1. 停止线程(通过标志位)
|
||||
if (i < isThreadRunning.Length)
|
||||
{
|
||||
isThreadRunning[i] = false; // 通知线程退出循环
|
||||
}
|
||||
|
||||
// 等待线程终止(最多1秒)
|
||||
if (i < dataReceiveThreads.Count && dataReceiveThreads[i] != null && dataReceiveThreads[i].IsAlive)
|
||||
{
|
||||
dataReceiveThreads[i].Join(1000);
|
||||
dataReceiveThreads[i] = null;
|
||||
}
|
||||
|
||||
// 2. 关闭串口
|
||||
SerialPort sp = serialPorts[i];
|
||||
if (sp != null && sp.IsOpen)
|
||||
{
|
||||
try
|
||||
{
|
||||
sp.Close();
|
||||
Debug.Log($"串口 {sp.PortName} 关闭成功");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log($"串口 {sp.PortName} 关闭失败:{ex.ToString()}");
|
||||
}
|
||||
serialPorts[i] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Unity 退出相关
|
||||
#region Unity 生命周期
|
||||
private void OnApplicationQuit()
|
||||
{
|
||||
ClosePort();
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
this.Log("为什么关闭了:" + gameObject.name);
|
||||
ClosePort();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有Windows串口并排序
|
||||
/// </summary>
|
||||
public string[] GetAllWindowsCOMPorts()
|
||||
{
|
||||
try
|
||||
{
|
||||
var ports = SerialPort.GetPortNames();
|
||||
// 按COM端口号排序
|
||||
Array.Sort(ports, (a, b) =>
|
||||
{
|
||||
if (int.TryParse(a.Replace("COM", ""), out int numA) &&
|
||||
int.TryParse(b.Replace("COM", ""), out int numB))
|
||||
{
|
||||
return numA.CompareTo(numB);
|
||||
}
|
||||
return string.Compare(a, b);
|
||||
});
|
||||
return ports;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError($"获取串口失败:{e.Message}\n{e.StackTrace}");
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@ -1 +1 @@
|
||||
[{"id":1,"group":"1","txt":"公犬导尿术<br>一、导尿术的适应症与禁忌症<br>1.<color=red>适应</color>症<br>1)<color=red>急性尿潴留</color>。<br>2)需<color=red>采集无菌尿液样本</color>或进行<color=red>膀胱灌注</color>治疗。<br>3)尿道梗阻解除后<color=red>维持排尿通路</color>。<br>2.<color=red>禁忌</color>症<br>1)<color=red>尿道破裂</color>或<color=red>严重损伤</color>(需手术修复)。<br>2)泌尿道<color=red>急性感染未控制</color>(避免逆行感染扩散)。<br>3)<color=red>严重凝血功能障碍</color>。"},{"id":2,"group":"1","txt":"二、公犬泌尿系统解剖要点<br>1.尿道结构<br>1)<color=red>公犬尿道</color>分为<color=red>前列腺前部、前列腺部和阴茎部</color>,导尿管需通过阴茎部尿道(<color=red>长约15-20cm</color>)进入膀胱。<br>2)尿道口位于阴茎龟头顶端,被包皮覆盖,<color=red>操作需向后推包皮暴露</color>。<br>2.体表定位标志<br>1)<color=red>坐骨结节为导尿管体外测量的终点</color>(<color=red>尿道口至坐骨结节距离≈尿道长度</color>)。<br>2)膀胱充盈时可在腹后部触及<color=red>球形隆起</color>(<color=red>叩诊浊音</color>)。"},{"id":3,"group":"1","txt":"三、术前准备工作<br>1.物品准备<br>1)核心器械:<color=red>型号适合的硅胶导尿管</color>、无菌外科手套、20ml注射器、0.9%生理盐水、<color=red>利多卡因凝胶</color>、<color=red>氯己定棉球</color>、无菌持物镊等。<br>2)辅助物品:电动剃毛器(<color=red>备皮范围直径5-10cm</color>)、集尿袋、抗生素软膏、一次性医用垫单、医疗污物桶。<br>2.患犬准备<br>1)镇静镇痛:静脉注射<color=red>右美托咪定(5μg/kg)+布托啡诺(0.3mg/kg)</color>,提供深度镇静与镇痛。<br>2)体位:<color=red>右侧卧位,后肢外展固定,充分暴露会阴部</color>。<br>3)备皮:剃除包皮口周围长毛,清洁皮肤碎屑。<br>3.术者准备<br>七步洗手法洗手,戴无菌口罩、帽子、手套。"},{"id":4,"group":"1","txt":"四、规范操作流程<br>1.清洁消毒<br>1)向后推包皮暴露龟头,<color=red>用20ml生理盐水冲洗包皮腔污物</color>。<br>2)氯己定棉球消毒(2次):<br>(1)第1次:<color=red>由内向外环形清洁包皮口及周围皮肤(半径5-10cm)</color>。<br>(2)第2次:重点<color=red>消毒尿道口及龟头表面</color>。<br>2.尿道麻醉:<color=red>食指涂抹利多卡因凝胶,旋转涂抹龟头及尿道口,等待2-3分钟起效</color>。<br>3.导尿管测量与插入<br>1)测量:<color=red>导尿管头端置于尿道口,尾端拉至坐骨结节处标记刻度</color>(体外预估法)。<br>2)插管<br>(1)<color=red>导尿管外涂抗生素软膏润滑</color>。<br>(2)助手<color=red>向后推包皮暴露阴茎2-5cm</color>,术者持导管沿尿道走向<color=red>缓慢插入</color>(遇阻力勿强行推进)。<br>(3)成功标志:<color=red>尿液流入集尿袋,膀胱逐渐塌陷</color>。<br>4.导尿后处理<br>1)<color=red>尿液引流完毕后,缓慢拔出导尿管</color>。<br>2)脱手套,按医疗废物分类处理物品。"},{"id":5,"group":"1","txt":"五、注意事项与并发症预防<br>1.无菌操作<br>1)手套破损需立即更换。<br>2)消毒棉球限单次单向使用。<br>2.操作技巧<br>1)<color=red>尿道痉挛时暂停操作</color>,<color=red>追加利多卡因凝胶</color>(<color=red>禁用暴力插管</color>)。<br>2)<color=red>导尿管插入深度不超过坐骨结节标记点</color>(<color=red>避免膀胱壁损伤</color>)。<br>3)并发症应对<br>(1)尿道损伤:立即停止操作,评估是否需膀胱穿刺或手术。<br>(2)逆行感染:严格无菌操作,术后监测排尿状态及体温。"},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""},{"id":0,"group":"","txt":""}]
|
||||
[{"id":1,"group":"1","topTxt":"一、导尿术的适应症与禁忌症","txt":"1.<color=red>适应</color>症<br>1)<color=red>急性尿潴留</color>。<br>2)需<color=red>采集无菌尿液样本</color>或进行<color=red>膀胱灌注</color>治疗。<br>3)尿道梗阻解除后<color=red>维持排尿通路</color>。<br>2.<color=red>禁忌</color>症<br>1)<color=red>尿道破裂</color>或<color=red>严重损伤</color>(需手术修复)。<br>2)泌尿道<color=red>急性感染未控制</color>(避免逆行感染扩散)。<br>3)<color=red>严重凝血功能障碍</color>。"},{"id":2,"group":"1","topTxt":"二、公犬泌尿系统解剖要点","txt":"1.尿道结构<br>1)<color=red>公犬尿道</color>分为<color=red>前列腺前部、前列腺部和阴茎部</color>,导尿管需通过阴茎部尿道(<color=red>长约15-20cm</color>)进入膀胱。<br>2)尿道口位于阴茎龟头顶端,被包皮覆盖,<color=red>操作需向后推包皮暴露</color>。<br>2.体表定位标志<br>1)<color=red>坐骨结节为导尿管体外测量的终点</color>(<color=red>尿道口至坐骨结节距离≈尿道长度</color>)。<br>2)膀胱充盈时可在腹后部触及<color=red>球形隆起</color>(<color=red>叩诊浊音</color>)。"},{"id":3,"group":"1","topTxt":"三、术前准备工作","txt":"1.物品准备<br>1)核心器械:<color=red>型号适合的硅胶导尿管</color>、无菌外科手套、20ml注射器、0.9%生理盐水、<color=red>利多卡因凝胶</color>、<color=red>氯己定棉球</color>、无菌持物镊等。<br>2)辅助物品:电动剃毛器(<color=red>备皮范围直径5-10cm</color>)、集尿袋、抗生素软膏、一次性医用垫单、医疗污物桶。<br>2.患犬准备<br>1)镇静镇痛:静脉注射<color=red>右美托咪定(5μg/kg)+布托啡诺(0.3mg/kg)</color>,提供深度镇静与镇痛。"},{"id":4,"group":"1","topTxt":"","txt":"<br>2)体位:<color=red>右侧卧位,后肢外展固定,充分暴露会阴部</color>。<br>3)备皮:剃除包皮口周围长毛,清洁皮肤碎屑。<br>3.术者准备<br>七步洗手法洗手,戴无菌口罩、帽子、手套。"},{"id":5,"group":"1","topTxt":"四、规范操作流程","txt":"1.清洁消毒<br>1)向后推包皮暴露龟头,<color=red>用20ml生理盐水冲洗包皮腔污物</color>。<br>2)氯己定棉球消毒(2次):<br>(1)第1次:<color=red>由内向外环形清洁包皮口及周围皮肤(半径5-10cm)</color>。<br>(2)第2次:重点<color=red>消毒尿道口及龟头表面</color>。<br>2.尿道麻醉:<color=red>食指涂抹利多卡因凝胶,旋转涂抹龟头及尿道口,等待2-3分钟起效</color>。<br>3.导尿管测量与插入<br>1)测量:<color=red>导尿管头端置于尿道口,尾端拉至坐骨结节处标记刻度</color>(体外预估法)。"},{"id":6,"group":"1","topTxt":"","txt":"<br>2)插管<br>(1)<color=red>导尿管外涂抗生素软膏润滑</color>。<br>(2)助手<color=red>向后推包皮暴露阴茎2-5cm</color>,术者持导管沿尿道走向<color=red>缓慢插入</color>(遇阻力勿强行推进)。<br>(3)成功标志:<color=red>尿液流入集尿袋,膀胱逐渐塌陷</color>。<br>4.导尿后处理<br>1)<color=red>尿液引流完毕后,缓慢拔出导尿管</color>。<br>2)脱手套,按医疗废物分类处理物品。"},{"id":7,"group":"1","topTxt":"五、注意事项与并发症预防","txt":"1.无菌操作<br>1)手套破损需立即更换。<br>2)消毒棉球限单次单向使用。<br>2.操作技巧<br>1)<color=red>尿道痉挛时暂停操作</color>,<color=red>追加利多卡因凝胶</color>(<color=red>禁用暴力插管</color>)。<br>2)<color=red>导尿管插入深度不超过坐骨结节标记点</color>(<color=red>避免膀胱壁损伤</color>)。<br>3)并发症应对<br>(1)尿道损伤:立即停止操作,评估是否需膀胱穿刺或手术。<br>(2)逆行感染:严格无菌操作,术后监测排尿状态及体温。"},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""},{"id":0,"group":"","topTxt":"","txt":""}]
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -15,7 +15,7 @@ using UnityThreadingUtils;
|
||||
public class XunFeiWakeup : MonoBehaviour
|
||||
{
|
||||
//唤醒词:小智小智
|
||||
private const string app_id = "appid=0b1fcc5f,word_dir= . ";//appid aiui.dll和msc.dll要配套
|
||||
private const string app_id = "appid=03377640,word_dir= . ";//appid aiui.dll和msc.dll要配套
|
||||
|
||||
private string qivw_session_begin_params/* = "ivw_threshold=0:1450,sst=wakeup,ivw_res_path =fo|" + (Application.streamingAssetsPath + "/wakeupresource.jet").Replace("/", "\\")*/;
|
||||
|
||||
|
||||
@ -7,6 +7,8 @@ namespace DongWuYiXue.DaoNiaoShu
|
||||
public int id;
|
||||
//组
|
||||
public string group;
|
||||
//标题
|
||||
public string topTxt;
|
||||
//内容
|
||||
public string txt;
|
||||
|
||||
|
||||
@ -445,6 +445,33 @@ public List<string> GetListBookPanelDatagroup()
|
||||
|
||||
|
||||
|
||||
public BookPanelData GetBookPanelDatatopTxt(string topTxt)
|
||||
{
|
||||
for (int i = 0; i < allBookPanelData.Count; i++)
|
||||
{
|
||||
if (allBookPanelData[i].topTxt == topTxt)
|
||||
{
|
||||
return allBookPanelData[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<string> GetListBookPanelDatatopTxt()
|
||||
{
|
||||
List<string> res = new List<string>();
|
||||
for (int i = 0; i < allBookPanelData.Count; i++)
|
||||
{
|
||||
if (!res.Contains(allBookPanelData[i].topTxt))
|
||||
{
|
||||
res.Add(allBookPanelData[i].topTxt);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public BookPanelData GetBookPanelDatatxt(string txt)
|
||||
{
|
||||
for (int i = 0; i < allBookPanelData.Count; i++)
|
||||
|
||||
@ -40,7 +40,7 @@ namespace DongWuYiXue.DaoNiaoShu
|
||||
}
|
||||
public void ShowBook(string group)
|
||||
{
|
||||
if(bookPro!=null)
|
||||
if (bookPro != null)
|
||||
{
|
||||
Destroy(bookPro.gameObject);
|
||||
bookPro = null;
|
||||
@ -55,29 +55,31 @@ namespace DongWuYiXue.DaoNiaoShu
|
||||
if (!shangxiahuadong)
|
||||
{
|
||||
shangxiahuadong = true;
|
||||
bookPro.transform.FindFirst("上下滑动动画").SetActive(true);
|
||||
//bookPro.transform.FindFirst("上下滑动动画").SetActive(true);
|
||||
}
|
||||
});
|
||||
bookPanelDatas = GetModel<GameModel>().excelData.allBookPanelData.FindAll(e=>e.group == group);
|
||||
bookPanelDatas = GetModel<GameModel>().excelData.allBookPanelData.FindAll(e => e.group == group);
|
||||
for (int i = 0; i < bookPanelDatas.Count; i++)
|
||||
{
|
||||
if (i % 2 != 0 && i > 0)
|
||||
{
|
||||
AddPaper_Txt(bookPro, bookPanelDatas[i - 1].txt.Replace("<br>","\n"), bookPanelDatas[i].txt.Replace("<br>", "\n"), i,i+1);
|
||||
AddPaper_Txt(bookPro, bookPanelDatas[i - 1].txt.Replace("<br>", "\n"), bookPanelDatas[i - 1].topTxt, bookPanelDatas[i].txt.Replace("<br>", "\n"), bookPanelDatas[i].topTxt, i, i + 1);
|
||||
}
|
||||
if(i == (bookPanelDatas.Count - 1) && (i % 2 == 0))
|
||||
if (i == (bookPanelDatas.Count - 1) && (i % 2 == 0))
|
||||
{
|
||||
AddPaper_Txt(bookPro, bookPanelDatas[i].txt.Replace("<br>", "\n"), "",i+1,i+2);
|
||||
AddPaper_Txt(bookPro, bookPanelDatas[i].txt.Replace("<br>", "\n"), bookPanelDatas[i].topTxt, "", "", i + 1, i + 2);
|
||||
}
|
||||
}
|
||||
AddPaper_FengMian(bookPro);
|
||||
}
|
||||
public void AddPaper_Txt(BookPro book,string frontTxt,string backTxt,int frontNum,int backNum)
|
||||
public void AddPaper_Txt(BookPro book, string frontTxt, string frontTopText, string backTxt, string backTopText, int frontNum, int backNum)
|
||||
{
|
||||
GameObject frontPage = Instantiate(FrontPagePrefab);
|
||||
frontPage.FindFirst<Text>("bookTopText").text = frontTopText;
|
||||
frontPage.FindFirst<Text>("bookText").text = frontTxt;
|
||||
frontPage.FindFirst<Text>("numText").text = frontNum.ToString();
|
||||
GameObject backPage = Instantiate(BackPagePrefab);
|
||||
backPage.FindFirst<Text>("bookTopText").text = backTopText;
|
||||
backPage.FindFirst<Text>("bookText").text = backTxt;
|
||||
backPage.FindFirst<Text>("numText").text = backNum.ToString();
|
||||
frontPage.transform.SetParent(book.transform, false);
|
||||
|
||||
BIN
msc/069ff7edfa99257b1e2ff25853437b0e/kivw.dat
Normal file
BIN
msc/069ff7edfa99257b1e2ff25853437b0e/kivw.dat
Normal file
Binary file not shown.
@ -1,3 +1,3 @@
|
||||
2025/11/28 09:18:21
|
||||
80580f9047ae7f4bd0325a05c2f5cdaa
|
||||
U}õ•pu<^Ò<ó^‡oÞJ«Œ¼“e‰Çƒ©#=bãC]É㋽&KáJ|·ÈYøÚi8Û/s(dˆˆíTñ{¦€½zuˆã+ktïL3Pß+ö~׫8Þ|Ê?”Øö¹˜×=Vi(H_üåFê!.8ƒ©lr[us(‚ºò¨ÓÅÜ©ð1T÷
|
||||
2026/01/04 14:58:38
|
||||
3dea935fd3a1ead6af9393bb07c8f238
|
||||
/ž£…tkŠí#±xgüb‘ ?ÔÙÓÎqøäCE¸Tè
åmiøœ<C3B8>#ümú0‘h%xrqÎ2ΧºBä'`.Ãâ<C383> Þ¯+_ðtÄ4ïä\dÞAv±„•¾j5N•ùÿLÇ»Úh<¨ùbš»8Â%’¥—i>=»ù¦¨¶‡úœkÃÉÜ!ûеWÛ£ðN—ú¨¿|J>ÚlD•ú±¾,Ê.4<EFBFBD>Ú
|
||||
Loading…
x
Reference in New Issue
Block a user