NodeScript+ 导入了个 UI Extend

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-05-23 21:05:16 +08:00
parent 7ea1f1d8c3
commit 51878f15ae
531 changed files with 198095 additions and 144473 deletions

3
.gitignore vendored
View File

@@ -64,6 +64,9 @@ sysinfo.txt
*.app *.app
/[Aa]ssets/FR2_Cache.asset /[Aa]ssets/FR2_Cache.asset
#这玩意好大 #这玩意好大
# Claude Code
.claude/
# Crashlytics generated file # Crashlytics generated file
crashlytics-build.properties crashlytics-build.properties

7
Assets/Assets.sln.meta Normal file
View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 28802a2f6f0ff2942bd2a248b9b68960
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 88f0993afef43b34eb23a79fbdd94e9b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -35,12 +35,12 @@ MonoBehaviour:
- Boxophobic.AtmosphericHeightFog.Runtime - Boxophobic.AtmosphericHeightFog.Runtime
- Boxophobic.Utils.Scripts - Boxophobic.Utils.Scripts
- CW.Common - CW.Common
- IchniAssembly
- IngameDebugConsole.Runtime - IngameDebugConsole.Runtime
- LeanCommon - LeanCommon
- LeanPool - LeanPool
- UniRx - UniRx
- UniRx.Examples - UniRx.Examples
- UnityUIExtensions
showAdvancedSettings: 0 showAdvancedSettings: 0
addMgrToSceneAutomatically: 0 addMgrToSceneAutomatically: 0
autoUpdateReferences: 1 autoUpdateReferences: 1

File diff suppressed because one or more lines are too long

View File

@@ -163,6 +163,8 @@ MonoBehaviour:
type: 3} type: 3}
QuickMoveObj: {fileID: 2260653761532832587, guid: dba2d8dbaab1439469ac4924d33e3397, QuickMoveObj: {fileID: 2260653761532832587, guid: dba2d8dbaab1439469ac4924d33e3397,
type: 3} type: 3}
NodeEditor: {fileID: 6091547238259645747, guid: 55d0ca39526c5e94ebac2e6da0c8d80c,
type: 3}
defaultBackground: {fileID: 21300000, guid: fc6c02e75b66345c29e8a25e2e2bda9c, type: 3} defaultBackground: {fileID: 21300000, guid: fc6c02e75b66345c29e8a25e2e2bda9c, type: 3}
defaultSkyboxMaterial: {fileID: 2100000, guid: 06a20df987b317044a05ea694c976948, defaultSkyboxMaterial: {fileID: 2100000, guid: 06a20df987b317044a05ea694c976948,
type: 2} type: 2}

View File

@@ -267,6 +267,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 5057024943373372034} - component: {fileID: 5057024943373372034}
- component: {fileID: 2755395169887967930}
m_Layer: 5 m_Layer: 5
m_Name: AddNewButton m_Name: AddNewButton
m_TagString: Untagged m_TagString: Untagged
@@ -292,5 +293,25 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 50} m_SizeDelta: {x: 332.5, y: 50}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2755395169887967930
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9105660174245163102}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 300
m_MinHeight: 50
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 287322283d167ef4083da8ed178d7034
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,964 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &82863286894781506
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1709764634161262913}
- component: {fileID: 2170045770562689381}
- component: {fileID: 2957736523211978714}
m_Layer: 0
m_Name: Item Checkmark
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1709764634161262913
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 82863286894781506}
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: 7004105521081339837}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 10, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2170045770562689381
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 82863286894781506}
m_CullTransparentMesh: 1
--- !u!114 &2957736523211978714
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 82863286894781506}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10901, guid: 0000000000000000f000000000000000, type: 0}
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 &1054092299838318117
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3362122159744346545}
- component: {fileID: 2203795012402217067}
- component: {fileID: 4261312571326291121}
m_Layer: 0
m_Name: Label
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3362122159744346545
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1054092299838318117}
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: 5486239791980942039}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -7.5, y: -0.5}
m_SizeDelta: {x: -35, y: -13}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2203795012402217067
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1054092299838318117}
m_CullTransparentMesh: 1
--- !u!114 &4261312571326291121
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1054092299838318117}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: Option A
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 19.3
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &1560090685449819934
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7004105521081339837}
- component: {fileID: 8660453368859358330}
m_Layer: 0
m_Name: Item
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7004105521081339837
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1560090685449819934}
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: 1081585093984805606}
- {fileID: 1709764634161262913}
- {fileID: 1650735131562294154}
m_Father: {fileID: 3443758875486852539}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0.0000023841858, y: 34.1}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8660453368859358330
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1560090685449819934}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Toggle
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1621498239027635291}
toggleTransition: 1
graphic: {fileID: 2957736523211978714}
m_Group: {fileID: 0}
onValueChanged:
m_PersistentCalls:
m_Calls: []
m_IsOn: 1
--- !u!1 &1680133537779878757
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5547965212101110332}
- component: {fileID: 4191086039604730814}
- component: {fileID: 7204498259804686471}
m_Layer: 0
m_Name: Arrow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5547965212101110332
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1680133537779878757}
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: 5486239791980942039}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: -15, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4191086039604730814
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1680133537779878757}
m_CullTransparentMesh: 1
--- !u!114 &7204498259804686471
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1680133537779878757}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10915, guid: 0000000000000000f000000000000000, type: 0}
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 &1711088782094418621
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3217331204570803645}
- component: {fileID: 3663708719705923414}
- component: {fileID: 2920068684909590118}
- component: {fileID: 8147382377469268337}
m_Layer: 0
m_Name: Template
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3217331204570803645
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1711088782094418621}
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: 810477152589261651}
m_Father: {fileID: 5486239791980942039}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 150}
m_Pivot: {x: 0.5, y: 1}
--- !u!222 &3663708719705923414
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1711088782094418621}
m_CullTransparentMesh: 1
--- !u!114 &2920068684909590118
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1711088782094418621}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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!114 &8147382377469268337
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1711088782094418621}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ScrollRect
m_Content: {fileID: 3443758875486852539}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 2
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 1
m_Viewport: {fileID: 810477152589261651}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 0}
m_HorizontalScrollbarVisibility: 0
m_VerticalScrollbarVisibility: 2
m_HorizontalScrollbarSpacing: 0
m_VerticalScrollbarSpacing: -3
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2412732760625569581
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1081585093984805606}
- component: {fileID: 939330925110964853}
- component: {fileID: 1621498239027635291}
m_Layer: 0
m_Name: Item Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1081585093984805606
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2412732760625569581}
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: 7004105521081339837}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.000030517578, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &939330925110964853
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2412732760625569581}
m_CullTransparentMesh: 1
--- !u!114 &1621498239027635291
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2412732760625569581}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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: 0}
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 &4681842335368807895
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5486239791980942039}
- component: {fileID: 6954806442107970263}
- component: {fileID: 6590960778914629322}
- component: {fileID: 6352137348860116155}
m_Layer: 0
m_Name: Dropdown
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5486239791980942039
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4681842335368807895}
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: 3362122159744346545}
- {fileID: 5547965212101110332}
- {fileID: 3217331204570803645}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 109.26, y: 36}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6954806442107970263
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4681842335368807895}
m_CullTransparentMesh: 1
--- !u!114 &6590960778914629322
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4681842335368807895}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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!114 &6352137348860116155
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4681842335368807895}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TMP_Dropdown
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 6590960778914629322}
m_Template: {fileID: 3217331204570803645}
m_CaptionText: {fileID: 4261312571326291121}
m_CaptionImage: {fileID: 0}
m_Placeholder: {fileID: 0}
m_ItemText: {fileID: 2407009501540292511}
m_ItemImage: {fileID: 0}
m_Value: 0
m_MultiSelect: 0
m_Options:
m_Options:
- m_Text: Option A
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_Text: Option B
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_Text: Option C
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
m_AlphaFadeSpeed: 0.15
--- !u!1 &6545639557362248841
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3443758875486852539}
m_Layer: 0
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3443758875486852539
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6545639557362248841}
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: 7004105521081339837}
m_Father: {fileID: 810477152589261651}
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: 28}
m_Pivot: {x: 0.5, y: 1}
--- !u!1 &8005258512300585202
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1650735131562294154}
- component: {fileID: 7760809877735888226}
- component: {fileID: 2407009501540292511}
m_Layer: 0
m_Name: Item Label
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1650735131562294154
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8005258512300585202}
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: 7004105521081339837}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 5, y: -0.4999981}
m_SizeDelta: {x: -30, y: -3}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7760809877735888226
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8005258512300585202}
m_CullTransparentMesh: 1
--- !u!114 &2407009501540292511
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8005258512300585202}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: Option A
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 27.8
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 7.79
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8880113283847965645
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 810477152589261651}
- component: {fileID: 7664388476214949154}
- component: {fileID: 4118694975536929718}
- component: {fileID: 4821167584285562036}
m_Layer: 0
m_Name: Viewport
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &810477152589261651
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8880113283847965645}
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: 3443758875486852539}
m_Father: {fileID: 3217331204570803645}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -8, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &7664388476214949154
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8880113283847965645}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask
m_ShowMaskGraphic: 0
--- !u!222 &4118694975536929718
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8880113283847965645}
m_CullTransparentMesh: 1
--- !u!114 &4821167584285562036
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8880113283847965645}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10917, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ee774914fec90eb469a4484a6d367804
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,230 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1511618988303119173
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8659332950650682692}
- component: {fileID: 226170325915869555}
- component: {fileID: 5856798800522582644}
m_Layer: 0
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8659332950650682692
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511618988303119173}
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: 6771339006655316496}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 18, y: -18}
m_SizeDelta: {x: 36, y: 36}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &226170325915869555
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511618988303119173}
m_CullTransparentMesh: 1
--- !u!114 &5856798800522582644
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1511618988303119173}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, 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: c50c7c9c8871c91409e4470d3c721189, type: 3}
m_Type: 1
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 &1982491914267806703
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6771339006655316496}
- component: {fileID: 1525502865680152704}
- component: {fileID: 4816966882498123501}
- component: {fileID: 4076004446672212327}
m_Layer: 0
m_Name: IN
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6771339006655316496
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1982491914267806703}
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: 8659332950650682692}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 29.935, y: -20.11}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1525502865680152704
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1982491914267806703}
m_CullTransparentMesh: 1
--- !u!114 &4816966882498123501
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1982491914267806703}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: A
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 36, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &4076004446672212327
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1982491914267806703}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter
m_HorizontalFit: 2
m_VerticalFit: 2

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d3b6d8ae350f6e64fa36b94b021a99b1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,527 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1390561808239447781
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2659780073365436884}
- component: {fileID: 324852340044291176}
- component: {fileID: 266478102657213591}
- component: {fileID: 4395578133455964370}
m_Layer: 0
m_Name: Placeholder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2659780073365436884
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1390561808239447781}
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: 4994371786269107151}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &324852340044291176
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1390561808239447781}
m_CullTransparentMesh: 1
--- !u!114 &266478102657213591
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1390561808239447781}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: Enter text...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 2150773298
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 2
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &4395578133455964370
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1390561808239447781}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &2123904644115912225
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7327372015316484858}
- component: {fileID: 5672882645367788189}
- component: {fileID: 6090549573183465193}
m_Layer: 0
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7327372015316484858
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2123904644115912225}
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: 4994371786269107151}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5672882645367788189
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2123904644115912225}
m_CullTransparentMesh: 1
--- !u!114 &6090549573183465193
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2123904644115912225}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: "\u200B"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 20.55
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 3
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &2991020675703354371
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4994371786269107151}
- component: {fileID: 2061605977340211594}
m_Layer: 0
m_Name: Text Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4994371786269107151
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2991020675703354371}
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: 2659780073365436884}
- {fileID: 7327372015316484858}
m_Father: {fileID: 3361567497959364912}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -0.5}
m_SizeDelta: {x: -20, y: -13}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2061605977340211594
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2991020675703354371}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RectMask2D
m_Padding: {x: -8, y: -5, z: -8, w: -5}
m_Softness: {x: 0, y: 0}
--- !u!1 &4283138263180720856
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3361567497959364912}
- component: {fileID: 111465765883541653}
- component: {fileID: 2294918046086586719}
- component: {fileID: 3242109441238352385}
m_Layer: 0
m_Name: InputField (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3361567497959364912
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4283138263180720856}
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: 4994371786269107151}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 109.26, y: 36}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &111465765883541653
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4283138263180720856}
m_CullTransparentMesh: 1
--- !u!114 &2294918046086586719
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4283138263180720856}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
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: 10911, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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!114 &3242109441238352385
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4283138263180720856}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TMP_InputField
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2294918046086586719}
m_TextViewport: {fileID: 4994371786269107151}
m_TextComponent: {fileID: 6090549573183465193}
m_Placeholder: {fileID: 266478102657213591}
m_VerticalScrollbar: {fileID: 0}
m_VerticalScrollbarEventHandler: {fileID: 0}
m_LayoutGroup: {fileID: 0}
m_ScrollSensitivity: 1
m_ContentType: 0
m_InputType: 0
m_AsteriskChar: 42
m_KeyboardType: 0
m_LineType: 0
m_HideMobileInput: 0
m_HideSoftKeyboard: 0
m_CharacterValidation: 0
m_RegexValue:
m_GlobalPointSize: 36
m_CharacterLimit: 0
m_OnEndEdit:
m_PersistentCalls:
m_Calls: []
m_OnSubmit:
m_PersistentCalls:
m_Calls: []
m_OnSelect:
m_PersistentCalls:
m_Calls: []
m_OnDeselect:
m_PersistentCalls:
m_Calls: []
m_OnTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnEndTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
m_OnTouchScreenKeyboardStatusChanged:
m_PersistentCalls:
m_Calls: []
m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_CustomCaretColor: 0
m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
m_Text:
m_CaretBlinkRate: 0.85
m_CaretWidth: 1
m_ReadOnly: 0
m_RichText: 1
m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_OnFocusSelectAll: 1
m_ResetOnDeActivation: 1
m_KeepTextSelectionVisible: 0
m_RestoreOriginalTextOnEscape: 1
m_isRichTextEditingAllowed: 0
m_LineLimit: 0
isAlert: 0
m_InputValidator: {fileID: 0}
m_ShouldActivateOnSelect: 1

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e64d4b6c88d9d47488d476cf81f30f27
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,426 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &387393856836735129
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7556955190755933808}
- component: {fileID: 2814534042963124076}
- component: {fileID: 6507936905540603302}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7556955190755933808
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 387393856836735129}
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: 2880595889031726545}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2814534042963124076
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 387393856836735129}
m_CullTransparentMesh: 0
--- !u!114 &6507936905540603302
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 387393856836735129}
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: 0.18565324, g: 0.18565324, b: 0.163, a: 0.39607844}
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: 951352f31055aae46b6e9786313c632d, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 5
--- !u!1 &5577872369427388259
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2491246242046381195}
- component: {fileID: 69861377592666494}
- component: {fileID: 3832966658183658279}
m_Layer: 5
m_Name: Background (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2491246242046381195
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5577872369427388259}
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: 2880595889031726545}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &69861377592666494
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5577872369427388259}
m_CullTransparentMesh: 0
--- !u!114 &3832966658183658279
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5577872369427388259}
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: 0.44705883}
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: 6b07019707eaa514483b82a007127713, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 5
--- !u!1 &6091547238259645747
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2880595889031726545}
- component: {fileID: 7405104467736610511}
m_Layer: 5
m_Name: Node Window
m_TagString: Untagged
m_Icon: {fileID: 2800000, guid: f87b5805002ec9649bcb1b96d8a16ba9, type: 3}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2880595889031726545
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6091547238259645747}
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: 7556955190755933808}
- {fileID: 2491246242046381195}
- {fileID: 3202466582045695497}
- {fileID: 8475563372351313221}
- {fileID: 416700662159144857}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -5.550293, y: 85.44995}
m_SizeDelta: {x: -1339.501, y: -376.9}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &7405104467736610511
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6091547238259645747}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6cdb8cc0b3fb21f49b1a761000205509, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NodeManager
allNodes: []
nodeObjectPrefab: {fileID: 6709114187421732478, guid: 5ba4ce13e345fc6488c516cc37c35015,
type: 3}
wireThickness: 5
canvasArea: {fileID: 3202466582045695497}
refCamera: {fileID: 0}
contextMenuRoot: {fileID: 416700662159144857}
NodeArea: {fileID: 8475563372351313221}
contextMenuItemPrefab: {fileID: 9105660174245163102, guid: fa15f9e67ebc54136be977a5f3dee634,
type: 3}
uiInputPrefab: {fileID: 4283138263180720856, guid: e64d4b6c88d9d47488d476cf81f30f27,
type: 3}
--- !u!1 &6105481023126475246
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8475563372351313221}
m_Layer: 5
m_Name: GameObject (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8475563372351313221
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6105481023126475246}
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: 2880595889031726545}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &7016267293831768418
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3202466582045695497}
- component: {fileID: 351883452891975269}
- component: {fileID: 8409166164882657371}
- component: {fileID: 1000663241356510047}
m_Layer: 5
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3202466582045695497
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016267293831768418}
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: 2880595889031726545}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -30}
m_SizeDelta: {x: 0, y: -60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &351883452891975269
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016267293831768418}
m_CullTransparentMesh: 0
--- !u!114 &8409166164882657371
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016267293831768418}
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: 0, g: 0, b: 0, a: 0.39215687}
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: 5e16c7aea118d68498053518146c9cf9, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 5
--- !u!114 &1000663241356510047
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016267293831768418}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6cdb8cc0b3fb21f49b1a761000205509, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NodeManager
allNodes: []
nodeObjectPrefab: {fileID: 0}
wireThickness: 5
canvasArea: {fileID: 0}
refCamera: {fileID: 0}
contextMenuRoot: {fileID: 0}
NodeArea: {fileID: 0}
contextMenuItemPrefab: {fileID: 0}
uiInputPrefab: {fileID: 0}
--- !u!1 &7165519357249783236
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 416700662159144857}
- component: {fileID: 756442430084381135}
- component: {fileID: 2657342246189562635}
m_Layer: 5
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &416700662159144857
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7165519357249783236}
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: 2880595889031726545}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -30}
m_SizeDelta: {x: 350, y: 850}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &756442430084381135
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7165519357249783236}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 0
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &2657342246189562635
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7165519357249783236}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter
m_HorizontalFit: 1
m_VerticalFit: 1

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 55d0ca39526c5e94ebac2e6da0c8d80c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5ba4ce13e345fc6488c516cc37c35015
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,230 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &786711617859700626
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5760373814693140587}
- component: {fileID: 1693453407129975681}
- component: {fileID: 3675972585655872526}
m_Layer: 0
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5760373814693140587
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 786711617859700626}
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: 644833113102702400}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -18, y: -18}
m_SizeDelta: {x: 36, y: 36}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1693453407129975681
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 786711617859700626}
m_CullTransparentMesh: 1
--- !u!114 &3675972585655872526
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 786711617859700626}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, 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: c50c7c9c8871c91409e4470d3c721189, type: 3}
m_Type: 1
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 &2009937399821704551
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 644833113102702400}
- component: {fileID: 5178026511363294150}
- component: {fileID: 6686407532977347685}
- component: {fileID: 4143938553789986431}
m_Layer: 0
m_Name: OUT
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &644833113102702400
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009937399821704551}
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: 5760373814693140587}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 29.935, y: -20.11}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5178026511363294150
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009937399821704551}
m_CullTransparentMesh: 1
--- !u!114 &6686407532977347685
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009937399821704551}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
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_text: A
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 4
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 38.87, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &4143938553789986431
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009937399821704551}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter
m_HorizontalFit: 2
m_VerticalFit: 2

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 87e4ec14fb3f1ed42ad998feb07506f5
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 55fe9f4dfb9631f4381b4cf94f831d06
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -6,6 +6,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Ichni.NodeScript;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
using Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse; using Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse;
@@ -383,7 +384,7 @@ namespace Ichni.Editor
if (hold.track.trackPathSubmodule.pathNodeList.Count > 2) if (hold.track.trackPathSubmodule.pathNodeList.Count > 2)
{ {
LogWindow.Log("the Hold may not be split currently", Color.yellow); LogWindow.Log("the Hold may not be split currently", Color.yellow);
return;
} }
hold.UpdateNoteInMovableTrack(CoreServices.TimeProvider.SongTime); hold.UpdateNoteInMovableTrack(CoreServices.TimeProvider.SongTime);
Track NewTrack = Track.GenerateElement(hold.elementName + "_SplitTrack", Guid.NewGuid(), new List<string>(), true, parentTrack); Track NewTrack = Track.GenerateElement(hold.elementName + "_SplitTrack", Guid.NewGuid(), new List<string>(), true, parentTrack);
@@ -425,7 +426,7 @@ namespace Ichni.Editor
if (track.trackPathSubmodule.pathNodeList.Count > 2) if (track.trackPathSubmodule.pathNodeList.Count > 2)
{ {
LogWindow.Log("the Hold may not be split currently", Color.yellow); LogWindow.Log("the Hold may not be split currently", Color.yellow);
return;
} }
foreach (var hold in holds) foreach (var hold in holds)
@@ -1135,6 +1136,78 @@ namespace Ichni.Editor
} }
#endregion #endregion
#region NodeScript Console Commands ()
/// <summary>
/// 新建 NodeScript 编辑器,从当前选中 GameElement 开始 Init
/// </summary>
public static void newNode()
{
if (NodeManager.Instance == null)
{
var prefab = EditorManager.instance.basePrefabs.NodeEditor;
if (prefab == null)
{
LogWindow.Log("NodeEditor prefab is null, check BasePrefabsCollection!", Color.red);
return;
}
var go = UnityEngine.Object.Instantiate(prefab,
EditorManager.instance.uiManager.WindowsCanvas.gameObject.transform);
var mgr = go.GetComponent<NodeManager>();
if (mgr != null && EditorManager.instance.operationManager.currentSelectedElements.Count > 0)
mgr.Init(EditorManager.instance.operationManager.currentSelectedElements[0]);
LogWindow.Log("NodeScript Editor created.", Color.green);
}
else
{
UnityEngine.Object.Destroy(NodeManager.Instance.gameObject);
LogWindow.Log("NodeScript Editor destroyed.", Color.yellow);
}
}
/// <summary>
/// 另存为指定文件名到 StreamingAssets/NodeScript/{name}.json
/// </summary>
public static void saveNode(string name)
{
if (NodeManager.Instance == null)
{
LogWindow.Log("No NodeScript Editor active. Use newNode first.", Color.red);
return;
}
NodeManager.Instance.SaveToFile(name);
LogWindow.Log($"NodeScript graph saved as {name}.", Color.green);
}
/// <summary>
/// 从 StreamingAssets/NodeScript/{name}.json 读取 NodeScript 图
/// </summary>
public static void loadNode(string name)
{
if (string.IsNullOrEmpty(name))
{
LogWindow.Log("Usage: loadNode <name> — loads StreamingAssets/NodeScript/<name>.json", Color.yellow);
return;
}
// 确保 NodeManager 存在
if (NodeManager.Instance == null)
{
var prefab = EditorManager.instance.basePrefabs.NodeEditor;
if (prefab == null)
{
LogWindow.Log("NodeEditor prefab is null, check BasePrefabsCollection!", Color.red);
return;
}
UnityEngine.Object.Instantiate(prefab,
EditorManager.instance.uiManager.WindowsCanvas.gameObject.transform);
}
NodeManager.Instance.LoadFromFile(name);
LogWindow.Log($"NodeScript graph loaded from {name}.", Color.green);
}
} }
} }
#endregion

View File

@@ -5,6 +5,7 @@ using System.IO;
using System.Linq; using System.Linq;
using Ichni; using Ichni;
using Ichni.Editor; using Ichni.Editor;
using Ichni.NodeScript;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
@@ -18,6 +19,18 @@ public class consoleOnMono : MonoBehaviour
{ {
StartCoroutine(read()); StartCoroutine(read());
} }
if (Keyboard.current.f3Key.wasPressedThisFrame)
{
if (NodeManager.Instance == null)
{
Instantiate(EditorManager.instance.basePrefabs.NodeEditor,
EditorManager.instance.uiManager.WindowsCanvas.gameObject.transform);
if (EditorManager.instance.operationManager.currentSelectedElements.Count > 0)
NodeManager.Instance.Init(EditorManager.instance.operationManager.currentSelectedElements[0]);
}
else Destroy(NodeManager.Instance.gameObject);
}
} }
public IEnumerator read() public IEnumerator read()
{ {

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 903817bad09ed754ca52d7ea5ba15e97
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,37 @@
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Ichni.NodeScript
{
public class ConnectorSlot : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
public IInput connectorIn;
public IOutput connectorOut;
public bool isInput;
public NodeObject ownerNode;
public RectTransform connectorRect;
void Awake() { connectorRect = GetComponent<RectTransform>(); }
public void OnPointerDown(PointerEventData e) => NodeManager.Instance.StartWireDrag(this, e);
public void OnDrag(PointerEventData e) => NodeManager.Instance.UpdateWireDrag(e);
public void OnPointerUp(PointerEventData e) => NodeManager.Instance.EndWireDrag(e);
/// <summary>InputAny / OutputAny 类型锁定后刷新连接点颜色</summary>
public void RefreshAppearance()
{
var img = GetComponentInChildren<Image>();
if (img == null) return;
if (isInput && connectorIn != null)
{
img.color = connectorIn.ConnectorColor;
}
else if (!isInput && connectorOut != null)
{
img.color = connectorOut.ConnectorColor;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4d5e4efd89e8c6041bdcdeae97e94191

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 36b55b766114d5d4bb9cfb9f673bbbae
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,280 @@
using System;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
namespace Ichni.NodeScript
{
// ==================== 图入口 ====================
public class NodeStart : NodeBase
{
public Output<Signal> exec = new("Exec");
public Output<GameElement> element = new("Element");
[NonSerialized] public GameElement boundElement;
public override LoopResult Loop()
{
exec.SetValue(Signal.Default);
element.SetValue(boundElement);
return LoopResult.Complete();
}
}
public class NodeEntry : NodeBase
{
public Output<Signal> exec = new("Exec");
public override LoopResult Loop()
{
exec.SetValue(Signal.Default);
return LoopResult.Complete();
}
}
// ==================== 统一多类型数学运算 ====================
public class NodeMath : NodeBase
{
enum Op { Add, Subtract, Multiply, Divide }
Op _op;
public InputAny a = new("A");
public InputAny b = new("B") { IsFixedType = true };
public OutputAny result = new("Result");
static readonly Dictionary<(Type, Op), Func<object, object, object>> _ops = new()
{
[(typeof(float), Op.Add)] = (x, y) => (float)x + (float)y,
[(typeof(float), Op.Subtract)] = (x, y) => (float)x - (float)y,
[(typeof(float), Op.Multiply)] = (x, y) => (float)x * (float)y,
[(typeof(float), Op.Divide)] = (x, y) => (float)y != 0f ? (float)x / (float)y : 0f,
[(typeof(int), Op.Add)] = (x, y) => (int)x + (int)y,
[(typeof(int), Op.Subtract)] = (x, y) => (int)x - (int)y,
[(typeof(int), Op.Multiply)] = (x, y) => (int)x * (int)y,
[(typeof(int), Op.Divide)] = (x, y) => (int)y != 0 ? (int)x / (int)y : 0,
[(typeof(Vector2), Op.Add)] = (x, y) => (Vector2)x + (Vector2)y,
[(typeof(Vector2), Op.Subtract)] = (x, y) => (Vector2)x - (Vector2)y,
[(typeof(Vector2), Op.Multiply)] = (x, y) => (Vector2)x * (float)y,
[(typeof(Vector2), Op.Divide)] = (x, y) => (float)y != 0f ? (Vector2)x / (float)y : Vector2.zero,
[(typeof(Vector3), Op.Add)] = (x, y) => (Vector3)x + (Vector3)y,
[(typeof(Vector3), Op.Subtract)] = (x, y) => (Vector3)x - (Vector3)y,
[(typeof(Vector3), Op.Multiply)] = (x, y) => (Vector3)x * (float)y,
[(typeof(Vector3), Op.Divide)] = (x, y) => (float)y != 0f ? (Vector3)x / (float)y : Vector3.zero,
[(typeof(Color), Op.Add)] = (x, y) => (Color)x + (Color)y,
[(typeof(Color), Op.Subtract)] = (x, y) => (Color)x - (Color)y,
[(typeof(Color), Op.Multiply)] = (x, y) => (Color)x * (float)y,
[(typeof(string), Op.Add)] = (x, y) => (string)x + (string)y,
};
public override void BuildUI(NodeUIBuilder ui)
{
ui.Dropdown("Op", new[] { "+", "-", "*", "/" }, 0, i => _op = (Op)i);
}
public override LoopResult Loop()
{
if (!a.IsConnected && !b.IsConnected) return LoopResult.Complete();
if (!EnsureInputsReady(out var hang)) return hang;
var type = a.DataType ?? b.DataType ?? typeof(float);
// 单输入 → 直通
if (!a.IsConnected) { result.SetValueRaw(SafeGet(b)); return LoopResult.Complete(); }
if (!b.IsConnected) { result.SetValueRaw(SafeGet(a)); return LoopResult.Complete(); }
// 双输入 → LUT 运算
var key = (type, _op);
if (_ops.TryGetValue(key, out var func))
result.SetValueRaw(func(SafeGet(a), SafeGet(b)));
else
result.SetValueRaw(SafeGet(a)); // fallback: 直通 a
return LoopResult.Complete();
}
static object SafeGet(InputAny input)
{
try { return input.GetValue(); }
catch { return null; }
}
}
// ==================== 分支 ====================
public class NodeBranch : NodeBase
{
public Input<Signal> exec = new("Exec");
public InputAny condition = new("Condition");
public Output<Signal> trueOut = new("True");
public Output<Signal> falseOut = new("False");
public override LoopResult Loop()
{
if (!exec.IsConnected) return LoopResult.Complete();
if (!EnsureInputsReady(out var hang)) return hang;
float cond = condition.IsConnected ? condition.GetValue<float>() : 0f;
// int → float 兼容
if (condition.DataType == typeof(int))
cond = condition.GetValue<int>();
if (cond > 0f) trueOut.SetValue(Signal.Default);
else falseOut.SetValue(Signal.Default);
return LoopResult.Complete();
}
}
// ==================== For 循环多周期状态机Rect 容器留待 Phase 4 ====================
public class NodeForLoop : NodeBase
{
public Input<Signal> exec = new("Exec");
public InputAny count = new("Count");
public Output<Signal> loopBody = new("LoopBody");
public Output<int> index = new("Index");
public Output<Signal> completed = new("Completed");
int _current;
int _total;
bool _started;
bool _waiting;
public override LoopResult Loop()
{
if (!exec.IsConnected) return LoopResult.Complete();
if (!_started && !EnsureInputsReady(out var hang)) return hang;
if (!_started)
{
_total = count.IsConnected ? count.GetValue<int>() : 0;
_current = 0;
_started = true;
}
// 空转一周期让下游消费上一轮输出
if (_waiting) { _waiting = false; return LoopResult.Wait(); }
if (_current < _total)
{
index.SetValue(_current);
loopBody.SetValue(Signal.Default);
_current++;
_waiting = true;
return LoopResult.Repeat();
}
_started = false;
completed.SetValue(Signal.Default);
return LoopResult.Complete();
}
}
// ==================== GameElement 操作 ====================
public class NodeGameElement : NodeBase
{
public Input<Signal> exec = new("Exec");
public Input<GameElement> RootNode = new("Root");
public Input<GameElement> SourceNode = new("Source");
public Output<GameElement> newElement = new("OutPut");
public Output<Signal> completed = new("Done");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var root = RootNode.Value;
var source = SourceNode.Value;
if (source == null)
{
ElementFolder.GenerateElement("Folder(Cp)", Guid.NewGuid(), new List<string>(), true, RootNode.IsConnected ? root : null);
}
else if (root != null)
{
EditorManager.instance.operationManager.CopyPasteDeleteModule.CopyElement(source);
EditorManager.instance.operationManager.CopyPasteDeleteModule.PasteElement(root);
}
completed.SetValue(Signal.Default);
return LoopResult.Complete();
}
}
public class NodeGetTransform : NodeBase
{
public Input<GameElement> element = new("Element");
public Output<Vector3> position = new("Pos"), rotation = new("Rot"), scale = new("Scl");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
if (element.Value is IHaveTransformSubmodule ts)
{
position.SetValue(ts.transformSubmodule.originalPosition);
rotation.SetValue(ts.transformSubmodule.originalEulerAngles);
scale.SetValue(ts.transformSubmodule.originalScale);
}
return LoopResult.Complete();
}
}
public class NodeSetTransform : NodeBase
{
public Input<Signal> exec = new("Exec");
public Input<GameElement> element = new("Element");
public Input<Vector3> Pos = new("Pos"), Rot = new("Rot"), Scale = new("Scl");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
if (element.Value is IHaveTransformSubmodule ts)
{
if (Pos.IsConnected) { ts.transformSubmodule.originalPosition = Pos.Value; ts.transformSubmodule.positionDirtyMark = true; }
if (Rot.IsConnected) { ts.transformSubmodule.originalEulerAngles = Rot.Value; ts.transformSubmodule.eulerAnglesDirtyMark = true; }
if (Scale.IsConnected) { ts.transformSubmodule.originalScale = Scale.Value; ts.transformSubmodule.scaleDirtyMark = true; }
}
return LoopResult.Complete();
}
}
public class NodeChildByIndex : NodeBase
{
public Input<GameElement> parent = new("Parent");
public int index;
public Output<GameElement> child = new("Child");
public override void BuildUI(NodeUIBuilder ui) { ui.FloatField("Idx", 0, i => index = (int)i); }
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var p = parent.Value;
if (p != null && index >= 0 && index < p.childElementList.Count)
child.SetValue(p.childElementList[index]);
return LoopResult.Complete();
}
}
public class NodeChildCount : NodeBase
{
public Input<GameElement> parent = new("Parent");
public Output<int> count = new("Count");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var p = parent.Value;
count.SetValue(p != null ? p.childElementList.Count : 0);
return LoopResult.Complete();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: da71a524cc8687941840c85db8590b1c

View File

@@ -0,0 +1,445 @@
using System;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
namespace Ichni.NodeScript
{
// ==================== 通用常量 ====================
public class NodeConst : NodeBase
{
enum ValueType { Float, Int, Bool, Vector2, Vector3, Color }
ValueType _type;
public float floatVal;
public int intVal;
public bool boolVal;
public Vector2 vector2Val;
public Vector3 vector3Val;
public Color colorVal;
public OutputAny value = new("Value");
public override void InitConnectors()
{
base.InitConnectors();
value.LockType(typeof(float));
}
public override void BuildUI(NodeUIBuilder ui)
{
ui.TypeDropdown(new[] { "float", "int", "bool", "Vector2", "Vector3", "Color" }, 0, i =>
{
_type = (ValueType)i;
Type t = _type switch
{
ValueType.Float => typeof(float),
ValueType.Int => typeof(int),
ValueType.Bool => typeof(bool),
ValueType.Vector2 => typeof(Vector2),
ValueType.Vector3 => typeof(Vector3),
ValueType.Color => typeof(Color),
_ => typeof(float),
};
value.LockType(t);
});
switch (_type)
{
case ValueType.Float: ui.FloatField("F", 0f, v => floatVal = v); break;
case ValueType.Int: ui.FloatField("I", 0f, v => intVal = (int)v); break;
case ValueType.Bool: ui.Toggle("B", false, v => boolVal = v); break;
case ValueType.Vector2: ui.FloatField("X", 0f, v => vector2Val.x = v); ui.FloatField("Y", 0f, v => vector2Val.y = v); break;
case ValueType.Vector3: ui.FloatField("X", 0f, v => vector3Val.x = v); ui.FloatField("Y", 0f, v => vector3Val.y = v); ui.FloatField("Z", 0f, v => vector3Val.z = v); break;
case ValueType.Color: ui.FloatField("R", 1f, v => colorVal.r = v); ui.FloatField("G", 1f, v => colorVal.g = v); ui.FloatField("B", 1f, v => colorVal.b = v); ui.FloatField("A", 1f, v => colorVal.a = v); break;
}
}
public override LoopResult Loop()
{
object v = _type switch
{
ValueType.Float => floatVal,
ValueType.Int => intVal,
ValueType.Bool => boolVal,
ValueType.Vector2 => vector2Val,
ValueType.Vector3 => vector3Val,
ValueType.Color => colorVal,
_ => 0f,
};
value.SetValueRaw(v);
return LoopResult.Complete();
}
}
// ==================== 通用拆分 ====================
public class NodeSplit : NodeBase
{
public InputAny input = new("Input");
public Output<float> x = new("X"), y = new("Y"), z = new("Z"), w = new("W");
public override LoopResult Loop()
{
if (!input.IsConnected) return LoopResult.Complete();
if (!EnsureInputsReady(out var hang)) return hang;
var t = input.DataType;
if (t == typeof(Vector2))
{
var v = input.GetValue<Vector2>();
x.SetValue(v.x); y.SetValue(v.y);
}
else if (t == typeof(Vector3))
{
var v = input.GetValue<Vector3>();
x.SetValue(v.x); y.SetValue(v.y); z.SetValue(v.z);
}
else if (t == typeof(Color))
{
var v = input.GetValue<Color>();
x.SetValue(v.r); y.SetValue(v.g); z.SetValue(v.b); w.SetValue(v.a);
}
return LoopResult.Complete();
}
}
// ==================== 通用合并 ====================
public class NodeCombine : NodeBase
{
enum CombineType { Vector2, Vector3, Color }
CombineType _type;
public Input<float> x = new("X"), y = new("Y"), z = new("Z"), w = new("W");
public OutputAny output = new("Result");
public override void InitConnectors()
{
base.InitConnectors();
output.LockType(typeof(Vector2));
}
public override void BuildUI(NodeUIBuilder ui)
{
ui.TypeDropdown(new[] { "Vector2", "Vector3", "Color" }, 0, i =>
{
_type = (CombineType)i;
Type t = _type == CombineType.Vector2 ? typeof(Vector2) : _type == CombineType.Vector3 ? typeof(Vector3) : typeof(Color);
output.LockType(t);
});
}
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
object v = _type switch
{
CombineType.Vector2 => new Vector2(x.Value, y.Value),
CombineType.Vector3 => new Vector3(x.Value, y.Value, z.Value),
CombineType.Color => new Color(x.Value, y.Value, z.Value, w.Value),
_ => null,
};
output.SetValueRaw(v);
return LoopResult.Complete();
}
}
// ==================== Lerp 线性插值 ====================
public class NodeLerp : NodeBase
{
public InputAny a = new("A");
public InputAny b = new("B");
public InputAny t = new("T") { IsFixedType = true };
public OutputAny result = new("Result");
public override void InitConnectors()
{
base.InitConnectors();
t.LockType(typeof(float));
}
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var type = a.DataType ?? b.DataType ?? typeof(float);
float factor = t.IsConnected ? Mathf.Clamp01(t.GetValue<float>()) : 0.5f;
object v = null;
if (type == typeof(float))
v = Mathf.Lerp(a.GetValue<float>(), b.GetValue<float>(), factor);
else if (type == typeof(int))
v = Mathf.RoundToInt(Mathf.Lerp(a.GetValue<int>(), b.GetValue<int>(), factor));
else if (type == typeof(Vector2))
v = Vector2.Lerp(a.GetValue<Vector2>(), b.GetValue<Vector2>(), factor);
else if (type == typeof(Vector3))
v = Vector3.Lerp(a.GetValue<Vector3>(), b.GetValue<Vector3>(), factor);
else if (type == typeof(Color))
v = Color.Lerp(a.GetValue<Color>(), b.GetValue<Color>(), factor);
result.SetValueRaw(v);
return LoopResult.Complete();
}
}
// ==================== 比较运算 ====================
public class NodeCompare : NodeBase
{
enum CmpOp { Equal, NotEqual, Greater, Less, GreaterOrEqual, LessOrEqual }
CmpOp _op;
public InputAny a = new("A");
public InputAny b = new("B");
public Output<bool> result = new("Result");
public override void BuildUI(NodeUIBuilder ui)
{
ui.Dropdown("Op", new[] { "==", "!=", ">", "<", ">=", "<=" }, 0, i => _op = (CmpOp)i);
}
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var type = a.DataType ?? b.DataType ?? typeof(float);
bool r = false;
if (type == typeof(float)) r = Compare(a.GetValue<float>(), b.GetValue<float>());
else if (type == typeof(int)) r = Compare(a.GetValue<int>(), b.GetValue<int>());
else if (type == typeof(string)) r = Compare(a.GetValue<string>(), b.GetValue<string>());
result.SetValue(r);
return LoopResult.Complete();
}
bool Compare<T>(T x, T y) where T : IComparable<T>
{
int c = x.CompareTo(y);
return _op switch
{
CmpOp.Equal => c == 0,
CmpOp.NotEqual => c != 0,
CmpOp.Greater => c > 0,
CmpOp.Less => c < 0,
CmpOp.GreaterOrEqual => c >= 0,
CmpOp.LessOrEqual => c <= 0,
_ => false,
};
}
}
// ==================== 二选一 ====================
public class NodeSelect : NodeBase
{
public InputAny condition = new("Cond");
public InputAny trueValue = new("True");
public InputAny falseValue = new("False");
public OutputAny result = new("Result");
bool _manualCond;
public override void BuildUI(NodeUIBuilder ui)
{
ui.Toggle("Cond", false, v => _manualCond = v);
}
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
bool cond = condition.IsConnected ? condition.GetValue<bool>() : _manualCond;
// int → bool 兼容
if (!cond && condition.IsConnected && condition.DataType == typeof(int))
cond = condition.GetValue<int>() != 0;
var src = cond ? trueValue : falseValue;
result.SetValueRaw(src.GetValue());
return LoopResult.Complete();
}
}
// ==================== 万能赋值(反向写入) ====================
public class NodeSet : NodeBase
{
public InputAny targetRef = new("TargetRef");
public InputAny value = new("Value");
public override LoopResult Loop()
{
if (!targetRef.IsConnected) return LoopResult.Complete();
if (!EnsureInputsReady(out var hang)) return hang;
targetRef.WriteBack(value.GetValue());
return LoopResult.Complete();
}
}
// ==================== Variable<T> ====================
public class Variable<T> { public T Value; }
public class NodeVariable<T> : NodeBase
{
public Variable<T> var = new();
public Input<Signal> signal = new("Signal");
public Input<T> set = new("Set");
public Output<T> get = new("Value");
public override void InitConnectors()
{
base.InitConnectors();
(get as Output<T>).SetWriteBack(v => var.Value = v);
}
public override LoopResult Loop()
{
// Signal 有连接时必须等待(循环体内等待触发)
if (signal.IsConnected)
{
if (!EnsureInputsReady(out var hang)) return hang;
}
if (set.IsConnected)
var.Value = set.Value;
get.SetValue(var.Value);
return LoopResult.Complete();
}
}
// ==================== 调试 ====================
public class NodeDebugLog : NodeBase
{
public Input<Signal> exec = new("Exec");
public InputAny value = new("Value");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
Debug.Log($"[DebugLog] {NodeName}: {value.GetValue()}");
return LoopResult.Complete();
}
}
public class NodeLog : NodeBase
{
public InputAny value = new("Value");
public string prefix = "";
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
Debug.Log($"[NodeLog] {prefix}{value.GetValue()}");
return LoopResult.Complete();
}
}
// ==================== List<T> ====================
public class NodeList<T> : NodeBase
{
public Variable<List<T>> list = new() { Value = new List<T>() };
public Output<List<T>> output = new("List");
public override LoopResult Loop()
{
output.SetValue(list.Value);
return LoopResult.Complete();
}
}
public class NodeListAdd<T> : NodeBase
{
public Input<List<T>> list = new("List");
public Input<T> item = new("Item");
public Output<List<T>> output = new("List");
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var l = list.Value;
if (l != null && item.IsConnected) { l.Add(item.Value); output.SetValue(l); }
return LoopResult.Complete();
}
}
public class NodeListGet<T> : NodeBase
{
public Input<List<T>> list = new("List");
public int index;
public Output<T> element = new("Element");
public override void BuildUI(NodeUIBuilder ui) { ui.FloatField("Idx", 0, i => index = (int)i); }
public override LoopResult Loop()
{
if (!EnsureInputsReady(out var hang)) return hang;
var l = list.Value;
if (l != null && index >= 0 && index < l.Count) element.SetValue(l[index]);
return LoopResult.Complete();
}
}
public class NodeForEach : NodeBase
{
public Input<Signal> exec = new("Exec");
public InputAny list = new("List");
public Output<Signal> loopBody = new("LoopBody"), completed = new("Completed");
public OutputAny current = new("Current");
public OutputAny indexOut = new("Index");
System.Collections.IList _list;
int _i;
bool _started;
bool _waiting;
public override void InitConnectors()
{
base.InitConnectors();
indexOut.LockType(typeof(int));
}
public override void OnTypePropagated(Type t)
{
base.OnTypePropagated(t);
if (t != null && t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
current.LockType(t.GetGenericArguments()[0]);
}
public override LoopResult Loop()
{
if (!exec.IsConnected) return LoopResult.Complete();
if (!_started && !EnsureInputsReady(out var hang)) return hang;
if (!_started)
{
_list = list.GetValue() as System.Collections.IList;
if (_list == null || _list.Count == 0)
{
completed.SetValue(Signal.Default);
return LoopResult.Complete();
}
_i = 0;
_started = true;
}
if (_waiting) { _waiting = false; return LoopResult.Wait(); }
if (_i < _list.Count)
{
indexOut.SetValueRaw(_i);
current.SetValueRaw(_list[_i]);
loopBody.SetValue(Signal.Default);
_i++;
_waiting = true;
return LoopResult.Repeat();
}
_started = false;
completed.SetValue(Signal.Default);
return LoopResult.Complete();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d6d155dc132fc24448aa1896c024f9a6

View File

@@ -0,0 +1,404 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Ichni.RhythmGame;
using UnityEngine;
namespace Ichni.NodeScript
{
// ============================================================
// NodeStatus — 生命周期状态
// ============================================================
public enum NodeStatus { Ready, Hang, Complete }
// ============================================================
// LoopResult — Loop() 返回值
// ============================================================
public struct LoopResult
{
public List<NodeBase> Triggers;
public bool RemoveFromRuntime;
public bool TriggerDownstream;
/// <summary>完成,退出 runtime 并触发下游</summary>
public static LoopResult Complete() => new() { RemoveFromRuntime = true, TriggerDownstream = true };
/// <summary>挂起,等待前置节点,不触发下游</summary>
public static LoopResult Hang(NodeBase trigger) => new() { Triggers = new List<NodeBase> { trigger }, RemoveFromRuntime = false };
/// <summary>挂起,等待多个前置节点</summary>
public static LoopResult Hang(List<NodeBase> triggers) => new() { Triggers = triggers, RemoveFromRuntime = false };
/// <summary>保持活跃,触发下游但不退出 runtime循环节点逐周期用</summary>
public static LoopResult Repeat() => new() { RemoveFromRuntime = false, TriggerDownstream = true };
/// <summary>空转一周期,不触发下游(循环节点等下游消费用)</summary>
public static LoopResult Wait() => new() { RemoveFromRuntime = false };
}
// ============================================================
// 连接器接口(简化,移除 HasReceived
// ============================================================
public interface IInput
{
string Name { get; set; }
Type DataType { get; }
Color ConnectorColor { get; }
bool IsConnected { get; }
}
public interface IOutput
{
string Name { get; set; }
Type DataType { get; }
Color ConnectorColor { get; }
bool IsConnected { get; }
}
// ============================================================
// NodeBase — 纯数据/逻辑
// ============================================================
public abstract class NodeBase
{
public string NodeName;
public NodeObject nodeObject;
public NodeStatus Status { get; set; } = NodeStatus.Ready;
public int L { get; set; } = -1;
public abstract LoopResult Loop();
public virtual void BuildUI(NodeUIBuilder ui) { }
/// <summary>当某个 InputAny 连线锁定类型后,传播到同节点其他未锁定端口</summary>
public virtual void OnTypePropagated(Type lockedType)
{
foreach (var any in GetAnyInputs())
{
if (any.IsFixedType) continue;
if (any.DataType == null)
any.LockType(lockedType);
}
foreach (var any in GetAnyOutputs())
{
if (any.DataType == null)
any.LockType(lockedType);
}
}
public List<InputAny> GetAnyInputs()
{
return GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => typeof(InputAny).IsAssignableFrom(f.FieldType))
.Select(f => f.GetValue(this) as InputAny)
.Where(a => a != null)
.ToList();
}
/// <summary>检查所有已连输入的上游是否都 Complete否则自动返回 Hang</summary>
protected bool EnsureInputsReady(out LoopResult hang)
{
var preceding = GetPrecedingNodes();
var pending = preceding.Where(p => p.Status != NodeStatus.Complete).ToList();
if (pending.Count > 0) { hang = LoopResult.Hang(pending); return false; }
hang = default; return true;
}
public List<OutputAny> GetAnyOutputs()
{
return GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => typeof(OutputAny).IsAssignableFrom(f.FieldType))
.Select(f => f.GetValue(this) as OutputAny)
.Where(a => a != null)
.ToList();
}
/// <summary>收集所有前置依赖节点(输入连线的上游)</summary>
public List<NodeBase> GetPrecedingNodes()
{
var result = new List<NodeBase>();
foreach (var any in GetAnyInputs())
{
var src = any.GetSourceNode();
if (src != null) result.Add(src);
}
foreach (var f in GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if (!f.FieldType.IsGenericType) continue;
var def = f.FieldType.GetGenericTypeDefinition();
if (def != typeof(Input<>)) continue;
var input = f.GetValue(this);
var srcMethod = f.FieldType.GetMethod("GetSourceNode");
var node = srcMethod?.Invoke(input, null) as NodeBase;
if (node != null) result.Add(node);
}
return result;
}
// 反射
public List<(string name, IInput connector, Type type)> GetInputs()
{
var results = new List<(string, IInput, Type)>();
foreach (var f in GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if (!typeof(IInput).IsAssignableFrom(f.FieldType)) continue;
var val = f.GetValue(this) as IInput;
if (val == null) continue;
results.Add((f.Name, val, val.DataType ?? typeof(object)));
}
return results;
}
public List<(string name, IOutput connector, Type type)> GetOutputs()
{
var results = new List<(string, IOutput, Type)>();
foreach (var f in GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if (!typeof(IOutput).IsAssignableFrom(f.FieldType)) continue;
var val = f.GetValue(this) as IOutput;
if (val == null) continue;
results.Add((f.Name, val, val.DataType ?? typeof(object)));
}
return results;
}
public virtual void InitConnectors()
{
foreach (var f in GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if (!typeof(IInput).IsAssignableFrom(f.FieldType) &&
!typeof(IOutput).IsAssignableFrom(f.FieldType)) continue;
var c = f.GetValue(this);
if (c == null) { c = Activator.CreateInstance(f.FieldType); f.SetValue(this, c); }
var nbField = f.FieldType.GetField("_nodeBase", BindingFlags.NonPublic | BindingFlags.Instance);
nbField?.SetValue(c, this);
}
}
}
// ============================================================
// Input<T> — 拉扯式输入,从上游 Output<T> 直接读取
// ============================================================
public class Input<T> : IInput
{
internal NodeBase _nodeBase;
Output<T> _source;
IOutput _anySource; // OutputAny 等非泛型源
public string Name { get; set; }
public Type DataType => typeof(T);
public bool IsConnected => _source != null || _anySource != null;
public Color ConnectorColor => NodeColors.Get(typeof(T));
public T Value
{
get
{
if (_source != null) return _source._value;
if (_anySource is OutputAny oa) return oa.GetValue<T>();
return default;
}
}
public Input() { Name = typeof(T).Name; }
public Input(string name) { Name = name ?? typeof(T).Name; }
public T Pull() => Value;
public void Connect(Output<T> src) { _source = src; _anySource = null; }
public void Disconnect(Output<T> src) { if (_source == src) _source = null; }
public void ConnectAny(IOutput src) { _anySource = src; _source = null; }
public void DisconnectAny() { _anySource = null; }
public NodeBase GetSourceNode()
{
if (_source != null) return _source._nodeBase;
var f = _anySource?.GetType().GetField("_nodeBase", BindingFlags.NonPublic | BindingFlags.Instance);
return f?.GetValue(_anySource) as NodeBase;
}
}
// ============================================================
// Output<T> — 存值,不再推送;保留 _targets 供拓扑/BFS 用
// ============================================================
public class Output<T> : IOutput
{
internal NodeBase _nodeBase;
internal T _value;
internal readonly List<Input<T>> _targets = new();
// 反向写入回调NodeSet 写回 Variable 时触发
internal Action<T> _writeBack;
public string Name { get; set; }
public Type DataType => typeof(T);
public bool IsConnected => _targets.Count > 0;
public T Value => _value;
public Color ConnectorColor => NodeColors.Get(typeof(T));
public Output() { Name = typeof(T).Name; }
public Output(string name) { Name = name ?? typeof(T).Name; }
public void SetValue(T v)
{
_value = v;
_writeBack?.Invoke(v);
}
public void Connect(Input<T> i) { if (i != null && !_targets.Contains(i)) _targets.Add(i); }
public void Disconnect(Input<T> i) { if (i != null) _targets.Remove(i); }
internal void SetWriteBack(Action<T> cb) { _writeBack = cb; }
}
// ============================================================
// InputAny — 未锁定输入端口,连线后类型自动确定
// ============================================================
public class InputAny : IInput
{
internal NodeBase _nodeBase;
IOutput _source;
public string Name { get; set; }
public Type DataType { get; private set; }
public bool IsConnected => _source != null;
public bool IsFixedType { get; set; }
public Color ConnectorColor => DataType != null ? NodeColors.Get(DataType) : Color.grey;
public InputAny() { Name = "Any"; }
public InputAny(string name) { Name = name ?? "Any"; }
public T GetValue<T>()
{
if (_source is Output<T> ot) return ot.Value;
if (_source is OutputAny oa) return oa.GetValue<T>();
return default;
}
public object GetValue()
{
if (_source is OutputAny oa) return oa._value;
if (_source != null)
{
var p = _source.GetType().GetProperty("Value");
return p?.GetValue(_source);
}
return null;
}
public NodeBase GetSourceNode()
{
var f = _source?.GetType().GetField("_nodeBase", BindingFlags.NonPublic | BindingFlags.Instance);
return f?.GetValue(_source) as NodeBase;
}
// 反向写入NodeSet 通过 targetRef 写回上游 Variable
public void WriteBack(object value)
{
if (_source == null) return;
if (_source is OutputAny oa)
{
oa.SetValueRaw(value);
// 触发 writeback
if (oa._writeBack != null)
oa._writeBack.DynamicInvoke(value);
}
else
{
var setMethod = _source.GetType().GetMethod("SetValue");
if (setMethod != null)
{
setMethod.Invoke(_source, new[] { value });
}
}
}
public void ConnectAny(IOutput src)
{
_source = src;
if (src.DataType != null)
{
LockType(src.DataType);
_nodeBase?.OnTypePropagated(src.DataType);
}
}
public void DisconnectAny() { _source = null; }
public void LockType(Type t)
{
if (t != null && DataType != t) DataType = t;
}
}
// ============================================================
// OutputAny — 未锁定输出端口,类型跟随同节点 InputAny
// ============================================================
public class OutputAny : IOutput
{
internal NodeBase _nodeBase;
internal object _value;
internal readonly List<InputAny> _targets = new();
internal Action<object> _writeBack;
public string Name { get; set; }
public Type DataType { get; private set; }
public bool IsConnected => _targets.Count > 0;
public Color ConnectorColor => DataType != null ? NodeColors.Get(DataType) : Color.grey;
public OutputAny() { Name = "Out"; }
public OutputAny(string name) { Name = name ?? "Out"; }
public T GetValue<T>()
{
if (_value is T tv) return tv;
Debug.LogError($"[OutputAny:{Name}] Type mismatch: stored={_value?.GetType().Name}, requested={typeof(T).Name}");
return default;
}
public object GetValue() => _value;
public void SetValue<T>(T v) { _value = v; }
public void SetValueRaw(object v) { _value = v; }
public void ConnectAny(InputAny i) { if (i != null && !_targets.Contains(i)) _targets.Add(i); }
public void DisconnectAny(InputAny i) { if (i != null) _targets.Remove(i); }
public void LockType(Type t)
{
if (t != null && DataType != t) DataType = t;
}
}
// ============================================================
// 颜色表
// ============================================================
public static class NodeColors
{
static readonly Dictionary<Type, Color> _table = new()
{
{ typeof(float), Color.blue },
{ typeof(int), Color.cyan },
{ typeof(bool), new Color(1f, 0.5f, 0f) },
{ typeof(string), Color.magenta },
{ typeof(Vector2), Color.yellow },
{ typeof(Vector3), Color.green },
{ typeof(Color), new Color(0.8f, 0.4f, 0.6f) },
{ typeof(GameElement), Color.mediumPurple },
{ typeof(Signal), Color.ghostWhite },
{ typeof(List<GameElement>), new Color(0.6f, 0.3f, 0.8f) },
};
public static Color Get(Type t) => t != null && _table.TryGetValue(t, out var c) ? c : Color.grey;
}
// ============================================================
// Signal — 触发信号,不参与值传递
// ============================================================
public struct Signal
{
public static readonly Signal Default = new();
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 335508d8cda287449ad8009a1c9e61a8

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6cdb8cc0b3fb21f49b1a761000205509

View File

@@ -0,0 +1,135 @@
using System;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Ichni.NodeScript
{
public class NodeObject : MonoBehaviour, IDragHandler, IPointerClickHandler
{
public TMP_Text TitleText;
public NodeBase nodeBase;
public Image statusImage;
public Transform inputsRoot;
public Transform outputsRoot;
public Transform middleRoot;
public GameObject connectorSlotPrefabI;
public GameObject connectorSlotPrefabO;
public GameObject dropdownPrefab;
public GameObject inputPrefab;
bool _selected;
public bool Selected
{
get => _selected;
set
{
_selected = value;
if (_bg == null) _bg = GetComponent<Image>();
if (_bg != null) _bg.color = value ? new Color(0.3f, 0.5f, 0.9f, 0.4f) : new Color(0.15f, 0.15f, 0.15f, 0.3f);
}
}
Image _bg;
public void Init()
{
if (nodeBase == null) return;
TitleText.text = nodeBase.NodeName;
nodeBase.nodeObject = this;
_bg = GetComponent<Image>();
if (_bg == null) { _bg = gameObject.AddComponent<Image>(); _bg.color = new Color(0.15f, 0.15f, 0.15f, 0.3f); }
nodeBase.InitConnectors();
BuildConnectors();
nodeBase.BuildUI(new NodeUIBuilder(middleRoot, dropdownPrefab, inputPrefab));
NodeManager.Instance?.ComputeLValues();
UpdateLDisplay();
}
public void UpdateLDisplay()
{
if (TitleText != null && nodeBase != null)
TitleText.text = $"{nodeBase.NodeName} (L:{nodeBase.L})";
}
public void UpdateStatusDisplay()
{
if (statusImage == null || nodeBase == null) return;
statusImage.color = nodeBase.Status switch
{
NodeStatus.Ready => new Color(0.3f, 0.3f, 0.3f, 0.8f),
NodeStatus.Hang => new Color(0.8f, 0.6f, 0.1f, 0.9f),
NodeStatus.Complete => new Color(0.2f, 0.8f, 0.3f, 0.9f),
_ => Color.white,
};
}
// ========== 选中 / 拖拽 ==========
public void OnPointerClick(PointerEventData e)
{
if (e.button != PointerEventData.InputButton.Left) return;
NodeManager.Instance.SelectNode(this, e);
}
public void OnDrag(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left) return;
var rt = GetComponent<RectTransform>();
rt.anchoredPosition += eventData.delta / GetComponentInParent<Canvas>().scaleFactor;
NodeManager.Instance.RefreshAllLines();
}
// ========== 插槽构建 ==========
void BuildConnectors()
{
foreach (var (name, connector, type) in nodeBase.GetInputs())
CreateSlot(name, connector, true);
foreach (var (name, connector, type) in nodeBase.GetOutputs())
CreateSlot(name, connector, false);
}
void CreateSlot(string name, object connector, bool isInput)
{
IInput inp = connector as IInput;
IOutput outp = connector as IOutput;
if (inp == null && outp == null) return;
var conName = inp?.Name ?? outp.Name;
if (inp != null) inp.Name = name;
if (outp != null) outp.Name = name;
var prefab = isInput ? connectorSlotPrefabI : connectorSlotPrefabO;
var parent = isInput ? inputsRoot : outputsRoot;
if (prefab == null || parent == null) return;
var go = Instantiate(prefab, parent);
var img = go.GetComponentInChildren<Image>();
if (img == null)
{
var imgGo = new GameObject("Dot", typeof(Image));
imgGo.transform.SetParent(go.transform, false);
img = imgGo.GetComponent<Image>();
}
img.color = (inp as IInput)?.ConnectorColor ?? (outp as IOutput)?.ConnectorColor ?? Color.white;
img.raycastTarget = true;
var text = go.GetComponentInChildren<TMP_Text>();
if (text != null) text.text = name;
var imgRt = img.GetComponent<RectTransform>();
if (imgRt.sizeDelta.sqrMagnitude < 1f) imgRt.sizeDelta = new Vector2(20, 20);
var slot = img.GetComponent<ConnectorSlot>();
if (slot == null) slot = img.gameObject.AddComponent<ConnectorSlot>();
slot.isInput = isInput;
slot.connectorIn = inp;
slot.connectorOut = outp;
slot.ownerNode = this;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bc99ff1458babbf418cadaa025d9c4fc

View File

@@ -0,0 +1,97 @@
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Ichni.NodeScript
{
public class NodeUIBuilder
{
Transform parent;
GameObject dropdownPrefab;
GameObject inputPrefab;
public NodeUIBuilder(Transform parent, GameObject dropdownPrefab, GameObject inputPrefab)
{
this.parent = parent;
this.dropdownPrefab = dropdownPrefab;
this.inputPrefab = inputPrefab;
}
public NodeUIBuilder Dropdown(string label, string[] options, int defaultIndex, Action<int> onChanged)
{
if (parent == null || dropdownPrefab == null || options == null || options.Length == 0) return this;
var go = UnityEngine.Object.Instantiate(dropdownPrefab, parent);
go.name = "dd_" + label;
var dd = go.GetComponentInChildren<TMP_Dropdown>();
if (dd != null)
{
dd.ClearOptions();
foreach (var o in options) dd.options.Add(new TMP_Dropdown.OptionData(o));
dd.value = defaultIndex;
dd.onValueChanged.AddListener(i => onChanged?.Invoke(i));
}
var lbl = go.GetComponentInChildren<TMP_Text>();
if (lbl != null && lbl.transform != dd?.transform) lbl.text = label;
return this;
}
public NodeUIBuilder FloatField(string label, float defaultValue, Action<float> onChanged)
{
if (parent == null || inputPrefab == null) return this;
var go = UnityEngine.Object.Instantiate(inputPrefab, parent);
go.name = "inp_" + label;
var input = go.GetComponentInChildren<TMP_InputField>();
if (input != null)
{
input.text = defaultValue.ToString("0.##");
input.contentType = TMP_InputField.ContentType.DecimalNumber;
input.onValueChanged.AddListener(s =>
{
if (float.TryParse(s, out float v)) onChanged?.Invoke(v);
});
}
var lbl = go.GetComponentInChildren<TMP_Text>();
if (lbl != null && lbl.transform != input?.transform) lbl.text = label;
return this;
}
/// <summary>类型选择下拉NodeConst / NodeCombine 用)</summary>
public NodeUIBuilder TypeDropdown(string[] options, int defaultIndex, Action<int> onChanged)
{
return Dropdown("Type", options, defaultIndex, onChanged);
}
/// <summary>Bool 开关NodeSelect 的 condition 备选)</summary>
public NodeUIBuilder Toggle(string label, bool defaultValue, Action<bool> onChanged)
{
if (parent == null || dropdownPrefab == null) return this;
var go = UnityEngine.Object.Instantiate(dropdownPrefab, parent);
go.name = "tgl_" + label;
var dd = go.GetComponentInChildren<TMP_Dropdown>();
if (dd != null)
{
dd.ClearOptions();
dd.options.Add(new TMP_Dropdown.OptionData("False"));
dd.options.Add(new TMP_Dropdown.OptionData("True"));
dd.value = defaultValue ? 1 : 0;
dd.onValueChanged.AddListener(i => onChanged?.Invoke(i == 1));
}
var lbl = go.GetComponentInChildren<TMP_Text>();
if (lbl != null && lbl.transform != dd?.transform) lbl.text = label;
return this;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 90b84ea9f6d5bbf4690ad415ef0bb1c9

View File

@@ -0,0 +1,14 @@
节点逻辑重构
在这次重构中我们不需要改UI部分而是聚焦于node manager对node的指令的控制和node的行为的表现。我打算把系统运行的控制权集中在manager上使用类似生命周期的方式控制节点指令。
逻辑流程每个node都有一个status为ready hang或complete刚开始启动的时候所有的都为ready或者complete然后启动start节点。
Manager拥有一个触发表在开始一次周期前将触发表并入运行时表中并清空触发表。
在周期中遍历运行时表运行节点内置的loop方法 收集下一次的触发以及要从运行时表中去除的东西。
节点不再传递值会从前面的节点拿取值或者引用启动后每周期检查如果前方的节点不处于complete那么status就改为hang将自己维持在运行时表中并且将前面的node加入触发表取值满足后进行运算返回complete。
特殊节点变量节点不存在hang在启动之后立刻返回值或者引用并且complete这些节点拥有一个signal输入这个输入通常不需要连接只有在循环节点内这个signal才用得到。
循环和子函数节点可能需要一种新的状态表示其内部正在运行。这些节点可能需要一个新的UI控件比如一个rect当别的节点拖放在这个rect里面就相当于在节点内。我们的UI支持自动调整你只需要在之前放选项的地方也就是UI builder所需要的地方直接加入一个可以手动放大缩小范围的rect并且对他添加脚本就好而像for循环原有的每个循环都会有的Index和Signal输出点就可能不用放在第三列而是放在位于输入节点的第一列以拉取到rect里面循环还包含一个子控制器监控里面的节点运行情况不过这里面节点的运行状况依然交由主manager子控制器只负责检查是否完成重置节点并开启下一步的循环。
子函数节点包含子函数定义节点和子函数执行节点。定义值点只有一个输入string name我们使用rect外连接到rect内的变量节点代表输入以及连接到rect外的set节点代表输出。
Manager可能需要扫描所有文件注册这些子函数定义节点然后在其他地方的执行节点中表现为input输入和output输出。
关于signalSignal依然存在仅用于触发操作拥有signal并且signal输入已连接的节点会像上文一样等待signal。
其他节点拥有一个“到stars节点的最短距离”l
举例L等于零的输出可以接在l等于七的输入上而l等于七的输出不能接在l等于二的输入上。确保单向逻辑。
关于引用和动态类型比如set节点输入第一项为原值比如一个变量int。第二项也为int用于更改第一个项指向的值。引用节点没有输出只有输入并且要根据输入的第一项的类型更改输入第二项的类型可能要为此实现一个input<any>之类的东西,

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c8fec166f647d414c8d2fe21bfda2c86
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,455 @@
# NodeScript 重构大纲
## 一、重构目标
将节点系统从**推送式push-based求值**改为**Manager 集中控制的拉取式pull-based生命周期循环**。不改 UI 层,聚焦于 NodeManager 对节点的调度逻辑和节点自身的行为表现。
---
## 二、核心架构变更
### 2.1 节点生命周期状态
`NodeBase` 新增状态枚举:
```csharp
enum NodeStatus { Ready, Hang, Complete }
```
- **Ready** — 节点等待被触发执行
- **Hang** — 节点因前置节点未完成而挂起,保留在运行时表中等待下一周期
- **Complete** — 节点已完成本轮运算
变量节点的特殊规则:不存在 Hang 状态,启动后立即返回值/引用并 Complete。
### 2.2 触发表 + 运行时表Manager 侧)
Manager 维护两张表:
| 表 | 作用 |
|---|---|
| **触发表** `triggerTable` | 收集本周期要加入运行的节点,周期开始前并入运行时表 |
| **运行时表** `runtimeTable` | 当前周期正在遍历的节点集合 |
周期流程:
1. `triggerTable` → 并入 `runtimeTable`,清空 `triggerTable`
2. 遍历 `runtimeTable`,调用每个节点的 `Loop()` 方法
3. `Loop()` 返回:下一轮要触发的节点(加入 `triggerTable`+ 是否从 `runtimeTable` 移除自己
### 2.3 拉取式取值
节点不再通过 Output → Input 推送数据。改为:
- 每个周期节点从前置节点的 Output 中**主动拉取**值或引用
- 如果前置节点不处于 `Complete`,本节点 `Status = Hang`,将前置节点加入 `triggerTable`,自己保留在 `runtimeTable`
- 取值条件满足后,执行运算,返回 `Complete`
### 2.4 最短距离 L单向逻辑保证
每个节点计算到 Start 节点的最短距离 `L`,用于约束连线方向:
- L=0 的节点的输出可以连接到 L=7 的节点的输入
- L=7 的节点的输出**不能**连接到 L=2 的节点的输入
- 确保逻辑单向流动
---
## 三、文件级重构计划
### 3.1 NodeCore.cs — 核心类型重定义
| 变更项 | 说明 |
|---|---|
| 移除 `Input<T>.Notify()` / `Output<T>.SetValue()` 推送链 | 不再需要推送机制 |
| `Input<T>` 改为存储对上游 `Output<T>` 的引用,通过 `Pull()` 取值 | 拉取模式 |
| `NodeBase` 新增 `NodeStatus Status` 属性 | 生命周期状态 |
| `NodeBase` 新增抽象方法 `Loop()` | 替代 `Evaluate()`,返回 `(List<NodeBase> triggers, bool removeFromRuntime)` |
| `NodeBase` 新增 `int L` 属性 | 到 Start 节点的最短距离 |
| `NodeBase` 新增 `List<NodeBase> GetPrecedingNodes()` | 获取所有前置依赖节点 |
| 保留 `IInput` / `IOutput` 接口 | UI 层依赖不变 |
| 保留 `Signal` 结构体 | 仅用于触发操作 |
| 新增 `InputAny` 概念(见 3.4 | 动态类型支持 |
### 3.2 NodeManager.cs — 生命周期调度
| 变更项 | 说明 |
|---|---|
| 新增 `HashSet<NodeBase> triggerTable` | 触发表 |
| 新增 `HashSet<NodeBase> runtimeTable` | 运行时表 |
| 新增 `void RunCycle()` | 单周期执行逻辑 |
| 重写 `RunGraph()` | 初始化触发表为 Start/Entry 节点,循环调用 `RunCycle()` 直到运行时表为空 |
| 新增 `void ComputeLValues()` | 在连线变更后重新计算所有节点的最短距离 L |
| 新增 `bool ValidateConnection(NodeBase from, NodeBase to)` | 连线前验证 L 约束 |
| 新增子控制器管理 | 用于循环节点和子函数节点的内部运行监控 |
| 新增 `void RegisterSubFunction(NodeBase definition)` | 扫描注册子函数定义 |
| `TryConnect()` 中增加 L 约束检查 | 阻止反向连线 |
| `SaveToFile()` / `LoadFromFile()` 适配新状态 | 保存/加载兼容 |
| UI 部分(拖线、复制粘贴等)保持不变 | — |
### 3.3 NodeObject.cs / ConnectorSlot.cs / NodeUIBuilder.cs — UI 层
**原则上不修改**,仅可能的微调:
- `NodeObject.Init()` 中调用 `nodeBase.InitConnectors()` 后触发 L 值计算
- 循环/子函数节点的 Rect 容器支持(见 3.6
### 3.4 动态类型 — InputAny / OutputAny 机制(多类型统一节点的基石)
#### 3.4.1 问题
当前同一功能、不同类型的节点大量重复:
| 功能 | 现有节点 | 覆盖类型 |
|---|---|---|
| 常量 | `NodeConstFloat`, `NodeConstVector2`, `NodeConstVector3`, `NodeConstColor` | float, Vector2, Vector3, Color |
| 拆分 | `NodeSplitV2`, `NodeSplitV3` | Vector2, Vector3 |
| 合并 | `NodeCombineV2`, `NodeCombineV3` | Vector2, Vector3 |
| 数学 | `NodeMath`(仅 float | float |
这些节点的**逻辑完全一致**,仅类型不同。引入 `InputAny` / `OutputAny` 后,一个节点覆盖所有类型。
#### 3.4.2 类型列表
```csharp
// 系统支持的全部可连线类型
static readonly HashSet<Type> SupportedTypes = new()
{
typeof(float), typeof(int), typeof(bool), typeof(string),
typeof(Vector2), typeof(Vector3), typeof(Color),
typeof(GameElement), typeof(List<GameElement>),
typeof(Signal),
};
```
#### 3.4.3 InputAny / OutputAny 设计
```csharp
/// <summary>未锁定的输入端口,连线后类型自动锁定</summary>
public class InputAny : IInput
{
object _sourceOutput; // 连到的 Output可能是 Output<T> 或 OutputAny
public string Name { get; set; }
public Type DataType { get; private set; } // null 表示未锁定,连线后锁定
public bool IsConnected => _sourceOutput != null;
public bool HasReceived { get; set; }
public Color ConnectorColor => DataType != null ? NodeColors.Get(DataType) : Color.grey;
/// <summary>直接取已连接的上游值(泛型方式)</summary>
public T GetValue<T>() { ... }
/// <summary>取值为 object</summary>
public object GetValue() { ... }
/// <summary>连线时由 Manager 调用,锁定端口类型</summary>
internal void LockType(Type t) { DataType = t; }
}
/// <summary>未锁定的输出端口,类型由同节点的 InputAny 传播决定</summary>
public class OutputAny : IOutput
{
object _value;
public string Name { get; set; }
public Type DataType { get; private set; } // null 表示未锁定
public bool IsConnected => _targets.Count > 0;
public Color ConnectorColor => DataType != null ? NodeColors.Get(DataType) : Color.grey;
public T GetValue<T>() { ... }
public void SetValue<T>(T v) { _value = v; }
/// <summary>由节点的某个 InputAny 锁定后传播过来</summary>
internal void LockType(Type t) { DataType = t; }
}
```
#### 3.4.4 类型传播规则
一个节点上存在多个 `InputAny` / `OutputAny` 时,类型按以下优先级传播:
```
规则 1外部优先: 任一 InputAny 被连线 → 锁定该端口类型 → 传播到同节点所有未锁定的 InputAny / OutputAny
规则 2冲突检测: 两个已连线的 InputAny 类型不一致 → Manager 阻止连线,报 "Type mismatch"
规则 3OutputAny: 总是跟随同节点的首个已锁定 InputAny 的类型
规则 4无输入节点: 常量类节点无 InputAnyOutputAny 类型由节点内置字段/UI 选择决定
```
#### 3.4.5 ConnectorSlot UI 适配
- 未锁定的 `InputAny` / `OutputAny` 连接点显示**灰色**
- 连线锁定后,动态更新连接点的颜色以匹配锁定类型
- `ConnectorSlot` 需要监听 `DataType` 变化并刷新颜色
- Manager 在 `TryConnect` 成功后调用 `Slot.RefreshAppearance()`
---
### 3.5 多类型统一节点设计
以下节点取代现有的同功能多类型节点。
#### 3.5.1 NodeConst — 通用常量(取代 NodeConstFloat/V2/V3/Color
```
NodeConst:
[UI] Dropdown: Type (float / int / bool / Vector2 / Vector3 / Color)
[UI] 根据所选类型动态显示对应输入控件
OutputAny value ← 类型由 UI 选择锁定
```
逻辑无输入Loop 中直接 Complete。输出值被下游拉取。
#### 3.5.2 NodeMath — 通用数学运算(扩展覆盖类型)
```
NodeMath:
[UI] Dropdown: Op (Add / Sub / Mul / Div)
InputAny a ← 连线后锁定类型
InputAny b ← 跟随 a 的类型(或相反,谁先连跟谁)
OutputAny result ← 类型来源同 InputAny 的锁定类型
```
支持的运算映射LUT 注册):
| 类型 | Add | Sub | Mul | Div |
|---|---|---|---|---|
| float, int | `+` | `-` | `*` | `/` |
| Vector2, Vector3 | `+` | `-` | `* float` | `/ float` |
| string | 拼接 | — | — | — |
| Color | `+` (叠加) | `-` | `* float` | — |
> 实现:用 `Dictionary<(Type, Op), Func<object, object, object>>` 查表分派。
#### 3.5.3 NodeSplit — 通用拆分(取代 NodeSplitV2/V3
```
NodeSplit:
InputAny input ← Vector2 → 输出 X(float), Y(float)
← Vector3 → 输出 X(float), Y(float), Z(float)
OutputAny x, y, z ← z 仅在 Vector3 时激活
```
- 默认所有 OutputAny 端口可见但灰掉,`input` 锁定类型后按需激活
- 对于 Color输出 R, G, B, A (float)
#### 3.5.4 NodeCombine — 通用合并(取代 NodeCombineV2/V3
```
NodeCombine:
[UI] Dropdown: Type (Vector2 / Vector3 / Color)
InputAny x, y, z, w ← 数量按类型动态显示
OutputAny output ← 类型跟随 UI 选择
```
#### 3.5.5 NodeLerp — 线性插值(新节点)
```
NodeLerp:
InputAny a, b ← 连线锁定类型
InputAny t ← 预期 float不受 a/b 锁定影响,标记为 fixed-type
OutputAny result ← 跟随 a/b 类型
```
支持 float, int, Vector2, Vector3, Color。
#### 3.5.6 NodeCompare — 比较运算(新节点)
```
NodeCompare:
[UI] Dropdown: Op (==, !=, >, <, >=, <=)
InputAny a, b ← 连线锁定类型(支持 float, int
OutputAny result ← 固定 bool
```
> 注意:> \ < 仅在数值类型有效,== / != 可扩展至 string。
#### 3.5.7 NodeSelect — 二选一(新节点)
```
NodeSelect:
InputAny condition ← 如果未连线,用 [UI] Toggle(bool);如果连线则类型锁定 bool
InputAny trueValue, falseValue ← 类型互相跟随
OutputAny result ← 跟随 trueValue/falseValue 类型
```
#### 3.5.8 NodeSet — 万能赋值(新节点,引用语义)
```
NodeSet:
InputAny targetRef ← 连接到变量节点的 get 输出(锁定为目标类型)
InputAny value ← 跟随 targetRef 类型
// 无 OutputAny纯副作用节点
```
> 关键targetRef 不仅是取值,还要修改其引用的 Variable 内部值。需要 InputAny 能够"反向写入"。
#### 3.5.9 节点对比总结
| 统一节点 | 取代旧节点 | 覆盖类型数 |
|---|---|---|
| `NodeConst` | `NodeConstFloat`, `NodeConstVector2`, `NodeConstVector3`, `NodeConstColor` | 6+ |
| `NodeMath` | `NodeMath`(扩展) | 5 (float, int, Vector2, Vector3, Color) |
| `NodeSplit` | `NodeSplitV2`, `NodeSplitV3` | 3 (Vector2, Vector3, Color) |
| `NodeCombine` | `NodeCombineV2`, `NodeCombineV3` | 3 (Vector2, Vector3, Color) |
| `NodeLerp` | (新) | 5 |
| `NodeCompare` | (新) | 3 |
| `NodeSelect` | (新) | 任意 |
| `NodeSet` | (新) | 任意 |
---
### 3.6 InputAny 类型锁定流程Manager 侧)
```
TryConnect(OutputAny/Output<T> src, InputAny dst):
1. 获取 src 的实际 DataType → T
2. 如果 dst.DataType == null → dst.LockType(T) → 传播到同节点其他端口
3. 如果 dst.DataType == T → OK
4. 如果 dst.DataType != T → 拒绝,类型不匹配
5. 调用 dst.ownerNode.OnTypePropagated() 通知节点刷新 UI
```
传播方法(在 `NodeBase` 上):
```csharp
/// <summary>当某个 InputAny 或 OutputAny 锁定了类型后,通知节点刷新其他端口</summary>
public virtual void OnTypePropagated(ConnectorSlot lockedSlot, Type lockedType)
{
// 默认遍历所有未锁定端口LockType(lockedType)
foreach (var slot in GetAnySlots())
if (slot.DataType == null)
slot.LockType(lockedType);
}
```
#### 3.6.1 fixed-type 端口标记
某些 InputAny 不接受类型传播(如 `NodeLerp.t` 必须是 float。新增标记
```csharp
public class InputAny : IInput
{
public bool IsFixedType { get; init; } // true = 不被传播覆盖,始终保持初始类型
}
```
`NodeLerp.t``new InputAny { IsFixedType = true, Name = "t" }`(已指定 float 意图时 LockType(float)
---
### 3.7 特殊节点:变量节点
```csharp
class NodeVariable<T> : NodeBase
{
Input<Signal> signal; // 通常不连,仅在循环内使用
Input<T> set;
Output<T> get;
}
```
- `Loop()` 立即返回当前值,不存在 Hang 状态
- 有 Signal 输入时(循环体内),等待 Signal 触发才更新
- 变量节点不参与 InputAny 类型传播——类型由泛型参数 T 固定
### 3.8 循环节点 & 子函数节点(新 UIRect 容器)
**UI 变更NodeUIBuilder 扩展):**
- 新增一个可手动拖拽缩放大小的 Rect 区域
- 将其他节点拖入此 Rect 即表示"在节点内部"
- 循环节点的 Index 和 Signal 输出点移到第一列(输入列),可拉线到 Rect 内部
**节点结构:**
```
NodeForLoop:
外部输入: exec(Signal), count(InputAny) ← count 支持 int/float
外部输出: completed(Signal)
内部 Rect 中:
子节点...(由主 Manager 调度,子控制器监控)
Index 输出(int) — 在第一列,拉入 Rect 内
LoopBody 输出(Signal) — 在第一列,拉入 Rect 内
```
**子控制器职责:**
- 检查循环体内所有节点是否 Complete
- 重置内部节点,开启下一步循环
- 向主 Manager 报告循环是否全部完成
**子函数定义节点:**
```
NodeSubFunctionDef:
输入: name(string)
Rect 外→Rect 内的变量节点 → 代表函数输入参数(变量类型即参数类型)
Rect 内的 set 节点 → Rect 外 → 代表函数输出
```
**子函数执行节点(配合 InputAny**
```
NodeSubFunctionCall:
— 根据已注册的子函数定义,动态生成 InputAny/OutputAny 端口
— 端口类型由子函数定义中变量节点的泛型参数决定
— Manager 扫描所有文件注册子函数定义
```
### 3.9 现有节点迁移计划
| 旧节点 | 处理方式 | 说明 |
|---|---|---|
| `NodeStart` | 迁移:`Evaluate()``Loop()` | 启动后 Complete |
| `NodeEntry` | 同上 | — |
| `NodeMath` | **扩展为多类型版本**3.5.2 | 旧版删除 |
| `NodeConstFloat/V2/V3/Color` | **合并为 `NodeConst`**3.5.1 | 四个节点合一,旧版全部删除 |
| `NodeSplitV2/V3` | **合并为 `NodeSplit`**3.5.3 | 两个节点合一 |
| `NodeCombineV2/V3` | **合并为 `NodeCombine`**3.5.4 | 两个节点合一 |
| `NodeForLoop` | 大改Rect 容器 + 子控制器 | count 改用 InputAny |
| `NodeForEach<T>` | 类似 ForLoop 改造 | — |
| `NodeBranch` | 迁移到 Loop()condition 改用 InputAny | 支持 float/int 条件 |
| `NodeGameElement` / `NodeSetTransform` / `NodeClone` 等 | 生命周期适配Signal 等待逻辑不变 | — |
| `NodeVariable<T>` | 特殊处理:立即 Complete不经过 Hang | 保持泛型不变 |
| `NodeDebugLog` / `NodeLog` | 迁移InputAny 支持任意显示类型 | — |
| `NodeList<T>` / `NodeListAdd<T>` / `NodeListGet<T>` | 保持泛型Loop() 适配 | — |
| `NodePositionStepper` | 迁移,参数改用 InputAny | — |
| **新增** `NodeLerp` | 全新 | — |
| **新增** `NodeCompare` | 全新 | — |
| **新增** `NodeSelect` | 全新 | — |
| **新增** `NodeSet` | 全新(需要反向写入能力) | — |
---
## 四、实施步骤建议
1. **Phase 1: 核心类型层** — 修改 `NodeCore.cs`
- 新增 `NodeStatus` 枚举
- `NodeBase` 新增 `Loop()``L``Status`
- `Input<T>` / `Output<T>` 改为拉取模式
- 实现 `InputAny``OutputAny``OnTypePropagated``IsFixedType`
2. **Phase 2: Manager 调度层** — 修改 `NodeManager.cs`
- 实现触发表/运行时表
- 实现 `RunCycle()` 循环调度
- 实现 L 值计算 + 连线验证
- 实现 `TryConnect` 中的 InputAny 类型锁定传播流程
3. **Phase 3: 统一节点实现** — 删除旧重复节点,实现新版
- 先实现 `NodeConst``NodeMath`(验证 InputAny 机制可用)
- 再实现 `NodeSplit``NodeCombine``NodeLerp`
- `NodeCompare``NodeSelect``NodeSet`(反向写入)
- 迁移保留的节点(`NodeStart``NodeBranch``NodeVariable<T>` 等)
4. **Phase 4: 循环/子函数** — Rect 容器 + 子控制器
- `NodeUIBuilder` 增加 Rect 容器支持
- 循环节点子控制器实现
- 子函数定义/执行节点 + Manager 注册扫描
5. **Phase 5: 测试 & 清理**
- 验证保存/加载兼容(含新旧类型映射)
- 删除旧版备份文件 `NodeBase.cs.bak`
- 删除旧节点类(`NodeConstFloat` 等)
- 验证所有节点类型覆盖无遗漏
---
## 五、风险点 & 注意事项
- **UI 不变原则**`NodeObject``ConnectorSlot``NodeUIBuilder` 的接口保持稳定,节点层改动不应破坏 UI 渲染ConnectorSlot 仅新增 `RefreshAppearance()`
- **InputAny 类型冲突**:同一节点两个已连线的 InputAny 类型不一致时Manager 拒绝并报错
- **反向写入**`NodeSet` 的 targetRef 需要能修改上游 Variable 内部值,这是 InputAny 设计的关键难点
- **向后兼容**:旧 JSON 中的 `NodeConstFloat` 等类型名加载时需映射到新的 `NodeConst`
- **循环嵌套**:子控制器设计需考虑循环内嵌套循环的递归情况
- **Performance**:大图时每帧遍历运行时表的开销,类型检查用 `Type` 引用比较(非字符串)
- **Signal 类型**:保留但不参与 InputAny 的类型传播

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1091d96afa6e6e940a40f1345a5225f8
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,329 @@
# NodeScript 系统总览
## 文件结构
```
Editor Tools/NodeScript/
├── NodeCore.cs # 核心类型:生命周期、连接器、动态类型
├── NodeManager.cs # 调度中心 + UI 交互
├── NodeObject.cs # MonoBehaviour节点 UI、插槽、选中、状态显示
├── ConnectorSlot.cs # 连接点交互 + 外观刷新
├── NodeUIBuilder.cs # UI 构建Dropdown / FloatField / Toggle / TypeDropdown
├── NodeCompoments/
│ ├── NodeCompoment.cs # 操作 / 控制流节点
│ └── NodeUtility.cs # 工具 / 常量 / 变量节点
├── Node重构.txt # 重构需求文档
├── Node重构大纲.md # 详细重构设计
└── 总览.md # 本文件
```
---
## 一、执行模型:拉取式 + 生命周期
### 1.1 周期调度
```
RunGraph():
1. ComputeLValues() — BFS 算所有节点到 Start 的最短距离 L
2. triggerTable = {全部节点}
3. while triggerTable runtimeTable 非空:
RunCycle()
RunCycle():
1. triggerTable 并入 runtimeTable清空 triggerTable
2. foreach node in runtimeTable:
result = node.Loop()
收集 triggers → triggerTable
if TriggerDownstream → 自动发现下游节点 → triggerTable
if RemoveFromRuntime → 标记移除
3. runtimeTable -= 已完成的节点
```
### 1.2 节点状态
| 状态 | 含义 |
|---|---|
| `Ready` | 等待本周期执行 |
| `Hang` | 前置节点未完成,挂起到下一周期 |
| `Complete` | 已完成,移出 runtimeTable |
### 1.3 LoopResult 返回类型
| 工厂方法 | RemoveFromRuntime | TriggerDownstream | 用途 |
|---|---|---|---|
| `Complete()` | true | true | 节点完成,触发下游 |
| `Hang(preceding)` | false | false | 等待前置节点 |
| `Repeat()` | false | true | 保持活跃+触发下游(循环迭代) |
| `Wait()` | false | false | 空转一周期(循环等下游消费) |
### 1.4 L 值
- BFS 从 `NodeStart`/`NodeEntry` 开始计算L 值显示在节点标题栏 `(L:N)`
- 仅显示,不约束连线
- L=-1 表示孤立节点(无路径可达)
### 1.5 防自循环
连线 A→B 时,从 B 出发沿现有边 DFS看能否回到 A。能回到则拒绝连线。
---
## 二、类型系统
### 2.1 连接器体系
```
IInput IOutput
├── Input<T> (泛型) ├── Output<T> (泛型)
└── InputAny (动态) └── OutputAny (动态)
```
### 2.2 InputAny / OutputAny
| 特性 | 说明 |
|---|---|
| 初始状态 | `DataType = null`,连接点显示**灰色** |
| 连线锁定 | 连线后自动 `LockType(T)`,连接点变为类型对应颜色 |
| 类型传播 | 锁定后 `OnTypePropagated(T)` → 同节点其他未锁定端口跟随 |
| `IsFixedType` | true 时阻止传播覆盖,如 `NodeLerp.t` 固定为 float |
| 可改类型 | `LockType` 允许覆盖(防止 `NodeConst` 切换类型后 DataType 不更新) |
### 2.3 Input<T> 拉取模型
- `Value` 优先读 `Output<T>._value`,回退读 `OutputAny`
- `ConnectAny(IOutput)` 支持 `OutputAny → Input<T>` 桥接(如 `NodeConst → NodeMath.a`
- `GetSourceNode()` 兼容两种源
### 2.4 Output<T> 反向写入
- `_writeBack` 回调:`NodeSet` 通过 targetRef 修改 `NodeVariable` 的内部值
### 2.5 类型兼容表
| from | to | 兼容 |
|---|---|---|
| null | * | ✓(未锁定端口) |
| T | T | ✓ |
| int | float | ✓ |
| float | int | ✓ |
| 其他 | 其他 | ✗ |
### 2.6 类型颜色
| 类型 | 颜色 |
|---|---|
| float | 蓝 |
| int | 青 |
| bool | 橙 |
| string | 紫 |
| Vector2 | 黄 |
| Vector3 | 绿 |
| Color | 粉 |
| GameElement | 深紫 |
| Signal | 白 |
| List\<GameElement\> | 暗紫 |
| null未锁定 | 灰 |
---
## 三、节点目录
### 3.1 入口节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeStart` | — | `exec(Signal)`, `element(GameElement)` | 图入口,绑定当前选中元素 |
| `NodeEntry` | — | `exec(Signal)` | 纯信号入口 |
### 3.2 运算节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeMath` | `a(Any)`, `b(Any, fixed)` | `result(Any)` | +-*/ 四则,支持 float/int/V2/V3/Color/string |
| `NodeLerp` | `a(Any)`, `b(Any)`, `t(float,fixed)` | `result(Any)` | 线性插值t 未连默认 0.5 |
| `NodeCompare` | `a(Any)`, `b(Any)` | `result(bool)` | == != > < >= <= |
### 3.3 向量节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeSplit` | `input(Any)` | `x/y/z/w(float)` | V2 输出 xyV3 输出 xyzColor 输出 rgba |
| `NodeCombine` | `x/y/z/w(float)` | `output(Any)` | UI 选类型后合并为 V2/V3/Color |
| `NodeGetTransform` | `element(GE)` | `pos/rot/scl(V3)` | 读取元素变换 |
| `NodeSetTransform` | `exec(Sig)`, `element(GE)`, `Pos/Rot/Scl(V3)` | — | 设置元素变换 |
### 3.4 数据节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeConst` | — | `value(Any)` | UI 选类型+填值6 种类型统一 |
| `NodeVariable<T>` | `signal(Sig)`, `set(T)` | `get(T)` | 变量存储;`signal` 连着时等触发才更新 |
| `NodeSet` | `targetRef(Any)`, `value(Any)` | — | 反向写入 targetRef 指向的变量 |
| `NodeSelect` | `cond(Any)`, `true(Any)`, `false(Any)` | `result(Any)` | 二选一cond 未连用 UI Toggle |
### 3.5 控制流节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeBranch` | `exec(Sig)`, `cond(Any)` | `true/false(Sig)` | cond>0 走 true否则 false |
| `NodeForLoop` | `exec(Sig)`, `count(Any)` | `loopBody(Sig)`, `index(int)`, `completed(Sig)` | 多周期交替输出→Wait→输出→Wait... |
### 3.6 集合节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeList<T>` | — | `output(List<T>)` | 空列表 |
| `NodeListAdd<T>` | `list(List<T>)`, `item(T)` | `output(List<T>)` | 追加元素 |
| `NodeListGet<T>` | `list(List<T>)`, idx(UI) | `element(T)` | 索引取值 |
| `NodeForEach` | `exec(Sig)`, `list(Any)` | `loopBody(Sig)`, `current(Any)`, `index(int)`, `completed(Sig)` | **非泛型**,连 `List<X>` 自动锁定 current 为 X |
### 3.7 GameElement 操作
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeGameElement` | `exec(Sig)`, `Root(GE)`, `Source(GE)` | `newElement(GE)`, `completed(Sig)` | 复制粘贴元素 |
| `NodeChildByIndex` | `parent(GE)`, idx(UI) | `child(GE)` | 子元素按索引 |
| `NodeChildCount` | `parent(GE)` | `count(int)` | 子元素个数 |
| `NodeClone` | `exec(Sig)`, `source(GE)` | `clone(GE)` | Instantiate 克隆 |
### 3.8 调试节点
| 节点 | 输入 | 输出 | 说明 |
|---|---|---|---|
| `NodeDebugLog` | `exec(Sig)`, `value(Any)` | — | 带 Signal 等待的日志 |
| `NodeLog` | `value(Any)` | — | 直接打印日志 |
---
## 四、所有节点统一规范
每个节点的 `Loop()` 遵循:
```csharp
public override LoopResult Loop()
{
// 1. 无输入直接 Complete
// 2. EnsureInputsReady() — 所有已连输入的上游必须 Complete
// 3. 取值 → 计算 → 设输出
// 4. 返回 Complete / Repeat / Wait
}
```
`EnsureInputsReady()``NodeBase` 上定义,自动检查 `GetPrecedingNodes()` 中所有上游的 Status。
---
## 五、UI 特性
### 5.1 节点外观
- 半透明背景 + 标题栏 `Name (L:N)`
- `statusImage`Ready 灰 / Hang 橙黄 / Complete 绿
- 选中节点蓝色高亮
### 5.2 连接线
- `UILineRenderer` 贝塞尔曲线
- 手动距离检测悬停(不依赖 Unity 射线)
- 悬停加粗 +3px选中加粗 ×2
- RectTransform 自动缩放到包围盒
- 拖线时 dragLine 不参与射线
### 5.3 交互
| 操作 | 功能 |
|---|---|
| 左键空白 | 取消所有选中 |
| 左键节点 | 选中节点Shift 多选) |
| 左键拖节点 | 移动节点 |
| 左键拖输出点→输入点 | 连线 |
| 左键线 | 选中线Shift 多选) |
| 中键拖面板 | 平移整个画布 |
| Ctrl+右键 | 右键菜单创建节点 |
| Delete | 删除选中 |
### 5.4 快捷键
| 快捷键 | 功能 |
|---|---|
| `F3` | 新建/销毁 NodeScript 编辑器 |
| `Enter` | 完整运行图 |
| `Shift+Enter` | 单步调试(首次初始化) |
| `Esc` | 退出调试模式 |
| `Ctrl+Enter` | 运行图(保留) |
| `F5` | 拓扑预览(打印分层执行计划) |
| `F1` | 保存 |
| `F2` | 加载 |
| `Ctrl+C/V` | 复制/粘贴节点 |
| `Delete` | 删除选中 |
### 5.5 控制台命令
| 命令 | 说明 |
|---|---|
| `newNode` | 新建/销毁 NodeScript 编辑器 |
| `saveNode` | 保存到默认 `graph.json` |
| `saveNode name` | 另存为 `{name}.json` |
| `loadNode name` | 从 `{name}.json` 加载 |
---
## 六、调试功能
### 6.1 单步调试 (Shift+Enter)
每步打印详细日志:
```
=== Step 3 ===
✓ NodeStart (L:0) → Complete
⏳ NodeMath (L:1) → Hang
▶ NodeBranch (L:2) → Ready
triggers pending: 2, still running: 3
```
`statusImage` 同步变色。
### 6.2 拓扑预览 (F5)
```
═══ Topological Order (BFS layers) ═══
Layer 0 (2 nodes, 3 downstream wires): Start(L:0), Entry(L:0)
Layer 1 (1 nodes, 2 downstream wires): NodeMath(L:1)
...
Unreachable (1 nodes): OrphanConst
Total: 6 nodes, 5 wires, 3 layers
```
---
## 七、NodeManager 关键 API
| 方法 | 说明 |
|---|---|
| `Init(GameElement)` | 绑定元素 + 创建 Start 节点 |
| `RunGraph()` | 完整执行(生命周期循环) |
| `ComputeLValues()` | 重算所有节点的 L 值 + 刷新标题 |
| `SaveToFile(string?)` | 保存图null 用默认路径 |
| `LoadFromFile(string?)` | 加载图 |
| `GetSavePath(string)` | 获取完整保存路径 |
---
## 八、文件存储
| 项目 | 路径 |
|---|---|
| 保存目录 | `Assets/StreamingAssets/NodeScript/` |
| 默认文件 | `graph.json` |
| 自定义文件 | `{name}.json` |
---
## 九、待完成 (Phase 4+)
- [ ] Rect 容器(循环 / 子函数体内嵌区域)
- [ ] 子控制器(循环体内节点独立调度)
- [ ] `NodeSubFunctionDef` / `NodeSubFunctionCall`
- [ ] Manager 扫描注册子函数定义

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 77e5a38d58b4a674ca00977979b575d5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -61,6 +61,8 @@ public class SimpleGridController : MonoBehaviour
} }
} }
GameObject coordTextObj = null; GameObject coordTextObj = null;
[System.Obsolete]
IEnumerator Pressing() IEnumerator Pressing()
{ {
if (coordTextObj != null) if (coordTextObj != null)

View File

@@ -81,6 +81,8 @@ namespace Ichni.RhythmGame
public GameObject graphicalFlexibleFloatWindow; public GameObject graphicalFlexibleFloatWindow;
public GameObject QuickMoveObj; public GameObject QuickMoveObj;
public GameObject NodeEditor;
//采音器 //采音器
[Title("Background相关")] public Sprite defaultBackground; [Title("Background相关")] public Sprite defaultBackground;

View File

@@ -109,6 +109,8 @@ Shader "Soullies/BlendUnlit"
float4 _MainTex_ST; float4 _MainTex_ST;
half4 _BaseColor; half4 _BaseColor;
half4 _EmissionColor; half4 _EmissionColor;
float _EnableEmission;
float _UseRedAsAlpha;
float _ZWrite; float _ZWrite;
float _SrcBlendRGB; float _SrcBlendRGB;
float _DstBlendRGB; float _DstBlendRGB;

View File

@@ -43,6 +43,7 @@ namespace SLSUtilities.Rendering.PostProcessing
public override string GetShaderName() => "SLS/Postprocessing/AnimeBloom"; public override string GetShaderName() => "SLS/Postprocessing/AnimeBloom";
[System.Obsolete]
public override void Render(CommandBuffer cmd, ref RenderingData renderingData, RTHandle source, RTHandle destination) public override void Render(CommandBuffer cmd, ref RenderingData renderingData, RTHandle source, RTHandle destination)
{ {
if (material == null) return; if (material == null) return;
@@ -59,7 +60,7 @@ namespace SLSUtilities.Rendering.PostProcessing
// 2. 初始化金字塔数组 // 2. 初始化金字塔数组
int iterations = Mathf.Clamp(diffusion.value, 1, k_MaxPyramidSize); int iterations = Mathf.Clamp(diffusion.value, 1, k_MaxPyramidSize);
// 确保 RT 数组大小足够 // 确保 RT 数组大小足够
if (_bloomPyramidUp == null || _bloomPyramidUp.Length != k_MaxPyramidSize) if (_bloomPyramidUp == null || _bloomPyramidUp.Length != k_MaxPyramidSize)
{ {
@@ -71,7 +72,7 @@ namespace SLSUtilities.Rendering.PostProcessing
// 先降一半分辨率,节省性能且增加模糊感 // 先降一半分辨率,节省性能且增加模糊感
desc.width = Mathf.Max(1, desc.width >> 1); desc.width = Mathf.Max(1, desc.width >> 1);
desc.height = Mathf.Max(1, desc.height >> 1); desc.height = Mathf.Max(1, desc.height >> 1);
RenderingUtils.ReAllocateIfNeeded(ref _bloomPyramidDown[0], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_BloomMipDown0"); RenderingUtils.ReAllocateIfNeeded(ref _bloomPyramidDown[0], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_BloomMipDown0");
RenderingUtils.ReAllocateIfNeeded(ref _bloomPyramidUp[0], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_BloomMipUp0"); RenderingUtils.ReAllocateIfNeeded(ref _bloomPyramidUp[0], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_BloomMipUp0");
@@ -105,7 +106,7 @@ namespace SLSUtilities.Rendering.PostProcessing
// Upsample Pass 会混合Up[i+1] (Blur) + Down[i] (High Res Detail) // Upsample Pass 会混合Up[i+1] (Blur) + Down[i] (High Res Detail)
// 这里我们稍微简化逻辑:直接把 Up[i+1] 升采样并叠加到 Up[i] 上 // 这里我们稍微简化逻辑:直接把 Up[i+1] 升采样并叠加到 Up[i] 上
// 为了保留细节Dual Kawase 通常是将 Up[i+1] 叠加回 Down[i] 存入 Up[i] // 为了保留细节Dual Kawase 通常是将 Up[i+1] 叠加回 Down[i] 存入 Up[i]
// 第一步:先把 Down[i] 拷进 Up[i] 作为底图 // 第一步:先把 Down[i] 拷进 Up[i] 作为底图
Blitter.BlitCameraTexture(cmd, _bloomPyramidDown[i], _bloomPyramidUp[i]); Blitter.BlitCameraTexture(cmd, _bloomPyramidDown[i], _bloomPyramidUp[i]);
@@ -117,11 +118,11 @@ namespace SLSUtilities.Rendering.PostProcessing
// 6. Composite (合成) // 6. Composite (合成)
// 此时 _bloomPyramidUp[0] 包含了最终的泛光纹理 // 此时 _bloomPyramidUp[0] 包含了最终的泛光纹理
material.SetTexture(InternalShaderHelpers.ID._BloomTex, _bloomPyramidUp[0]); material.SetTexture(InternalShaderHelpers.ID._BloomTex, _bloomPyramidUp[0]);
// Source + BloomTex -> Destination // Source + BloomTex -> Destination
Blitter.BlitCameraTexture(cmd, source, destination, material, 3); Blitter.BlitCameraTexture(cmd, source, destination, material, 3);
} }
// 清理 RT // 清理 RT
public void Dispose() public void Dispose()
{ {

View File

@@ -6542,7 +6542,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "e0826066-f704-49f3-8dae-188caba068d6" "value" : "3bb5d7e6-28a5-4c40-a8e8-c069ac01554e"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -6565,7 +6565,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "e0826066-f704-49f3-8dae-188caba068d6" "value" : "3bb5d7e6-28a5-4c40-a8e8-c069ac01554e"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -6604,7 +6604,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "e0826066-f704-49f3-8dae-188caba068d6" "value" : "3bb5d7e6-28a5-4c40-a8e8-c069ac01554e"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
@@ -17298,7 +17298,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "ad820b77-f7b1-497f-ae6a-35655b7b4733" "value" : "06a75739-ea8f-4568-9c7d-997c69832326"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -17321,7 +17321,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "ad820b77-f7b1-497f-ae6a-35655b7b4733" "value" : "06a75739-ea8f-4568-9c7d-997c69832326"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -17360,7 +17360,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "ad820b77-f7b1-497f-ae6a-35655b7b4733" "value" : "06a75739-ea8f-4568-9c7d-997c69832326"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp",
@@ -135933,7 +135933,7 @@
"patternSizeX" : 0.5, "patternSizeX" : 0.5,
"patternSizeY" : 2, "patternSizeY" : 2,
"gridDensity" : 0.2, "gridDensity" : 0.2,
"timeAngle" : 1, "timeAngle" : 0.02,
"stepA" : 0.21, "stepA" : 0.21,
"stepB" : 0.19, "stepB" : 0.19,
"baseSpeed" : 0.2, "baseSpeed" : 0.2,
@@ -136152,6 +136152,235 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd" "value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMConstellation_BM,Assembly-CSharp",
"maxParticles" : 10,
"maxLineCount" : 12,
"spreadSize" : {
"x" : 20,
"y" : 20,
"z" : 20
},
"maxConnectionsPerStar" : 3,
"maxConnectionDistance" : 20,
"activeStarSize" : 1,
"lineWidth" : 0.1,
"orbitalVelocity" : {
"x" : 0,
"y" : 0,
"z" : 0.1
},
"angularVelocity" : 60,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_ConstellationCube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 50
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : true,
"originalEmissionColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"originalEmissionIntensity" : 2,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.BasicEnvironmentObject_BM,Assembly-CSharp",
"shadowThreshold" : 0,
"shadowSmoothness" : 0.1,
"useWorldLight" : false,
"fakeLightDir" : {
"x" : 0.5,
"y" : 1,
"z" : 0.5
},
"isStatic" : false,
"themeBundleName" : "basic",
"objectName" : "Cube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
} }
], ],
"attachedElementGuid" : { "attachedElementGuid" : {

View File

@@ -6542,7 +6542,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "6e047986-932a-476a-816f-2ee7620d1f48" "value" : "7f4d121f-3c34-4f69-af24-8bc2c3aab03d"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -6565,7 +6565,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "6e047986-932a-476a-816f-2ee7620d1f48" "value" : "7f4d121f-3c34-4f69-af24-8bc2c3aab03d"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -6604,7 +6604,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "6e047986-932a-476a-816f-2ee7620d1f48" "value" : "7f4d121f-3c34-4f69-af24-8bc2c3aab03d"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
@@ -17298,7 +17298,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "36efdccf-d930-4370-b839-169c62cab445" "value" : "cf87f38d-4ac2-4282-8afc-79881ff3b5fc"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -17321,7 +17321,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "36efdccf-d930-4370-b839-169c62cab445" "value" : "cf87f38d-4ac2-4282-8afc-79881ff3b5fc"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -17360,7 +17360,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "36efdccf-d930-4370-b839-169c62cab445" "value" : "cf87f38d-4ac2-4282-8afc-79881ff3b5fc"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp",
@@ -135933,7 +135933,7 @@
"patternSizeX" : 0.5, "patternSizeX" : 0.5,
"patternSizeY" : 2, "patternSizeY" : 2,
"gridDensity" : 0.2, "gridDensity" : 0.2,
"timeAngle" : 0.5746485, "timeAngle" : 0.02,
"stepA" : 0.21, "stepA" : 0.21,
"stepB" : 0.19, "stepB" : 0.19,
"baseSpeed" : 0.2, "baseSpeed" : 0.2,
@@ -136152,6 +136152,235 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd" "value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMConstellation_BM,Assembly-CSharp",
"maxParticles" : 10,
"maxLineCount" : 12,
"spreadSize" : {
"x" : 20,
"y" : 20,
"z" : 20
},
"maxConnectionsPerStar" : 3,
"maxConnectionDistance" : 20,
"activeStarSize" : 1,
"lineWidth" : 0.1,
"orbitalVelocity" : {
"x" : 0,
"y" : 0,
"z" : 0.1
},
"angularVelocity" : 60,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_ConstellationCube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 50
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : true,
"originalEmissionColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"originalEmissionIntensity" : 2,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.BasicEnvironmentObject_BM,Assembly-CSharp",
"shadowThreshold" : 0,
"shadowSmoothness" : 0.1,
"useWorldLight" : false,
"fakeLightDir" : {
"x" : 0.5,
"y" : 1,
"z" : 0.5
},
"isStatic" : false,
"themeBundleName" : "basic",
"objectName" : "Cube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
} }
], ],
"attachedElementGuid" : { "attachedElementGuid" : {

View File

@@ -6542,7 +6542,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "937076ce-693e-47f4-a50d-9ea5da927ea6" "value" : "db2a06c4-771d-4328-9334-fd1ceade2bd3"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -6565,7 +6565,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "937076ce-693e-47f4-a50d-9ea5da927ea6" "value" : "db2a06c4-771d-4328-9334-fd1ceade2bd3"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -6604,7 +6604,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "937076ce-693e-47f4-a50d-9ea5da927ea6" "value" : "db2a06c4-771d-4328-9334-fd1ceade2bd3"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
@@ -17298,7 +17298,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "93e473f2-36f6-4120-b566-f2b09e019f08" "value" : "2a2ebc7d-8f3d-4451-981f-2e213562dbc5"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -17321,7 +17321,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "93e473f2-36f6-4120-b566-f2b09e019f08" "value" : "2a2ebc7d-8f3d-4451-981f-2e213562dbc5"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -17360,7 +17360,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "93e473f2-36f6-4120-b566-f2b09e019f08" "value" : "2a2ebc7d-8f3d-4451-981f-2e213562dbc5"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp",
@@ -136152,6 +136152,235 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd" "value" : "a646d4b0-b5c4-423f-a8e8-3ba9757ed0fd"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMConstellation_BM,Assembly-CSharp",
"maxParticles" : 10,
"maxLineCount" : 12,
"spreadSize" : {
"x" : 20,
"y" : 20,
"z" : 20
},
"maxConnectionsPerStar" : 3,
"maxConnectionDistance" : 20,
"activeStarSize" : 1,
"lineWidth" : 0.1,
"orbitalVelocity" : {
"x" : 0,
"y" : 0,
"z" : 0.1
},
"angularVelocity" : 60,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_ConstellationCube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
},
"attachedElementGuid" : {
"value" : "80fbc906-a82c-4f44-81de-17a80b0a04d8"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 50
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : true,
"originalEmissionColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"originalEmissionIntensity" : 2,
"attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.BasicEnvironmentObject_BM,Assembly-CSharp",
"shadowThreshold" : 0,
"shadowSmoothness" : 0.1,
"useWorldLight" : false,
"fakeLightDir" : {
"x" : 0.5,
"y" : 1,
"z" : 0.5
},
"isStatic" : false,
"themeBundleName" : "basic",
"objectName" : "Cube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
} }
], ],
"attachedElementGuid" : { "attachedElementGuid" : {

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8c689076f81e86c49944e9cd5f9cb0e1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,113 @@
{
"startElementGuid": "f354bc7c-7ccf-434a-aac4-dc0002e41986",
"nodes": [
{
"typeName": "Ichni.NodeScript.NodeStart",
"posX": -507.8431701660156,
"posY": 225.49020385742188,
"fieldValues": [
{
"key": "NodeName",
"json": "{}"
},
{
"key": "nodeObject",
"json": "{\"TitleText\":{\"instanceID\":-974546},\"statusImage\":{\"instanceID\":-974522},\"inputsRoot\":{\"instanceID\":-974564},\"outputsRoot\":{\"instanceID\":-974592},\"middleRoot\":{\"instanceID\":-974578},\"connectorSlotPrefabI\":{\"instanceID\":70946},\"connectorSlotPrefabO\":{\"instanceID\":70966},\"dropdownPrefab\":{\"instanceID\":71274},\"inputPrefab\":{\"instanceID\":71276}}"
}
]
},
{
"typeName": "Ichni.NodeScript.NodeConst",
"posX": -479.7438659667969,
"posY": -3.097003936767578,
"fieldValues": [
{
"key": "floatVal",
"json": "{}"
},
{
"key": "intVal",
"json": "{}"
},
{
"key": "boolVal",
"json": "{}"
},
{
"key": "vector2Val",
"json": "{\"x\":0.0,\"y\":0.0}"
},
{
"key": "vector3Val",
"json": "{\"x\":0.0,\"y\":0.0,\"z\":0.0}"
},
{
"key": "colorVal",
"json": "{\"r\":0.0,\"g\":0.0,\"b\":0.0,\"a\":0.0}"
},
{
"key": "NodeName",
"json": "{}"
},
{
"key": "nodeObject",
"json": "{\"TitleText\":{\"instanceID\":-979666},\"statusImage\":{\"instanceID\":-979642},\"inputsRoot\":{\"instanceID\":-979684},\"outputsRoot\":{\"instanceID\":-979712},\"middleRoot\":{\"instanceID\":-979698},\"connectorSlotPrefabI\":{\"instanceID\":70946},\"connectorSlotPrefabO\":{\"instanceID\":70966},\"dropdownPrefab\":{\"instanceID\":71274},\"inputPrefab\":{\"instanceID\":71276}}"
}
]
},
{
"typeName": "Ichni.NodeScript.NodeForLoop",
"posX": -79.74382781982422,
"posY": 230.23634338378907,
"fieldValues": [
{
"key": "NodeName",
"json": "{}"
},
{
"key": "nodeObject",
"json": "{\"TitleText\":{\"instanceID\":-981980},\"statusImage\":{\"instanceID\":-981956},\"inputsRoot\":{\"instanceID\":-981998},\"outputsRoot\":{\"instanceID\":-982026},\"middleRoot\":{\"instanceID\":-982012},\"connectorSlotPrefabI\":{\"instanceID\":70946},\"connectorSlotPrefabO\":{\"instanceID\":70966},\"dropdownPrefab\":{\"instanceID\":71274},\"inputPrefab\":{\"instanceID\":71276}}"
}
]
},
{
"typeName": "Ichni.NodeScript.NodeLog",
"posX": 428.0993347167969,
"posY": 218.4716796875,
"fieldValues": [
{
"key": "prefix",
"json": "{}"
},
{
"key": "NodeName",
"json": "{}"
},
{
"key": "nodeObject",
"json": "{\"TitleText\":{\"instanceID\":-985046},\"statusImage\":{\"instanceID\":-985022},\"inputsRoot\":{\"instanceID\":-985064},\"outputsRoot\":{\"instanceID\":-985092},\"middleRoot\":{\"instanceID\":-985078},\"connectorSlotPrefabI\":{\"instanceID\":70946},\"connectorSlotPrefabO\":{\"instanceID\":70966},\"dropdownPrefab\":{\"instanceID\":71274},\"inputPrefab\":{\"instanceID\":71276}}"
}
]
}
],
"wires": [
{
"fromNodeIdx": 0,
"toNodeIdx": 2,
"fromOutput": "exec",
"toInput": "exec"
},
{
"fromNodeIdx": 1,
"toNodeIdx": 2,
"fromOutput": "value",
"toInput": "count"
},
{
"fromNodeIdx": 2,
"toNodeIdx": 3,
"fromOutput": "index",
"toInput": "value"
}
]
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5854089025145e3489d4983a422ca534
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -6542,7 +6542,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "c774e764-b1cf-41a1-983c-18b7d3d718fd" "value" : "9ae40b59-296d-41e8-b9dd-744f5c5a670b"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -6565,7 +6565,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "c774e764-b1cf-41a1-983c-18b7d3d718fd" "value" : "9ae40b59-296d-41e8-b9dd-744f5c5a670b"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -6604,7 +6604,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "c774e764-b1cf-41a1-983c-18b7d3d718fd" "value" : "9ae40b59-296d-41e8-b9dd-744f5c5a670b"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
@@ -17298,7 +17298,7 @@
], ],
"elementGuid" : { "elementGuid" : {
"value" : "ba52c2aa-5d65-4569-ba47-e0f3bcd6ae6d" "value" : "88de83ac-2347-4431-a27f-ada697b6ada3"
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75" "value" : "16dd9f1a-d9fe-45c1-b194-040d687f2c75"
@@ -17321,7 +17321,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "ba52c2aa-5d65-4569-ba47-e0f3bcd6ae6d" "value" : "88de83ac-2347-4431-a27f-ada697b6ada3"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -17360,7 +17360,7 @@
] ]
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "ba52c2aa-5d65-4569-ba47-e0f3bcd6ae6d" "value" : "88de83ac-2347-4431-a27f-ada697b6ada3"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Flick_BM,Assembly-CSharp",
@@ -136271,6 +136271,116 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b" "value" : "c6a0218a-423f-4dbe-9cbb-07e7281b482b"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.BasicEnvironmentObject_BM,Assembly-CSharp",
"shadowThreshold" : 0,
"shadowSmoothness" : 0.1,
"useWorldLight" : false,
"fakeLightDir" : {
"x" : 0.5,
"y" : 1,
"z" : 0.5
},
"isStatic" : false,
"themeBundleName" : "basic",
"objectName" : "Cube",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
},
"attachedElementGuid" : {
"value" : "f354bc7c-7ccf-434a-aac4-dc0002e41986"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d321ddfa-d983-4343-9963-e67a1401a750"
}
} }
], ],
"attachedElementGuid" : { "attachedElementGuid" : {

View File

@@ -6,7 +6,7 @@
"creatorName" : "TRADER", "creatorName" : "TRADER",
"editorVersion" : "0.1.0", "editorVersion" : "0.1.0",
"createTime" : "2026\/2\/15 10:43:24", "createTime" : "2026\/2\/15 10:43:24",
"lastSaveTime" : "4\/14\/2026 1:15:27 PM", "lastSaveTime" : "2026\/5\/17 15:54:09",
"selectedThemeBundleList" : [ "selectedThemeBundleList" : [
"basic","departure_to_multiverse" "basic","departure_to_multiverse"
], ],

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 73e89c312049afd42ae0dff1f8cde848
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,82 @@
# Change Log
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/).
## Release 2.3.2 - Rejuvenation - 2023/11/26
2023 is certainly an interesting year to keep you on your toes, and finding time to keep managing all the requests and updates that come in are taking their toll, especially for a FREE project, but nonetheless, I still do it.
Mainly bugfixes for the end of year update, promoting some resolutions that have been verified and tested since the last release.
To get up to speed with the Unity UI Extensions, check out the [Getting Started](https://unity-ui-extensions.github.io/GettingStarted.html) Page.
> Ways to get in touch:
>
> - [GitHub Discussions](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/discussions), if you have any questions, queries or suggestions
> - [Gitter Chat](https://gitter.im/Unity-UI-Extensions/Lobby) site for the UI Extensions project
>
> Much easier that posting a question / issue on YouTube, Twitter or Facebook :D
## Breaking changes
For customers upgrading from earlier versions of Unity to Unity 2020, please be aware of the Breaking change related to Text Based components. You will need to manually replace any UI using the older ```Text``` component and replace them with ```TextMeshPro``` versions. This is unavoidable due to Unity deprecating the Text component.
> New users to 2022 are unaffected as all the Editor commands have been updated to use the newer TextMeshPro versions.
For more details, see the [deprecation notice](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/discussions/428) on GitHub.
## Added
- Add CalculatePointOnCurve for uilinerenderer (@victornor)
## Changed
- fix: Fixed an null reference exception with the ResetSelectableHighlight (@FejZa)
- fix: Resolved an issue where the last line in a flow layout group would overflow the rect bounds.
- fix: GetPosition when Segments is null (@victornor)
- fix: Fix Bug! NicerOutline color.a Loss when m_UseGraphicAlpha is true (wanliyun)
- fix: Update to force Enumerated start for Accordion elements, Resolves: #455
- Added argument to the UpdateLayout method for the HSS/VSS to move to a new starting page.
- Updated implementations to handle 2023 support, with 2023 moving in to public release.
- Added extra event on the AutoCompleteComboBox, to fire when an item in the list is selected, with its display name.
- FlowLayoutGroup components updated to latest (likely the last as the author has stopped development)
## Deprecated
- All deprecated Text based components now have "obsolete" tags, to avoid breaking code. Note, these do not function in 2022 and above, as Unity have "changed" things. For any affected component, I recommend updating to use TextMeshPro native features.
## Additional Notes
### [Installation Instructions](https://unity-ui-extensions.github.io/UPMInstallation.html)
The recommended way to add the Unity UI Extensions project to your solution is to use the Unity package Manager. Simply use the Unity Package Manager to reference the project to install it
New for 2020, we have added OpenUPM support and the package can be installed using the following [OpenUPM CLI](https://openupm.com/docs/) command:
```cli
`openupm add com.unity.uiextensions`
```
> For more details on using [OpenUPM CLI, check the docs here](https://github.com/openupm/openupm-cli#installation).
- Unity Package Manager - manual
Alternatively, you can also add the package manually through the Unity package manager using the scope ```com.unity.uiextensions```, see the [Unity Package Manager docs](https://learn.unity.com/tutorial/the-package-manager) for more information.
- Unity 2018 or lower
The pre-compiled Unity assets are the only solution for Unity 2018 or earlier due to the changes in the Unity UI framework in Unity made for 2019.
Either clone / download this repository to your machine and then copy the scripts in, or use the pre-packaged .UnityPackage for your version of Unity and import it as a custom package in to your project.
### Upgrade Notes
### UPM
If you are using UPM to gain access to the Unity UI Extensions, then you only need to update to the latest version in the Package Manager, no other changes needed.
### Customers using the .UnityPackage
Due to the restructure of the package to meet Unity's new package guidelines, we recommend **Deleting the current Unity UI Extensions** folder prior to importing the new package.
For Unity 2019 users using the new UPM deployment, be sure to delete the existing folder in your assets folder before adding the new package to avoid conflict.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 03470ebba317a0549a5582f18f4d2383
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7a08421c5c57e4f44883b819982489d7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,102 @@
<!-- Offline documentation -->
# About Unity UI Extensions
The Unity UI Extensions project is a collection of extension scripts/effects and controls to enhance your Unity UI experience. This includes over 70+ controls, utilities, effects and some much-needed love to make the most out of the Unity UI system (formally uGUI) in Unity.
[Check out our Tumblr page for a sneak peek](https://www.tumblr.com/blog/unityuiextensions)
You can follow the UI Extensions team for updates and news on:
### [Twitter - #unityuiextensions](https://twitter.com/search?q=%23unityuiextensions) / [Facebook](https://www.facebook.com/UnityUIExtensions/) / [YouTube](https://www.youtube.com/@UnityUIExtensions)
> Ways to get in touch:
>
> - [Gitter Chat](https://gitter.im/Unity-UI-Extensions/Lobby) site for the UI Extensions project
> - [GitHub Discussions](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/discussions), if you have any questions, queries or suggestions
# Installing Unity UI Extensions
To install this package, follow the instructions in the Package Manager documentation.
For more details on [Getting Started](https://unity-ui-extensions.github.io/GettingStarted) please checkout the [online documentation here](https://unity-ui-extensions.github.io/).
# Using Unity UI Extensions
The UI Extensions project provides many automated functions to add the various controls contained within the project commonly accessed via "***GameObject -> UI -> Extensions -> 'Control'***" from the editor menu. This will add the UI object and all the necessary components to make that control work in the scene in a default state.
Some of the features are also available through the GameObject "Add Component" menu in the inspector.
For a full list of the controls and how they are used, please see the [online documentation](https://unity-ui-extensions.github.io/Controls.html) for the project.
# Technical details
## Requirements
This version of the Unity UI Extensions is compatible with the following versions of the Unity Editor:
- 2019 and above - the recommended path for 2019+ is to use the Unity Package Manager to get access to the package. Full details for installing via UPM can be [found here](https://unity-ui-extensions.github.io/UPMInstallation.html).
> Alternatively, the Asset packages have been tested to work with 2019 as well if you prefer to install that way.
- 2018 and below - for 2018 and use this package, you will have to import the asset package(s), either from the Asset Store or from the alternate download locations [listed here](https://unity-ui-extensions.github.io/Downloads).
## [Release Notes](https://unity-ui-extensions.github.io/ReleaseNotes/RELEASENOTES)
## Release 2.3.2 - Rejuvenation - 2023/11/26
2023 is certainly an interesting year to keep you on your toes, and finding time to keep managing all the requests and updates that come in are taking their toll, especially for a FREE project, but nonetheless, I still do it.
Mainly bugfixes for the end of year update, promoting some resolutions that have been verified and tested since the last release.
To get up to speed with the Unity UI Extensions, check out the [Getting Started](https://unity-ui-extensions.github.io/GettingStarted.html) Page.
> Ways to get in touch:
>
> - [GitHub Discussions](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/discussions), if you have any questions, queries or suggestions
> - [Gitter Chat](https://gitter.im/Unity-UI-Extensions/Lobby) site for the UI Extensions project
>
> Much easier that posting a question / issue on YouTube, Twitter or Facebook :D
## Breaking changes
For customers upgrading from earlier versions of Unity to Unity 2020, please be aware of the Breaking change related to Text Based components. You will need to manually replace any UI using the older ```Text``` component and replace them with ```TextMeshPro``` versions. This is unavoidable due to Unity deprecating the Text component.
> New users to 2022 are unaffected as all the Editor commands have been updated to use the newer TextMeshPro versions.
For more details, see the [deprecation notice](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/discussions/428) on GitHub.
## Added
- Add CalculatePointOnCurve for uilinerenderer (@victornor)
## Changed
- fix: Fixed an null reference exception with the ResetSelectableHighlight (@FejZa)
- fix: Resolved an issue where the last line in a flow layout group would overflow the rect bounds.
- fix: GetPosition when Segments is null (@victornor)
- fix: Fix Bug! NicerOutline color.a Loss when m_UseGraphicAlpha is true (wanliyun)
- fix: Update to force Enumerated start for Accordion elements, Resolves: #455
- Added argument to the UpdateLayout method for the HSS/VSS to move to a new starting page.
- Updated implementations to handle 2023 support, with 2023 moving in to public release.
- Added extra event on the AutoCompleteComboBox, to fire when an item in the list is selected, with its display name.
- FlowLayoutGroup components updated to latest (likely the last as the author has stopped development)
## Deprecated
- All deprecated Text based components now have "obsolete" tags, to avoid breaking code. Note, these do not function in 2022 and above, as Unity have "changed" things. For any affected component, I recommend updating to use TextMeshPro native features.
- [UI Extensions Issue log](https://github.com/Unity-UI-Extensions/com.unity.uiextensions/issues)
## Upgrade Notes
We recommend using the UPM delivery method. If you are using the Unity asset, there should be no issues updating but if you have a problem, just deleted the old Unity-UI-Extensions folder and import the asset new.
# Document revision history
|Date|Details|
|-|-|
|July 9th, 2020|2019.4 (v2.2) released, first UPM deployment live |
|September 3rd, 2019|2019.1 (v2.1) released, First major update for the 2.0 series.|
|August 8th, 2020|2019.4 (v2.2) released, New UPM Delivery.|
|October 10th, 2020|2019.5 (v2.2) released, New UPM fast delivery|
|February 7th, 2022|v2.3 released, New Home, UPM fast delivery via OpenUPM|

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 539edee228eb76c40a9a5a1f7a165130
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: b95396d565a2a7f478b12f8b9648ed8f
folderAsset: yes
timeCreated: 1467468503
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
///Credit ChoMPHi
///Sourced from - http://forum.unity3d.com/threads/accordion-type-layout.271818/
using UnityEditor;
using UnityEditor.UI;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(AccordionElement), true)]
public class AccordionElementEditor : ToggleEditor {
public override void OnInspectorGUI()
{
this.serializedObject.Update();
EditorGUILayout.PropertyField(this.serializedObject.FindProperty("m_MinHeight"));
this.serializedObject.ApplyModifiedProperties();
base.serializedObject.Update();
EditorGUILayout.PropertyField(base.serializedObject.FindProperty("m_IsOn"));
EditorGUILayout.PropertyField(base.serializedObject.FindProperty("m_Interactable"));
base.serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8882b502b0c65b24ba4623d6a383815b
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View File

@@ -0,0 +1,77 @@
///Credit Jason Horsburgh
///Sourced from - https://bitbucket.org/UnityUIExtensions/unity-ui-extensions/issues/127/uilinerenderer-mesh-not-updating-in-editor
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(UILineRenderer))]
public class BezierLineRendererEditor : Editor
{
void OnSceneGUI()
{
UILineRenderer curveRenderer = target as UILineRenderer;
if (!curveRenderer || curveRenderer.drivenExternally || curveRenderer.Points == null || curveRenderer.Points.Length < 2)
{
return;
}
var oldMatrix = Handles.matrix;
var transform = curveRenderer.GetComponent<RectTransform>();
//Pivot must be 0,0 to edit
//transform.pivot = Vector2.zero;
Handles.matrix = transform.localToWorldMatrix;
var sizeX = curveRenderer.rectTransform.rect.width;
var sizeY = curveRenderer.rectTransform.rect.height;
var offsetX = -curveRenderer.rectTransform.pivot.x * sizeX;
var offsetY = -curveRenderer.rectTransform.pivot.y * sizeY;
Vector2[] points = new Vector2[curveRenderer.Points.Length];
for (int i = 0; i < curveRenderer.Points.Length; i++)
{
points[i] = curveRenderer.Points[i];
}
//Need to transform points to worldspace! when set to Relative
if (curveRenderer.RelativeSize)
{
for (int i = 0; i < points.Length; i++)
{
points[i] = new Vector2(points[i].x * sizeX + offsetX, points[i].y * sizeY + offsetY);
}
}
for (int i = 0; i < points.Length - 1; i += 2)
{
Handles.DrawLine(points[i], points[i + 1]);
}
for (int i = 0; i < points.Length; ++i)
{
using (var check = new EditorGUI.ChangeCheckScope())
{
var p = Handles.PositionHandle(points[i], Quaternion.identity);
if (check.changed)
{
Undo.RecordObject(curveRenderer, "Changed Curve Position");
if (curveRenderer.RelativeSize)
{
curveRenderer.Points[i] = new Vector2((p.x - offsetX) / sizeX, (p.y - offsetY) / sizeY);
}
else
{
curveRenderer.Points[i] = p;
}
curveRenderer.transform.gameObject.SetActive(false);
curveRenderer.transform.gameObject.SetActive(true);
}
}
}
Handles.matrix = oldMatrix;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 4ef6a0d3c3259384982ae3974fe7e618
timeCreated: 1492258093
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,67 @@
///Credit judah4
///Sourced from - http://forum.unity3d.com/threads/color-picker.267043/
using UnityEditor;
using UnityEditor.UI;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(BoxSlider), true)]
[CanEditMultipleObjects]
public class BoxSliderEditor : SelectableEditor
{
SerializedProperty m_HandleRect;
SerializedProperty m_MinValue;
SerializedProperty m_MaxValue;
SerializedProperty m_WholeNumbers;
SerializedProperty m_ValueX;
SerializedProperty m_ValueY;
SerializedProperty m_OnValueChanged;
protected override void OnEnable()
{
base.OnEnable();
m_HandleRect = serializedObject.FindProperty("m_HandleRect");
m_MinValue = serializedObject.FindProperty("m_MinValue");
m_MaxValue = serializedObject.FindProperty("m_MaxValue");
m_WholeNumbers = serializedObject.FindProperty("m_WholeNumbers");
m_ValueX = serializedObject.FindProperty("m_ValueX");
m_ValueY = serializedObject.FindProperty("m_ValueY");
m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(m_HandleRect);
if (m_HandleRect.objectReferenceValue != null)
{
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(m_MinValue);
EditorGUILayout.PropertyField(m_MaxValue);
EditorGUILayout.PropertyField(m_WholeNumbers);
EditorGUILayout.Slider(m_ValueX, m_MinValue.floatValue, m_MaxValue.floatValue);
EditorGUILayout.Slider(m_ValueY, m_MinValue.floatValue, m_MaxValue.floatValue);
// Draw the event notification options
EditorGUILayout.Space();
EditorGUILayout.PropertyField(m_OnValueChanged);
}
else
{
EditorGUILayout.HelpBox("Specify a RectTransform for the slider fill or the slider handle or both. Each must have a parent RectTransform that it can slide within.", MessageType.Info);
}
serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c1047f9974e7ee1478bbf5490a7a62d8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,59 @@
/// Credit Titinious (https://github.com/Titinious)
/// Sourced from - https://github.com/Titinious/CurlyUI
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(CUIBezierCurve))]
[CanEditMultipleObjects]
public class CUIBezierCurveEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
}
protected void OnSceneGUI()
{
CUIBezierCurve script = (CUIBezierCurve)this.target;
if (script.ControlPoints != null)
{
Vector3[] controlPoints = script.ControlPoints;
Transform handleTransform = script.transform;
Quaternion handleRotation = script.transform.rotation;
for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
{
EditorGUI.BeginChangeCheck();
Vector3 newPt = Handles.DoPositionHandle(handleTransform.TransformPoint(controlPoints[p]), handleRotation);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(script, "Move Point");
EditorUtility.SetDirty(script);
controlPoints[p] = handleTransform.InverseTransformPoint(newPt);
script.Refresh();
}
}
Handles.color = Color.gray;
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[0]), handleTransform.TransformPoint(controlPoints[1]));
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[1]), handleTransform.TransformPoint(controlPoints[2]));
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[2]), handleTransform.TransformPoint(controlPoints[3]));
int sampleSize = 10;
Handles.color = Color.white;
for (int s = 0; s < sampleSize; s++)
{
Handles.DrawLine(handleTransform.TransformPoint(script.GetPoint((float)s / sampleSize)), handleTransform.TransformPoint(script.GetPoint((float)(s + 1) / sampleSize)));
}
script.EDITOR_ControlPoints = controlPoints;
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 40e01e4fb1e006b46a0f127c8a9907b3
timeCreated: 1485671367
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,187 @@
/// Credit Titinious (https://github.com/Titinious)
/// Sourced from - https://github.com/Titinious/CurlyUI
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(CUIGraphic), true)]
public class CUIGraphicEditor : Editor {
protected static bool isCurveGpFold = false;
protected Vector3[] reuse_Vector3s = new Vector3[4];
public override void OnInspectorGUI()
{
CUIGraphic script = (CUIGraphic)this.target;
EditorGUILayout.HelpBox("CurlyUI (CUI) should work with most of the Unity UI. For Image, use CUIImage; for Text, use CUIText; and for others (e.g. RawImage), use CUIGraphic", MessageType.Info);
if (script.UIGraphic == null)
{
EditorGUILayout.HelpBox("CUI is an extension to Unity's UI. You must set Ui Graphic with a Unity Graphic component (e.g. Image, Text, RawImage)", MessageType.Error);
}
else
{
if (script.UIGraphic is Image && script.GetType() != typeof(CUIImage))
{
EditorGUILayout.HelpBox("Although CUI components are generalized. It is recommended that for Image, use CUIImage", MessageType.Warning);
}
else if (script.UIGraphic is Text && script.GetType() != typeof(CUIText))
{
EditorGUILayout.HelpBox("Although CUI components are generalized. It is recommended that for Text, use CUIText", MessageType.Warning);
}
EditorGUILayout.HelpBox("Now that CUI is ready, change the control points of the top and bottom bezier curves to curve/morph the UI. Improve resolution when the UI seems to look poorly when curved/morphed should help.", MessageType.Info);
}
DrawDefaultInspector();
// draw the editor that shows the position ratio of all control points from the two bezier curves
isCurveGpFold = EditorGUILayout.Foldout(isCurveGpFold, "Curves Position Ratios");
if (isCurveGpFold)
{
EditorGUI.indentLevel++;
EditorGUILayout.LabelField("Top Curve");
EditorGUI.indentLevel++;
Vector3[] controlPoints = script.RefCurvesControlRatioPoints[1].array;
EditorGUI.BeginChangeCheck();
for (int p = 0; p < controlPoints.Length; p++)
{
reuse_Vector3s[p] = EditorGUILayout.Vector3Field(string.Format("Control Points {0}", p + 1), controlPoints[p]);
}
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(script, "Change Ratio Points");
EditorUtility.SetDirty(script);
System.Array.Copy(reuse_Vector3s, script.RefCurvesControlRatioPoints[1].array, controlPoints.Length);
script.UpdateCurveControlPointPositions();
}
EditorGUI.indentLevel--;
EditorGUILayout.LabelField("Bottom Curve");
EditorGUI.indentLevel++;
controlPoints = script.RefCurvesControlRatioPoints[0].array;
EditorGUI.BeginChangeCheck();
for (int p = 0; p < controlPoints.Length; p++)
{
reuse_Vector3s[p] = EditorGUILayout.Vector3Field(string.Format("Control Points {0}", p + 1), controlPoints[p]);
}
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(script, "Change Ratio Points");
EditorUtility.SetDirty(script);
System.Array.Copy(reuse_Vector3s, controlPoints, controlPoints.Length);
script.UpdateCurveControlPointPositions();
}
EditorGUI.indentLevel--;
EditorGUI.indentLevel--;
}
EditorGUILayout.Space();
if (GUILayout.Button("Fit Bezier curves to rect transform"))
{
Undo.RecordObject(script, "Fit to Rect Transform");
Undo.RecordObject(script.RefCurves[0], "Fit to Rect Transform");
Undo.RecordObject(script.RefCurves[1], "Fit to Rect Transform");
EditorUtility.SetDirty(script);
script.FixTextToRectTrans();
script.Refresh();
}
EditorGUILayout.Space();
// disable group to prevent allowing the reference be used when there is no reference CUI
EditorGUI.BeginDisabledGroup(script.RefCUIGraphic == null);
if (GUILayout.Button("Reference CUI component for curves"))
{
Undo.RecordObject(script, "Reference CUI");
Undo.RecordObject(script.RefCurves[0], "Reference CUI");
Undo.RecordObject(script.RefCurves[1], "Reference CUI");
EditorUtility.SetDirty(script);
script.ReferenceCUIForBCurves();
script.Refresh();
}
EditorGUILayout.HelpBox("Auto set the curves' control points by referencing another CUI. You need to set Ref CUI Graphic (e.g. CUIImage) first.", MessageType.Info);
EditorGUI.EndDisabledGroup();
}
protected virtual void OnSceneGUI()
{
// for CUITextEditor, allow using scene UI to change the control points of the bezier curves
CUIGraphic script = (CUIGraphic)this.target;
script.ReportSet();
for (int c = 0; c < script.RefCurves.Length; c++)
{
CUIBezierCurve curve = script.RefCurves[c];
if (curve.ControlPoints != null)
{
Vector3[] controlPoints = curve.ControlPoints;
Transform handleTransform = curve.transform;
Quaternion handleRotation = curve.transform.rotation;
for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
{
EditorGUI.BeginChangeCheck();
Handles.Label(handleTransform.TransformPoint(controlPoints[p]), string.Format("Control Point {0}", p + 1));
Vector3 newPt = Handles.DoPositionHandle(handleTransform.TransformPoint(controlPoints[p]), handleRotation);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(curve, "Move Point");
Undo.RecordObject(script, "Move Point");
EditorUtility.SetDirty(curve);
controlPoints[p] = handleTransform.InverseTransformPoint(newPt);
}
}
Handles.color = Color.gray;
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[0]), handleTransform.TransformPoint(controlPoints[1]));
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[1]), handleTransform.TransformPoint(controlPoints[2]));
Handles.DrawLine(handleTransform.TransformPoint(controlPoints[2]), handleTransform.TransformPoint(controlPoints[3]));
int sampleSize = 10;
Handles.color = Color.white;
for (int s = 0; s < sampleSize; s++)
{
Handles.DrawLine(handleTransform.TransformPoint(curve.GetPoint((float)s / sampleSize)), handleTransform.TransformPoint(curve.GetPoint((float)(s + 1) / sampleSize)));
}
curve.EDITOR_ControlPoints = controlPoints;
}
}
if (script.RefCurves != null)
{
Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[0]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[0]));
Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[3]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[3]));
}
script.Refresh();
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b7b84624f1ba7bd49b6cfc63b25f4b7c
timeCreated: 1485671367
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,93 @@
/// Credit Titinious (https://github.com/Titinious)
/// Sourced from - https://github.com/Titinious/CurlyUI
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(CUIImage))]
public class CUIImageEditor : CUIGraphicEditor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
CUIImage script = (CUIImage)this.target;
EditorGUILayout.Space();
EditorGUI.BeginChangeCheck();
EditorGUI.BeginDisabledGroup(!(script.UIImage.type == Image.Type.Sliced || script.UIImage.type == Image.Type.Tiled));
Vector2 newCornerRatio = EditorGUILayout.Vector2Field("Corner Ratio", script.cornerPosRatio);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(script, "Change Corner Ratio");
EditorUtility.SetDirty(script);
script.cornerPosRatio = newCornerRatio;
}
if (GUILayout.Button("Use native corner ratio"))
{
Undo.RecordObject(script, "Change Corner Ratio");
EditorUtility.SetDirty(script);
script.cornerPosRatio = script.OriCornerPosRatio;
}
if (script.UIImage.type == Image.Type.Sliced || script.UIImage.type == Image.Type.Filled)
{
EditorGUILayout.HelpBox("With CUIImage, you can also adjust the size of the corners for filled or sliced Image. The grey sphere in the editor scene could also be moved to change the corner's size.", MessageType.Info);
}
else
{
EditorGUILayout.HelpBox("With CUIImage, you can also adjust the size of the corners for filled or sliced Image. You need to set Image to filled or sliced to use this feature.", MessageType.Info);
}
EditorGUI.EndDisabledGroup();
}
protected override void OnSceneGUI()
{
base.OnSceneGUI();
CUIImage script = (CUIImage)this.target;
if (script.UIImage.type == Image.Type.Sliced || script.UIImage.type == Image.Type.Tiled)
{
Vector3 cornerPos = Vector3.zero;//
if (script.IsCurved)
{
cornerPos = script.GetBCurveSandwichSpacePoint(script.cornerPosRatio.x, script.cornerPosRatio.y);
}
else
{
cornerPos.x = script.cornerPosRatio.x * script.RectTrans.rect.width - script.RectTrans.pivot.x * script.RectTrans.rect.width;
cornerPos.y = script.cornerPosRatio.y * script.RectTrans.rect.height - script.RectTrans.pivot.y * script.RectTrans.rect.height;
}
Handles.color = Color.gray;
EditorGUI.BeginChangeCheck();
#if UNITY_2022_1_OR_NEWER
Vector3 newCornerPos = Handles.FreeMoveHandle(script.transform.TransformPoint(cornerPos), HandleUtility.GetHandleSize(script.transform.TransformPoint(cornerPos)) / 7, Vector3.one, Handles.SphereHandleCap);
#else
Vector3 newCornerPos = Handles.FreeMoveHandle(script.transform.TransformPoint(cornerPos), script.transform.rotation, HandleUtility.GetHandleSize(script.transform.TransformPoint(cornerPos)) / 7, Vector3.one, Handles.SphereHandleCap);
#endif
Handles.Label(newCornerPos, string.Format("Corner Mover"));
newCornerPos = script.transform.InverseTransformPoint(newCornerPos);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(script, "Move Corner");
EditorUtility.SetDirty(script);
script.cornerPosRatio = new Vector2(newCornerPos.x, newCornerPos.y);
script.cornerPosRatio.x = (script.cornerPosRatio.x + script.RectTrans.pivot.x * script.RectTrans.rect.width) / script.RectTrans.rect.width;
script.cornerPosRatio.y = (script.cornerPosRatio.y + script.RectTrans.pivot.y * script.RectTrans.rect.height) / script.RectTrans.rect.height;
}
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 8445204f2ee16e0408274b8400deef53
timeCreated: 1485929052
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,10 @@
/// Credit Titinious (https://github.com/Titinious)
/// Sourced from - https://github.com/Titinious/CurlyUI
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(CUIText))]
public class CUITextEditor : CUIGraphicEditor { }
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 041976c43b8439747a030b45a4712b77
timeCreated: 1485929052
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,120 @@
/// Credit dakka
/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/#post-1752415
/// Notes - Mod from Yilmaz Kiymaz's editor scripts presentation at Unite 2013
/// Updated simonDarksideJ - removed Linq use, not required.
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
public class CanvasGroupActivator : EditorWindow
{
[MenuItem("Window/UI/Extensions/Canvas Groups Activator")]
public static void InitWindow()
{
EditorWindow.GetWindow<CanvasGroupActivator>();
}
CanvasGroup[] canvasGroups;
void OnEnable()
{
ObtainCanvasGroups();
}
void OnFocus()
{
ObtainCanvasGroups();
}
void ObtainCanvasGroups()
{
#if UNITY_2023_1_OR_NEWER
canvasGroups = GameObject.FindObjectsByType<CanvasGroup>(FindObjectsSortMode.None);
#else
canvasGroups = GameObject.FindObjectsOfType<CanvasGroup>();
#endif
}
void OnGUI()
{
if (canvasGroups == null)
{
return;
}
GUILayout.Space(10f);
GUILayout.Label("Canvas Groups");
for (int i = 0; i < canvasGroups.Length; i++)
{
if (canvasGroups[i] == null) { continue; }
bool initialActive = false;
if (canvasGroups[i].alpha == 1.0f)
initialActive = true;
bool active = EditorGUILayout.Toggle(canvasGroups[i].name, initialActive);
if (active != initialActive)
{
//If deactivated and initially active
if (!active && initialActive)
{
//Deactivate this
canvasGroups[i].alpha = 0f;
canvasGroups[i].interactable = false;
canvasGroups[i].blocksRaycasts = false;
}
//If activated and initially deactivate
else if (active && !initialActive)
{
//Deactivate all others and activate this
HideAllGroups();
canvasGroups[i].alpha = 1.0f;
canvasGroups[i].interactable = true;
canvasGroups[i].blocksRaycasts = true;
}
}
}
GUILayout.Space(5f);
if (GUILayout.Button("Show All"))
{
ShowAllGroups();
}
if (GUILayout.Button("Hide All"))
{
HideAllGroups();
}
}
void ShowAllGroups()
{
foreach (var group in canvasGroups)
{
if (group != null)
{
group.alpha = 1.0f;
group.interactable = true;
group.blocksRaycasts = true;
}
}
}
void HideAllGroups()
{
foreach (var group in canvasGroups)
{
if (group != null)
{
group.alpha = 0;
group.interactable = false;
group.blocksRaycasts = false;
}
}
}
}
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f60a419e63d329f43ba1bf57e98b34bf
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View File

@@ -0,0 +1,28 @@
using UnityEngine;
using UnityEditor;
namespace UnityEngine.UI.Extensions.ColorPicker
{
[CustomEditor(typeof(ColorPickerPresets))]
public class ColorPickerPresetsEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
var colorPickerPresets = (ColorPickerPresets)target;
if (colorPickerPresets.saveMode != ColorPickerPresets.SaveType.JsonFile)
return;
string fileLocation = colorPickerPresets.JsonFilePath;
if (!System.IO.File.Exists(fileLocation))
return;
if (GUILayout.Button("Open JSON file."))
{
Application.OpenURL(fileLocation);
}
}
}
}

View File

@@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: 0dc729b738fb01043ac4c04b78575a98
timeCreated: 1520733906
licenseType: Pro
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 77a80d348c62e93459753f8e704f474d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,119 @@
/// Credit setchi (https://github.com/setchi)
/// Sourced from - https://github.com/setchi/FancyScrollView
using UnityEditor;
using UnityEditor.AnimatedValues;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(Scroller))]
[CanEditMultipleObjects]
public class ScrollerEditor : Editor
{
SerializedProperty viewport;
SerializedProperty scrollDirection;
SerializedProperty movementType;
SerializedProperty elasticity;
SerializedProperty scrollSensitivity;
SerializedProperty inertia;
SerializedProperty decelerationRate;
SerializedProperty snap;
SerializedProperty draggable;
SerializedProperty scrollbar;
AnimBool showElasticity;
AnimBool showInertiaRelatedValues;
void OnEnable()
{
viewport = serializedObject.FindProperty("viewport");
scrollDirection = serializedObject.FindProperty("scrollDirection");
movementType = serializedObject.FindProperty("movementType");
elasticity = serializedObject.FindProperty("elasticity");
scrollSensitivity = serializedObject.FindProperty("scrollSensitivity");
inertia = serializedObject.FindProperty("inertia");
decelerationRate = serializedObject.FindProperty("decelerationRate");
snap = serializedObject.FindProperty("snap");
draggable = serializedObject.FindProperty("draggable");
scrollbar = serializedObject.FindProperty("scrollbar");
showElasticity = new AnimBool(Repaint);
showInertiaRelatedValues = new AnimBool(Repaint);
SetAnimBools(true);
}
void OnDisable()
{
showElasticity.valueChanged.RemoveListener(Repaint);
showInertiaRelatedValues.valueChanged.RemoveListener(Repaint);
}
void SetAnimBools(bool instant)
{
SetAnimBool(showElasticity, !movementType.hasMultipleDifferentValues && movementType.enumValueIndex == (int)MovementType.Elastic, instant);
SetAnimBool(showInertiaRelatedValues, !inertia.hasMultipleDifferentValues && inertia.boolValue, instant);
}
void SetAnimBool(AnimBool a, bool value, bool instant)
{
if (instant)
{
a.value = value;
}
else
{
a.target = value;
}
}
public override void OnInspectorGUI()
{
SetAnimBools(false);
serializedObject.Update();
EditorGUILayout.PropertyField(viewport);
EditorGUILayout.PropertyField(scrollDirection);
EditorGUILayout.PropertyField(movementType);
DrawMovementTypeRelatedValue();
EditorGUILayout.PropertyField(scrollSensitivity);
EditorGUILayout.PropertyField(inertia);
DrawInertiaRelatedValues();
EditorGUILayout.PropertyField(draggable);
EditorGUILayout.PropertyField(scrollbar);
serializedObject.ApplyModifiedProperties();
}
void DrawMovementTypeRelatedValue()
{
using (var group = new EditorGUILayout.FadeGroupScope(showElasticity.faded))
{
if (!group.visible)
{
return;
}
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(elasticity);
}
}
}
void DrawInertiaRelatedValues()
{
using (var group = new EditorGUILayout.FadeGroupScope(showInertiaRelatedValues.faded))
{
if (!group.visible)
{
return;
}
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(decelerationRate);
EditorGUILayout.PropertyField(snap);
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e82bfdd42ec254849830933cbaf350fa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,121 @@
///Credit brogan89
///Sourced from - https://github.com/brogan89/MinMaxSlider
using System;
using UnityEditor;
using UnityEditor.UI;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(MinMaxSlider), true)]
[CanEditMultipleObjects]
public class MinMaxSliderEditor : SelectableEditor
{
private SerializedProperty _customCamera;
private SerializedProperty _sliderBounds;
private SerializedProperty _minHandle;
private SerializedProperty _maxHandle;
private SerializedProperty _minText;
private SerializedProperty _maxText;
private SerializedProperty _textFormat;
private SerializedProperty _middleGraphic;
private SerializedProperty _minLimit;
private SerializedProperty _maxLimit;
private SerializedProperty _wholeNumbers;
private SerializedProperty _minValue;
private SerializedProperty _maxValue;
private SerializedProperty _onValueChanged;
private readonly GUIContent label = new GUIContent("Min Max Values");
protected override void OnEnable()
{
base.OnEnable();
_customCamera = serializedObject.FindProperty("customCamera");
_sliderBounds = serializedObject.FindProperty("sliderBounds");
_minHandle = serializedObject.FindProperty("minHandle");
_maxHandle = serializedObject.FindProperty("maxHandle");
_minText = serializedObject.FindProperty("minText");
_maxText = serializedObject.FindProperty("maxText");
_textFormat = serializedObject.FindProperty("textFormat");
_middleGraphic = serializedObject.FindProperty("middleGraphic");
_minLimit = serializedObject.FindProperty("minLimit");
_maxLimit = serializedObject.FindProperty("maxLimit");
_wholeNumbers = serializedObject.FindProperty("wholeNumbers");
_minValue = serializedObject.FindProperty("minValue");
_maxValue = serializedObject.FindProperty("maxValue");
_onValueChanged = serializedObject.FindProperty("onValueChanged");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
serializedObject.Update();
float minLimitOld = _minLimit.floatValue;
float maxLimitOld = _maxLimit.floatValue;
float minValueOld = _minValue.floatValue;
float maxValueOld = _maxValue.floatValue;
EditorGUILayout.PropertyField(_customCamera);
EditorGUILayout.PropertyField(_sliderBounds);
EditorGUILayout.PropertyField(_minHandle);
EditorGUILayout.PropertyField(_maxHandle);
EditorGUILayout.PropertyField(_middleGraphic);
EditorGUILayout.PropertyField(_minText);
EditorGUILayout.PropertyField(_maxText);
EditorGUILayout.PropertyField(_textFormat);
EditorGUILayout.PropertyField(_minLimit);
EditorGUILayout.PropertyField(_maxLimit);
EditorGUILayout.PropertyField(_wholeNumbers);
EditorGUILayout.PropertyField(_minValue);
EditorGUILayout.PropertyField(_maxValue);
float minValue = Mathf.Clamp(_minValue.floatValue, _minLimit.floatValue, _maxLimit.floatValue);
float maxValue = Mathf.Clamp(_maxValue.floatValue, _minLimit.floatValue, _maxLimit.floatValue);
EditorGUILayout.MinMaxSlider(label, ref minValue, ref maxValue, _minLimit.floatValue, _maxLimit.floatValue);
bool anyValueChanged = !IsEqualFloat(minValueOld, minValue)
|| !IsEqualFloat(maxValueOld, maxValue)
|| !IsEqualFloat(minLimitOld, _minLimit.floatValue)
|| !IsEqualFloat(maxLimitOld, _maxLimit.floatValue);
if (anyValueChanged)
{
MinMaxSlider slider = (MinMaxSlider)target;
// force limits to ints if whole numbers.
// needed to do this here because it wouldn't set in component script for some reason
if (slider.wholeNumbers)
{
_minLimit.floatValue = Mathf.RoundToInt(_minLimit.floatValue);
_maxLimit.floatValue = Mathf.RoundToInt(_maxLimit.floatValue);
}
// set slider values
slider.SetValues(minValue, maxValue, _minLimit.floatValue, _maxLimit.floatValue);
}
EditorGUILayout.Space();
EditorGUILayout.PropertyField(_onValueChanged);
serializedObject.ApplyModifiedProperties();
}
/// <summary>
/// Returns true if floating point numbers are within 0.01f (close enough to be considered equal)
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private static bool IsEqualFloat(float a, float b)
{
return Math.Abs(a - b) < 0.01f;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 69352ed1561021b48ac258f81f48a988
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,21 @@
/// Credit Slipp Douglas Thompson
/// Sourced from - https://gist.github.com/capnslipp/349c18283f2fea316369
///
using UnityEditor;
using UnityEditor.UI;
namespace UnityEngine.UI.Extensions
{
[CanEditMultipleObjects, CustomEditor(typeof(NonDrawingGraphic), false)]
public class NonDrawingGraphicEditor : GraphicEditor
{
public override void OnInspectorGUI()
{
base.serializedObject.Update();
EditorGUILayout.PropertyField(base.m_Script, new GUILayoutOption[0]);
// skipping AppearanceControlsGUI
base.RaycastControlsGUI();
base.serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ee2802949feca4c4c934331b6a0dc379
timeCreated: 1483566748
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,134 @@
/// Credit Ben MacKinnon @Dover8
/// Sourced from - https://github.com/Dover8/Unity-UI-Extensions/tree/range-slider
/// Usage: Extension of the standard slider. Two handles determine a low and high value between a Min and Max.
/// Raises a UnityEvent passing the low and high values
using UnityEditor;
using UnityEditor.UI;
namespace UnityEngine.UI.Extensions
{
[CustomEditor(typeof(RangeSlider), true)]
[CanEditMultipleObjects]
public class RangeSliderEditor : SelectableEditor
{
SerializedProperty m_Direction;
SerializedProperty m_LowHandleRect;
SerializedProperty m_HighHandleRect;
SerializedProperty m_FillRect;
SerializedProperty m_MinValue;
SerializedProperty m_MaxValue;
SerializedProperty m_WholeNumbers;
SerializedProperty m_LowValue;
SerializedProperty m_HighValue;
//need ref values for the editor MinMaxSlider
float low = 0;
float high = 1;
SerializedProperty m_OnValueChanged;
protected override void OnEnable()
{
base.OnEnable();
m_LowHandleRect = serializedObject.FindProperty("m_LowHandleRect");
m_HighHandleRect = serializedObject.FindProperty("m_HighHandleRect");
m_FillRect = serializedObject.FindProperty("m_FillRect");
m_Direction = serializedObject.FindProperty("m_Direction");
m_MinValue = serializedObject.FindProperty("m_MinValue");
m_MaxValue = serializedObject.FindProperty("m_MaxValue");
m_WholeNumbers = serializedObject.FindProperty("m_WholeNumbers");
m_LowValue = serializedObject.FindProperty("m_LowValue");
low = m_LowValue.floatValue;
m_HighValue = serializedObject.FindProperty("m_HighValue");
high = m_HighValue.floatValue;
m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
//grab the updated value affected by m_WholeNumbers
low = m_LowValue.floatValue;
high = m_HighValue.floatValue;
EditorGUILayout.PropertyField(m_LowHandleRect);
EditorGUILayout.PropertyField(m_HighHandleRect);
EditorGUILayout.PropertyField(m_FillRect);
if (m_LowHandleRect.objectReferenceValue != null && m_HighHandleRect.objectReferenceValue != null)
{
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(m_Direction);
if (EditorGUI.EndChangeCheck())
{
RangeSlider.Direction direction = (RangeSlider.Direction)m_Direction.enumValueIndex;
foreach (var obj in serializedObject.targetObjects)
{
RangeSlider rangeSlider = obj as RangeSlider;
rangeSlider.SetDirection(direction, true);
}
}
EditorGUILayout.PropertyField(m_MinValue);
EditorGUILayout.PropertyField(m_MaxValue);
EditorGUILayout.PropertyField(m_WholeNumbers);
//We're going to do a fair bit of layout here
EditorGUILayout.BeginHorizontal();
//Low Label and value
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUILayout.Label("Low");
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
low = EditorGUILayout.DelayedFloatField(low, GUILayout.MaxWidth(100));
EditorGUILayout.EndVertical();
GUILayout.FlexibleSpace();
//Slider
EditorGUILayout.BeginVertical();
GUILayout.FlexibleSpace();
EditorGUILayout.MinMaxSlider(ref low, ref high, m_MinValue.floatValue, m_MaxValue.floatValue, GUILayout.ExpandWidth(true));
EditorGUILayout.EndVertical();
GUILayout.FlexibleSpace();
//High label and value
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUILayout.Label("High");
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
high = EditorGUILayout.DelayedFloatField(high, GUILayout.MaxWidth(100));
EditorGUILayout.EndVertical();
EditorGUILayout.EndHorizontal();
m_LowValue.floatValue = low;
m_HighValue.floatValue = high;
EditorGUILayout.Space();
EditorGUILayout.PropertyField(m_OnValueChanged);
}
else
{
EditorGUILayout.HelpBox("Specify a RectTransform for the RangeSlider fill or the RangeSlider handles or both. Each must have a parent RectTransform that it can slide within.", MessageType.Info);
}
serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ac33445ed95315743983e4b657921146
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,19 @@
/// Credit tanoshimi
/// Sourced from - https://forum.unity3d.com/threads/read-only-fields.68976/
///
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true;
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 33c90f5149877a242981372f6cde9a35
timeCreated: 1498392707
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,87 @@
/// Credit setchi (https://github.com/setchi)
/// Sourced from - https://github.com/setchi/FancyScrollView
// For maintenance, every new [SerializeField] variable in ScrollPositionController must be declared here
using System;
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[Obsolete("ScrollPositionController has been replaced by the Scroller component", true)]
[CustomEditor(typeof(ScrollPositionController))]
[CanEditMultipleObjects]
public class ScrollPositionControllerEditor : Editor
{
SerializedProperty viewport;
SerializedProperty directionOfRecognize;
SerializedProperty movementType;
SerializedProperty elasticity;
SerializedProperty scrollSensitivity;
SerializedProperty inertia;
SerializedProperty decelerationRate;
SerializedProperty snap;
SerializedProperty snapEnable;
SerializedProperty snapVelocityThreshold;
SerializedProperty snapDuration;
SerializedProperty dataCount;
void OnEnable()
{
viewport = serializedObject.FindProperty("viewport");
directionOfRecognize = serializedObject.FindProperty("directionOfRecognize");
movementType = serializedObject.FindProperty("movementType");
elasticity = serializedObject.FindProperty("elasticity");
scrollSensitivity = serializedObject.FindProperty("scrollSensitivity");
inertia = serializedObject.FindProperty("inertia");
decelerationRate = serializedObject.FindProperty("decelerationRate");
snap = serializedObject.FindProperty("snap");
snapEnable = serializedObject.FindProperty("snap.Enable");
snapVelocityThreshold = serializedObject.FindProperty("snap.VelocityThreshold");
snapDuration = serializedObject.FindProperty("snap.Duration");
dataCount = serializedObject.FindProperty("dataCount");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(viewport);
EditorGUILayout.PropertyField(directionOfRecognize);
EditorGUILayout.PropertyField(movementType);
EditorGUILayout.PropertyField(elasticity);
EditorGUILayout.PropertyField(scrollSensitivity);
EditorGUILayout.PropertyField(inertia);
DrawInertiaRelatedValues();
EditorGUILayout.PropertyField(dataCount);
serializedObject.ApplyModifiedProperties();
}
void DrawInertiaRelatedValues()
{
if (inertia.boolValue)
{
EditorGUILayout.PropertyField(decelerationRate);
EditorGUILayout.PropertyField(snap);
using (new EditorGUI.IndentLevelScope())
{
DrawSnapRelatedValues();
}
}
}
void DrawSnapRelatedValues()
{
if (snap.isExpanded)
{
EditorGUILayout.PropertyField(snapEnable);
if (snapEnable.boolValue)
{
EditorGUILayout.PropertyField(snapVelocityThreshold);
EditorGUILayout.PropertyField(snapDuration);
}
}
}
}
}

View File

@@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: 986fda6476737da458576709b7f59ea3
timeCreated: 1508699683
licenseType: Pro
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,38 @@
/// Credit drobina, w34edrtfg, playemgames
/// Sourced from - http://forum.unity3d.com/threads/sprite-icons-with-text-e-g-emoticons.265927/
using UnityEditor;
namespace UnityEngine.UI.Extensions
{
[CanEditMultipleObjects]
[CustomEditor(typeof(TextPic))]
public class TextPicEditor : UnityEditor.UI.TextEditor
{
private SerializedProperty ImageScalingFactorProp;
private SerializedProperty hyperlinkColorProp;
private SerializedProperty imageOffsetProp;
private SerializedProperty iconList;
protected override void OnEnable()
{
base.OnEnable();
ImageScalingFactorProp = serializedObject.FindProperty("ImageScalingFactor");
hyperlinkColorProp = serializedObject.FindProperty("hyperlinkColor");
imageOffsetProp = serializedObject.FindProperty("imageOffset");
iconList = serializedObject.FindProperty("inspectorIconList");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
serializedObject.Update();
EditorGUILayout.PropertyField(imageOffsetProp, new GUIContent("Image Offset"));
EditorGUILayout.PropertyField(ImageScalingFactorProp, new GUIContent("Image Scaling Factor"));
EditorGUILayout.PropertyField(hyperlinkColorProp, new GUIContent("Hyperlink Color"));
EditorGUILayout.PropertyField(iconList, new GUIContent("Icon List"), true);
serializedObject.ApplyModifiedProperties();
}
}
}

Some files were not shown because too many files have changed in this diff Show More