fack
This commit is contained in:
7
.claude/settings.local.json
Normal file
7
.claude/settings.local.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"WebSearch"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: cc5f7586b864d8246b39029b1ad3a7bf
|
guid: a83379c03137d8d4e890f489fca45c68
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 79e445c288ce5c4058473c9b9e1ce739
|
guid: bcd8fd1e026760643ad63865e3584c81
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
31
Assets/Inventory/Items/NewItem.asset
Normal file
31
Assets/Inventory/Items/NewItem.asset
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 5741b63764436354ebad192c9b71f06c, type: 3}
|
||||||
|
m_Name: NewItem
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::ItemData
|
||||||
|
id: 2
|
||||||
|
itemName: NewItem
|
||||||
|
description: 23
|
||||||
|
type: 5
|
||||||
|
modelPrefab: {fileID: 282714382156279063, guid: 4fcbba5b8725e254f98c052c4db89e02, type: 3}
|
||||||
|
icon: {fileID: 21300000, guid: 0115b2d990086ae4cbc31baf7c64e680, type: 3}
|
||||||
|
maxStack: 64
|
||||||
|
isCraftable: 0
|
||||||
|
craftingRecipe:
|
||||||
|
ingredients: []
|
||||||
|
amounts:
|
||||||
|
resultId:
|
||||||
|
resultAmount: 1
|
||||||
|
weight: 1
|
||||||
|
value: 1
|
||||||
|
isDroppable: 1
|
||||||
|
isStackable: 1
|
||||||
8
Assets/Inventory/Items/NewItem.asset.meta
Normal file
8
Assets/Inventory/Items/NewItem.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9765c2fbc4980049940f96e9b0f70dc
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
31
Assets/Inventory/Items/test.asset
Normal file
31
Assets/Inventory/Items/test.asset
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 5741b63764436354ebad192c9b71f06c, type: 3}
|
||||||
|
m_Name: test
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::ItemData
|
||||||
|
id: 1
|
||||||
|
itemName: test
|
||||||
|
description: 123
|
||||||
|
type: 0
|
||||||
|
modelPrefab: {fileID: 282714382156279063, guid: 4fcbba5b8725e254f98c052c4db89e02, type: 3}
|
||||||
|
icon: {fileID: 21300000, guid: 0115b2d990086ae4cbc31baf7c64e680, type: 3}
|
||||||
|
maxStack: 64
|
||||||
|
isCraftable: 0
|
||||||
|
craftingRecipe:
|
||||||
|
ingredients: []
|
||||||
|
amounts:
|
||||||
|
resultId:
|
||||||
|
resultAmount: 1
|
||||||
|
weight: 1
|
||||||
|
value: 1
|
||||||
|
isDroppable: 1
|
||||||
|
isStackable: 1
|
||||||
8
Assets/Inventory/Items/test.asset.meta
Normal file
8
Assets/Inventory/Items/test.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 91470f1965cf83a4a8c49831ec2f7691
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 7e500dd197b0a563ba03994985add81f
|
guid: 34a15c970bb1a4442922409d4041278a
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
123
Assets/Inventory/Prefabs/GameManager.prefab
Normal file
123
Assets/Inventory/Prefabs/GameManager.prefab
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &3743145363054835461
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 6461243735758044243}
|
||||||
|
- component: {fileID: 7806798928968015955}
|
||||||
|
- component: {fileID: 917247343393088441}
|
||||||
|
- component: {fileID: 904704503021327689}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: GameManager
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &6461243735758044243
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3743145363054835461}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 3.58223, y: 0, z: -0.03737}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &7806798928968015955
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3743145363054835461}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a4c4603259067dc4e96f741653843b92, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryManager
|
||||||
|
inventorySize: 36
|
||||||
|
slots:
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
inventoryPanel: {fileID: 0}
|
||||||
|
hotbarSlots:
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
itemDatabase: []
|
||||||
|
--- !u!114 &917247343393088441
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3743145363054835461}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: ad1628cce096628409729c00123006be, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryExampleItems
|
||||||
|
items: []
|
||||||
|
--- !u!114 &904704503021327689
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3743145363054835461}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 0}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryTester
|
||||||
7
Assets/Inventory/Prefabs/GameManager.prefab.meta
Normal file
7
Assets/Inventory/Prefabs/GameManager.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 60b4e69fb88096c41b79991b55ae2e08
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
15549
Assets/Inventory/Prefabs/InventoryCanvas.prefab
Normal file
15549
Assets/Inventory/Prefabs/InventoryCanvas.prefab
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Inventory/Prefabs/InventoryCanvas.prefab.meta
Normal file
7
Assets/Inventory/Prefabs/InventoryCanvas.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 145dcfd5eb113214580f79ea514da475
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
344
Assets/Inventory/Prefabs/InventorySlot_0.prefab
Normal file
344
Assets/Inventory/Prefabs/InventorySlot_0.prefab
Normal file
@@ -0,0 +1,344 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &1088936209855662566
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 7496016030181336795}
|
||||||
|
- component: {fileID: 5732183762162151468}
|
||||||
|
- component: {fileID: 3688350745810595510}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Text
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &7496016030181336795
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1088936209855662566}
|
||||||
|
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: 9168090920327097179}
|
||||||
|
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: 20, y: 20}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!222 &5732183762162151468
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1088936209855662566}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &3688350745810595510
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1088936209855662566}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text
|
||||||
|
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_FontData:
|
||||||
|
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_FontSize: 14
|
||||||
|
m_FontStyle: 0
|
||||||
|
m_BestFit: 0
|
||||||
|
m_MinSize: 10
|
||||||
|
m_MaxSize: 40
|
||||||
|
m_Alignment: 5
|
||||||
|
m_AlignByGeometry: 0
|
||||||
|
m_RichText: 1
|
||||||
|
m_HorizontalOverflow: 0
|
||||||
|
m_VerticalOverflow: 0
|
||||||
|
m_LineSpacing: 1
|
||||||
|
m_Text:
|
||||||
|
--- !u!1 &1912723805268667563
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 9168090920327097179}
|
||||||
|
- component: {fileID: 5638168838715636855}
|
||||||
|
- component: {fileID: 2025189271983313986}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: AmountPanel
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 0
|
||||||
|
--- !u!224 &9168090920327097179
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1912723805268667563}
|
||||||
|
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: 7496016030181336795}
|
||||||
|
m_Father: {fileID: 1340148140657551652}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 1, y: 1}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: -2, y: 2}
|
||||||
|
m_SizeDelta: {x: 20, y: 20}
|
||||||
|
m_Pivot: {x: 1, y: 0}
|
||||||
|
--- !u!222 &5638168838715636855
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1912723805268667563}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &2025189271983313986
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1912723805268667563}
|
||||||
|
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: 0, b: 0, a: 0.7}
|
||||||
|
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 &6380808876699298028
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 2917712365648044858}
|
||||||
|
- component: {fileID: 2771215458839960748}
|
||||||
|
- component: {fileID: 4241945068260094018}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Icon
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &2917712365648044858
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6380808876699298028}
|
||||||
|
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: 1340148140657551652}
|
||||||
|
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: -8}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!222 &2771215458839960748
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6380808876699298028}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &4241945068260094018
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6380808876699298028}
|
||||||
|
m_Enabled: 0
|
||||||
|
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: 0}
|
||||||
|
m_Type: 0
|
||||||
|
m_PreserveAspect: 1
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
m_UseSpriteMesh: 0
|
||||||
|
m_PixelsPerUnitMultiplier: 1
|
||||||
|
--- !u!1 &7013501782383369993
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1340148140657551652}
|
||||||
|
- component: {fileID: 7560570831503175390}
|
||||||
|
- component: {fileID: 5576232148191920921}
|
||||||
|
- component: {fileID: 3940389249836863728}
|
||||||
|
- component: {fileID: 1332562190786703389}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: InventorySlot_0
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &1340148140657551652
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7013501782383369993}
|
||||||
|
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: 2917712365648044858}
|
||||||
|
- {fileID: 9168090920327097179}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
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: 48, y: 48}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!222 &7560570831503175390
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7013501782383369993}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &5576232148191920921
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7013501782383369993}
|
||||||
|
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.3, g: 0.3, b: 0.3, 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!114 &3940389249836863728
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7013501782383369993}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 700406249e03c6646b1d535e57851f30, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::Slot
|
||||||
|
slotIndex: 0
|
||||||
|
item: {fileID: 0}
|
||||||
|
amount: 0
|
||||||
|
iconImage: {fileID: 4241945068260094018}
|
||||||
|
amountText: {fileID: 3688350745810595510}
|
||||||
|
amountPanel: {fileID: 1912723805268667563}
|
||||||
|
--- !u!114 &1332562190786703389
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7013501782383369993}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: d3bc6c48bea19c74ea4d056cb2471292, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryDragDrop
|
||||||
|
slot: {fileID: 3940389249836863728}
|
||||||
|
slotIndex: 0
|
||||||
|
dragIcon: {fileID: 0}
|
||||||
7
Assets/Inventory/Prefabs/InventorySlot_0.prefab.meta
Normal file
7
Assets/Inventory/Prefabs/InventorySlot_0.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 65ace2893bd6464429e57fc6aa3fd5aa
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
85
Assets/Inventory/Prefabs/InventorySystem.prefab
Normal file
85
Assets/Inventory/Prefabs/InventorySystem.prefab
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &5975229894509830887
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 8079351441219661693}
|
||||||
|
- component: {fileID: 7859836927392210389}
|
||||||
|
- component: {fileID: 6727284413363374745}
|
||||||
|
- component: {fileID: 8280792819179678159}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: InventorySystem
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &8079351441219661693
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5975229894509830887}
|
||||||
|
serializedVersion: 2
|
||||||
|
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: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &7859836927392210389
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5975229894509830887}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a4c4603259067dc4e96f741653843b92, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryManager
|
||||||
|
inventorySize: 36
|
||||||
|
slots: []
|
||||||
|
inventoryPanel: {fileID: 0}
|
||||||
|
hotbarSlots: []
|
||||||
|
itemDatabase: []
|
||||||
|
--- !u!114 &6727284413363374745
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5975229894509830887}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 9296b7da4cf11cf41909512f177d7434, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryUIBuilder
|
||||||
|
hotbarSlots: 9
|
||||||
|
inventoryRows: 4
|
||||||
|
inventoryCols: 9
|
||||||
|
slotPrefab: {fileID: 0}
|
||||||
|
defaultIcon: {fileID: 0}
|
||||||
|
inventoryPanelRect: {fileID: 0}
|
||||||
|
hotbarPanelRect: {fileID: 0}
|
||||||
|
--- !u!114 &8280792819179678159
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5975229894509830887}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: ad1628cce096628409729c00123006be, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::InventoryExampleItems
|
||||||
|
items: []
|
||||||
7
Assets/Inventory/Prefabs/InventorySystem.prefab.meta
Normal file
7
Assets/Inventory/Prefabs/InventorySystem.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5a88abbbbfdc34245b485cde6fca3c76
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
0
Assets/Inventory/Prefabs/test.prefab
Normal file
0
Assets/Inventory/Prefabs/test.prefab
Normal file
7
Assets/Inventory/Prefabs/test.prefab.meta
Normal file
7
Assets/Inventory/Prefabs/test.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 223ec2dc359ac0845957ab0b29284414
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/Inventory/Scripts.meta
Normal file
8
Assets/Inventory/Scripts.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5a7e9019099bb1b488b28e0c0132c939
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
202
Assets/Inventory/Scripts/CraftingManager.cs
Normal file
202
Assets/Inventory/Scripts/CraftingManager.cs
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
public class CraftingManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static CraftingManager Instance;
|
||||||
|
|
||||||
|
[Header("UI References")]
|
||||||
|
public GameObject craftingPanel;
|
||||||
|
public Slot[] inputSlots; // 9 слотов для входа (как в крафтинге)
|
||||||
|
public Slot outputSlot; // 1 слот для результата
|
||||||
|
public Text recipeNameText;
|
||||||
|
public Button craftButton;
|
||||||
|
|
||||||
|
[Header("Recipe Database")]
|
||||||
|
public List<CraftingRecipe> recipes;
|
||||||
|
|
||||||
|
private Dictionary<string, CraftingRecipe> _recipeDict;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
if (Instance == null)
|
||||||
|
Instance = this;
|
||||||
|
else
|
||||||
|
Destroy(gameObject);
|
||||||
|
|
||||||
|
_recipeDict = new Dictionary<string, CraftingRecipe>();
|
||||||
|
foreach (var recipe in recipes)
|
||||||
|
{
|
||||||
|
string key = GetRecipeKey(recipe);
|
||||||
|
_recipeDict[key] = recipe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
if (craftingPanel != null)
|
||||||
|
craftingPanel.SetActive(false);
|
||||||
|
|
||||||
|
if (craftButton != null)
|
||||||
|
craftButton.onClick.AddListener(Craft);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ToggleCrafting()
|
||||||
|
{
|
||||||
|
if (craftingPanel != null)
|
||||||
|
{
|
||||||
|
craftingPanel.SetActive(!craftingPanel.activeSelf);
|
||||||
|
if (craftingPanel.activeSelf)
|
||||||
|
CheckRecipe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Собираем ключ из текущих ингредиентов в слотах
|
||||||
|
string GetCurrentIngredientsKey()
|
||||||
|
{
|
||||||
|
var ingredients = new List<string>();
|
||||||
|
foreach (var slot in inputSlots)
|
||||||
|
{
|
||||||
|
if (!slot.IsEmpty)
|
||||||
|
{
|
||||||
|
ingredients.Add(slot.item.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ingredients.Sort();
|
||||||
|
return string.Join(",", ingredients);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем рецепт
|
||||||
|
public void CheckRecipe()
|
||||||
|
{
|
||||||
|
string key = GetCurrentIngredientsKey();
|
||||||
|
|
||||||
|
if (_recipeDict.TryGetValue(key, out CraftingRecipe recipe))
|
||||||
|
{
|
||||||
|
// Проверяем хватает ли количества
|
||||||
|
bool canCraft = true;
|
||||||
|
int slotIndex = 0;
|
||||||
|
|
||||||
|
foreach (var ingredientId in recipe.ingredients)
|
||||||
|
{
|
||||||
|
int required = recipe.amounts[System.Array.IndexOf(recipe.ingredients, ingredientId)];
|
||||||
|
int have = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < inputSlots.Length; i++)
|
||||||
|
{
|
||||||
|
if (!inputSlots[i].IsEmpty && inputSlots[i].item.id == ingredientId)
|
||||||
|
{
|
||||||
|
have += inputSlots[i].amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (have < required)
|
||||||
|
{
|
||||||
|
canCraft = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canCraft)
|
||||||
|
{
|
||||||
|
// Показываем результат
|
||||||
|
if (InventoryManager.Instance.itemDatabase.Find(x => x.id == recipe.resultId) is ItemData resultItem)
|
||||||
|
{
|
||||||
|
outputSlot.SetItem(resultItem, recipe.resultAmount);
|
||||||
|
if (recipeNameText != null)
|
||||||
|
recipeNameText.text = resultItem.itemName;
|
||||||
|
|
||||||
|
if (craftButton != null)
|
||||||
|
craftButton.interactable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputSlot.Clear();
|
||||||
|
if (recipeNameText != null)
|
||||||
|
recipeNameText.text = "Unknown recipe";
|
||||||
|
if (craftButton != null)
|
||||||
|
craftButton.interactable = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputSlot.Clear();
|
||||||
|
if (recipeNameText != null)
|
||||||
|
recipeNameText.text = "";
|
||||||
|
if (craftButton != null)
|
||||||
|
craftButton.interactable = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выполнить крафтинг
|
||||||
|
public void Craft()
|
||||||
|
{
|
||||||
|
string key = GetCurrentIngredientsKey();
|
||||||
|
|
||||||
|
if (_recipeDict.TryGetValue(key, out CraftingRecipe recipe))
|
||||||
|
{
|
||||||
|
// Удаляем ингредиенты
|
||||||
|
foreach (var ingredientId in recipe.ingredients)
|
||||||
|
{
|
||||||
|
int required = recipe.amounts[System.Array.IndexOf(recipe.ingredients, ingredientId)];
|
||||||
|
InventoryManager.Instance.RemoveItem(ingredientId, required);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Добавляем результат
|
||||||
|
int remaining = InventoryManager.Instance.AddItem(recipe.resultId, recipe.resultAmount);
|
||||||
|
if (remaining > 0)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Inventory full! Couldn't add {remaining} items.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Очищаем слоты ввода
|
||||||
|
foreach (var slot in inputSlots)
|
||||||
|
{
|
||||||
|
slot.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пересматриваем рецепт
|
||||||
|
CheckRecipe();
|
||||||
|
|
||||||
|
// Обновляем инвентарь
|
||||||
|
foreach (var slot in InventoryManager.Instance.slots)
|
||||||
|
{
|
||||||
|
slot.UpdateSlotUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Добавить рецепт
|
||||||
|
public void AddRecipe(string resultId, int resultAmount, string[] ingredients, int[] amounts)
|
||||||
|
{
|
||||||
|
var recipe = new CraftingRecipe
|
||||||
|
{
|
||||||
|
resultId = resultId,
|
||||||
|
resultAmount = resultAmount,
|
||||||
|
ingredients = ingredients,
|
||||||
|
amounts = amounts
|
||||||
|
};
|
||||||
|
|
||||||
|
recipes.Add(recipe);
|
||||||
|
string key = GetRecipeKey(recipe);
|
||||||
|
_recipeDict[key] = recipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetRecipeKey(CraftingRecipe recipe)
|
||||||
|
{
|
||||||
|
var sorted = new List<string>(recipe.ingredients);
|
||||||
|
sorted.Sort();
|
||||||
|
return string.Join(",", sorted);
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
public class CraftingRecipe
|
||||||
|
{
|
||||||
|
public string resultId;
|
||||||
|
public int resultAmount = 1;
|
||||||
|
public string[] ingredients;
|
||||||
|
public int[] amounts;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/CraftingManager.cs.meta
Normal file
2
Assets/Inventory/Scripts/CraftingManager.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c3c944af921361347b5bcb564f23e76d
|
||||||
236
Assets/Inventory/Scripts/InventoryDragDrop.cs
Normal file
236
Assets/Inventory/Scripts/InventoryDragDrop.cs
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.EventSystems;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка Drag & Drop предметов между слотами и выброс за пределы инвентаря
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryDragDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
|
||||||
|
{
|
||||||
|
public Slot slot;
|
||||||
|
public int slotIndex;
|
||||||
|
|
||||||
|
[Header("Drag Visual")]
|
||||||
|
[SerializeField] private RectTransform dragIcon;
|
||||||
|
[SerializeField] private Image dragImage;
|
||||||
|
[SerializeField] private float dragIconScale = 1.2f;
|
||||||
|
|
||||||
|
[Header("Drop Settings")]
|
||||||
|
[SerializeField] private bool allowDropOutside = true;
|
||||||
|
[SerializeField] private float dropThreshold = 100f; // пикселей за пределами инвентаря
|
||||||
|
|
||||||
|
private Canvas _canvas;
|
||||||
|
private CanvasGroup _canvasGroup;
|
||||||
|
private bool _isDragging;
|
||||||
|
private Vector2 _dragStartPosition;
|
||||||
|
private RectTransform _inventoryPanelRect;
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
_canvas = GetComponentInParent<Canvas>();
|
||||||
|
_canvasGroup = GetComponent<CanvasGroup>();
|
||||||
|
|
||||||
|
if (dragIcon == null)
|
||||||
|
{
|
||||||
|
CreateDragIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Находим панель инвентаря
|
||||||
|
var inventoryManager = FindObjectOfType<InventoryManager>();
|
||||||
|
if (inventoryManager?.inventoryPanel != null)
|
||||||
|
{
|
||||||
|
_inventoryPanelRect = inventoryManager.inventoryPanel.GetComponent<RectTransform>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dragIcon != null)
|
||||||
|
dragIcon.gameObject.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateDragIcon()
|
||||||
|
{
|
||||||
|
GameObject canvasGO = new GameObject("DragIconCanvas");
|
||||||
|
canvasGO.transform.SetParent(_canvas != null ? _canvas.transform : transform.root);
|
||||||
|
|
||||||
|
var dragCanvas = canvasGO.AddComponent<Canvas>();
|
||||||
|
dragCanvas.overrideSorting = true;
|
||||||
|
dragCanvas.sortingOrder = 1000;
|
||||||
|
dragCanvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||||
|
canvasGO.AddComponent<GraphicRaycaster>();
|
||||||
|
|
||||||
|
dragIcon = new GameObject("DragIcon").AddComponent<RectTransform>();
|
||||||
|
dragIcon.SetParent(canvasGO.transform, false);
|
||||||
|
dragIcon.sizeDelta = new Vector2(48, 48);
|
||||||
|
|
||||||
|
dragImage = dragIcon.gameObject.AddComponent<Image>();
|
||||||
|
dragImage.raycastTarget = false;
|
||||||
|
|
||||||
|
dragIcon.gameObject.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnBeginDrag(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
if (slot == null || slot.IsEmpty) return;
|
||||||
|
|
||||||
|
_isDragging = true;
|
||||||
|
_dragStartPosition = eventData.position;
|
||||||
|
|
||||||
|
if (_canvasGroup != null)
|
||||||
|
_canvasGroup.blocksRaycasts = false;
|
||||||
|
|
||||||
|
if (dragIcon != null && slot.item?.icon != null)
|
||||||
|
{
|
||||||
|
dragIcon.gameObject.SetActive(true);
|
||||||
|
dragImage.sprite = slot.item.icon;
|
||||||
|
dragIcon.localScale = Vector3.one * dragIconScale;
|
||||||
|
dragIcon.position = eventData.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bg = GetComponent<Image>();
|
||||||
|
if (bg != null)
|
||||||
|
bg.color = new Color(1f, 1f, 1f, 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnDrag(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
if (!_isDragging || dragIcon == null) return;
|
||||||
|
dragIcon.position = eventData.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnEndDrag(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
if (!_isDragging) return;
|
||||||
|
|
||||||
|
_isDragging = false;
|
||||||
|
|
||||||
|
if (dragIcon != null)
|
||||||
|
{
|
||||||
|
dragIcon.gameObject.SetActive(false);
|
||||||
|
dragIcon.localScale = Vector3.one;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_canvasGroup != null)
|
||||||
|
_canvasGroup.blocksRaycasts = true;
|
||||||
|
|
||||||
|
var bg = GetComponent<Image>();
|
||||||
|
if (bg != null)
|
||||||
|
bg.color = slot.IsEmpty ? new Color(0.25f, 0.25f, 0.25f, 0.8f) : new Color(0.35f, 0.35f, 0.35f, 0.95f);
|
||||||
|
|
||||||
|
// Проверяем - выбросили за пределы инвентаря?
|
||||||
|
if (allowDropOutside && IsOutsideInventory(eventData.position))
|
||||||
|
{
|
||||||
|
DropItemOutside();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Иначе - пробуем переместить в другой слот
|
||||||
|
var raycastResults = new System.Collections.Generic.List<RaycastResult>();
|
||||||
|
EventSystem.current.RaycastAll(eventData, raycastResults);
|
||||||
|
|
||||||
|
Slot targetSlot = null;
|
||||||
|
|
||||||
|
foreach (var result in raycastResults)
|
||||||
|
{
|
||||||
|
var slotComponent = result.gameObject.GetComponent<Slot>();
|
||||||
|
if (slotComponent != null && slotComponent != slot)
|
||||||
|
{
|
||||||
|
targetSlot = slotComponent;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetSlot != null && InventoryManager.Instance != null)
|
||||||
|
{
|
||||||
|
InventoryManager.Instance.SwapSlots(slotIndex, targetSlot.slotIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsOutsideInventory(Vector2 screenPosition)
|
||||||
|
{
|
||||||
|
if (_inventoryPanelRect == null) return false;
|
||||||
|
|
||||||
|
// Получаем границы панели инвентаря в экранных координатах
|
||||||
|
Vector3[] corners = new Vector3[4];
|
||||||
|
_inventoryPanelRect.GetWorldCorners(corners);
|
||||||
|
|
||||||
|
// rect панели в экранных координатах
|
||||||
|
float minX = corners[0].x;
|
||||||
|
float maxX = corners[2].x;
|
||||||
|
float minY = corners[0].y;
|
||||||
|
float maxY = corners[2].y;
|
||||||
|
|
||||||
|
// Добавляем отступ
|
||||||
|
float threshold = dropThreshold;
|
||||||
|
|
||||||
|
// Проверяем находится ли курсор за пределами панели + threshold
|
||||||
|
bool outside = screenPosition.x < minX - threshold ||
|
||||||
|
screenPosition.x > maxX + threshold ||
|
||||||
|
screenPosition.y < minY - threshold ||
|
||||||
|
screenPosition.y > maxY + threshold;
|
||||||
|
|
||||||
|
return outside;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DropItemOutside()
|
||||||
|
{
|
||||||
|
if (slot == null || slot.IsEmpty) return;
|
||||||
|
|
||||||
|
var item = slot.item;
|
||||||
|
int amount = slot.amount;
|
||||||
|
|
||||||
|
// Определяем позицию выброса
|
||||||
|
Vector3 dropPos = Vector3.zero;
|
||||||
|
if (Camera.main != null)
|
||||||
|
{
|
||||||
|
// Выбрасываем перед игроком
|
||||||
|
dropPos = Camera.main.transform.position + Camera.main.transform.forward * 2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создаём предмет в мире
|
||||||
|
if (InventoryItemFactory.Instance != null)
|
||||||
|
{
|
||||||
|
InventoryItemFactory.Instance.DropItem(item, amount, dropPos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback - просто создаём объект
|
||||||
|
var go = new GameObject($"Dropped_{item.itemName}");
|
||||||
|
go.transform.position = dropPos;
|
||||||
|
|
||||||
|
var visual = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||||
|
visual.transform.SetParent(go.transform);
|
||||||
|
visual.transform.localPosition = Vector3.zero;
|
||||||
|
visual.transform.localScale = Vector3.one * 0.3f;
|
||||||
|
DestroyImmediate(visual.GetComponent<Collider>());
|
||||||
|
|
||||||
|
var worldItem = go.AddComponent<WorldItem>();
|
||||||
|
worldItem.Setup(item, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Очищаем слот
|
||||||
|
slot.Clear();
|
||||||
|
|
||||||
|
Debug.Log($"[DragDrop] Выброшен: {item.itemName} x{amount}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPointerEnter(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
if (!_isDragging && slot != null && !slot.IsEmpty)
|
||||||
|
{
|
||||||
|
var bg = GetComponent<Image>();
|
||||||
|
if (bg != null)
|
||||||
|
bg.color = new Color(0.5f, 0.5f, 0.5f, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPointerExit(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
if (!_isDragging && slot != null)
|
||||||
|
{
|
||||||
|
var bg = GetComponent<Image>();
|
||||||
|
if (bg != null)
|
||||||
|
bg.color = slot.IsEmpty ?
|
||||||
|
new Color(0.25f, 0.25f, 0.25f, 0.8f) :
|
||||||
|
new Color(0.35f, 0.35f, 0.35f, 0.95f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventoryDragDrop.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryDragDrop.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d3bc6c48bea19c74ea4d056cb2471292
|
||||||
66
Assets/Inventory/Scripts/InventoryEvents.cs
Normal file
66
Assets/Inventory/Scripts/InventoryEvents.cs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// События инвентаря - используй UnityEvent для подписки из любого скрипта
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryEvents : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static InventoryEvents Instance { get; private set; }
|
||||||
|
|
||||||
|
[Header("Item Events")]
|
||||||
|
/// <param name="itemId">ID предмета</param>
|
||||||
|
/// <param name="amount">Количество</param>
|
||||||
|
public UnityEvent<string, int> OnItemAdded;
|
||||||
|
|
||||||
|
/// <param name="itemId">ID предмета</param>
|
||||||
|
/// <param name="amount">Количество</param>
|
||||||
|
public UnityEvent<string, int> OnItemRemoved;
|
||||||
|
|
||||||
|
/// <param name="itemId">ID предмета</param>
|
||||||
|
/// <param name="amount">Новое количество</param>
|
||||||
|
public UnityEvent<string, int> OnItemCountChanged;
|
||||||
|
|
||||||
|
[Header("Slot Events")]
|
||||||
|
/// <param name="slotIndex">Индекс слота</param>
|
||||||
|
/// <param name="itemId">ID предмета (null если пусто)</param>
|
||||||
|
public UnityEvent<int, string> OnSlotChanged;
|
||||||
|
|
||||||
|
[Header("Inventory State")]
|
||||||
|
public UnityEvent OnInventoryOpened;
|
||||||
|
public UnityEvent OnInventoryClosed;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
if (Instance == null)
|
||||||
|
{
|
||||||
|
Instance = this;
|
||||||
|
DontDestroyOnLoad(gameObject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Удобные методы для вызова событий
|
||||||
|
public void InvokeItemAdded(string itemId, int amount)
|
||||||
|
{
|
||||||
|
OnItemAdded?.Invoke(itemId, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeItemRemoved(string itemId, int amount)
|
||||||
|
{
|
||||||
|
OnItemRemoved?.Invoke(itemId, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeItemCountChanged(string itemId, int newAmount)
|
||||||
|
{
|
||||||
|
OnItemCountChanged?.Invoke(itemId, newAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeSlotChanged(int slotIndex, string itemId)
|
||||||
|
{
|
||||||
|
OnSlotChanged?.Invoke(slotIndex, itemId);
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventoryEvents.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryEvents.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 92259c03301739842b087d3e9d9b0c5f
|
||||||
113
Assets/Inventory/Scripts/InventoryExampleItems.cs
Normal file
113
Assets/Inventory/Scripts/InventoryExampleItems.cs
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Пример конфигурации предметов
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryExampleItems : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Item Database")]
|
||||||
|
public List<ItemData> items;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
// Создаём примеры предметов если база пустая
|
||||||
|
if (items == null || items.Count == 0)
|
||||||
|
{
|
||||||
|
items = CreateExampleItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Передаём в InventoryManager
|
||||||
|
var im = FindObjectOfType<InventoryManager>();
|
||||||
|
if (im != null)
|
||||||
|
{
|
||||||
|
im.itemDatabase = items;
|
||||||
|
im.RebuildItemDictionary();
|
||||||
|
|
||||||
|
// Сразу добавляем тестовые предметы
|
||||||
|
im.AddItem("stone", 32);
|
||||||
|
im.AddItem("dirt", 16);
|
||||||
|
im.AddItem("wood", 8);
|
||||||
|
im.AddItem("apple", 5);
|
||||||
|
im.AddItem("sword", 1);
|
||||||
|
im.AddItem("pickaxe", 1);
|
||||||
|
|
||||||
|
Debug.Log("[InventoryExampleItems] Added test items");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ItemData> CreateExampleItems()
|
||||||
|
{
|
||||||
|
return new List<ItemData>
|
||||||
|
{
|
||||||
|
CreateItem("stone", "Камень", "Обычный камень", ItemType.Block, 64),
|
||||||
|
CreateItem("dirt", "Земля", "Блок земли", ItemType.Block, 64),
|
||||||
|
CreateItem("wood", "Дерево", "Деревянный блок", ItemType.Block, 64),
|
||||||
|
CreateItem("plank", "Доски", "Деревянные доски", ItemType.Block, 64),
|
||||||
|
CreateItem("sword", "Меч", "Острый меч", ItemType.Weapon, 1),
|
||||||
|
CreateItem("apple", "Яблоко", "Вкусное яблоко", ItemType.Consumable, 16),
|
||||||
|
CreateItem("pickaxe", "Кирка", "Инструмент для добычи", ItemType.Tool, 1),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemData CreateItem(string id, string name, string desc, ItemType type, int stack)
|
||||||
|
{
|
||||||
|
var item = ScriptableObject.CreateInstance<ItemData>();
|
||||||
|
item.id = id;
|
||||||
|
item.itemName = name;
|
||||||
|
item.description = desc;
|
||||||
|
item.type = type;
|
||||||
|
item.maxStack = stack;
|
||||||
|
item.icon = CreatePlaceholderIcon(name);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sprite CreatePlaceholderIcon(string text)
|
||||||
|
{
|
||||||
|
// Создаём текстуру с текстом
|
||||||
|
var tex = new Texture2D(64, 64);
|
||||||
|
var colors = new Color[64 * 64];
|
||||||
|
|
||||||
|
// Заливаем цветом (серый фон)
|
||||||
|
for (int i = 0; i < colors.Length; i++)
|
||||||
|
{
|
||||||
|
colors[i] = new Color(0.5f, 0.5f, 0.5f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
tex.SetPixels(colors);
|
||||||
|
tex.Apply();
|
||||||
|
|
||||||
|
// Создаём спрайт
|
||||||
|
return Sprite.Create(tex, new Rect(0, 0, 64, 64), new Vector2(0.5f, 0.5f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавляет предметы в инвентарь при старте (для тестирования)
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryTester : MonoBehaviour
|
||||||
|
{
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
// Ждём кадр чтобы InventoryManager точно инициализировался
|
||||||
|
StartCoroutine(AddTestItems());
|
||||||
|
}
|
||||||
|
|
||||||
|
System.Collections.IEnumerator AddTestItems()
|
||||||
|
{
|
||||||
|
yield return null; // ждём один кадр
|
||||||
|
|
||||||
|
// Добавляем тестовые предметы
|
||||||
|
var im = InventoryManager.Instance;
|
||||||
|
if (im != null && im.GetItemCount("stone") == 0) // только если пусто
|
||||||
|
{
|
||||||
|
Debug.Log("[InventoryTester] Adding test items...");
|
||||||
|
im.AddItem("stone", 32);
|
||||||
|
im.AddItem("dirt", 16);
|
||||||
|
im.AddItem("wood", 8);
|
||||||
|
im.AddItem("apple", 5);
|
||||||
|
im.AddItem("sword", 1);
|
||||||
|
im.AddItem("pickaxe", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventoryExampleItems.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryExampleItems.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ad1628cce096628409729c00123006be
|
||||||
271
Assets/Inventory/Scripts/InventoryItemFactory.cs
Normal file
271
Assets/Inventory/Scripts/InventoryItemFactory.cs
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
using UnityEditor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конфигурация для фабрики предметов - создать в Assets > Create > Inventory > Item Factory Config
|
||||||
|
/// </summary>
|
||||||
|
[CreateAssetMenu(fileName = "ItemFactoryConfig", menuName = "Inventory/Item Factory Config")]
|
||||||
|
public class ItemFactoryConfig : ScriptableObject
|
||||||
|
{
|
||||||
|
[Header("World Item Prefabs")]
|
||||||
|
public GameObject worldItemPrefab; // Префаб предмета в мире
|
||||||
|
|
||||||
|
[Header("Spawner Prefab")]
|
||||||
|
public GameObject itemSpawnerPrefab; // Префаб спавнера
|
||||||
|
|
||||||
|
[Header("Pickup Settings")]
|
||||||
|
public float pickupRadius = 1.5f;
|
||||||
|
public float despawnTime = 300f; // 5 минут
|
||||||
|
|
||||||
|
[Header("Drop Settings")]
|
||||||
|
public float dropForce = 2f;
|
||||||
|
public float dropRandomness = 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Фабрика для создания префабов предметов - заменяет прямой Instantiate и Resources.Load
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryItemFactory : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static InventoryItemFactory Instance { get; private set; }
|
||||||
|
|
||||||
|
[Header("Configuration")]
|
||||||
|
[Tooltip("Создать в Assets > Create > Inventory > Item Factory Config")]
|
||||||
|
public ItemFactoryConfig config;
|
||||||
|
|
||||||
|
[Header("Debug")]
|
||||||
|
public bool logSpawns = false;
|
||||||
|
|
||||||
|
// Кэшированные ссылки для быстрого доступа
|
||||||
|
private Dictionary<string, GameObject> _prefabCache = new Dictionary<string, GameObject>();
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
if (Instance == null)
|
||||||
|
{
|
||||||
|
Instance = this;
|
||||||
|
DontDestroyOnLoad(gameObject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать предмет в мире (WorldItem)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="itemData">Данные предмета</param>
|
||||||
|
/// <param name="amount">Количество</param>
|
||||||
|
/// <param name="position">Позиция спавна</param>
|
||||||
|
/// <param name="rotation"> rotation ( Quaternion.identity по умолчанию)</param>
|
||||||
|
public WorldItem CreateWorldItem(ItemData itemData, int amount, Vector3 position, Quaternion rotation = default)
|
||||||
|
{
|
||||||
|
GameObject go;
|
||||||
|
|
||||||
|
if (config == null || config.worldItemPrefab == null)
|
||||||
|
{
|
||||||
|
// Fallback - создаём без префаба
|
||||||
|
go = new GameObject($"WorldItem_{itemData.itemName}");
|
||||||
|
go.transform.position = position;
|
||||||
|
go.transform.rotation = rotation;
|
||||||
|
|
||||||
|
// Добавляем компоненты для физики
|
||||||
|
var collider = go.AddComponent<SphereCollider>();
|
||||||
|
collider.radius = 0.3f;
|
||||||
|
collider.isTrigger = true;
|
||||||
|
var rb = go.AddComponent<Rigidbody>();
|
||||||
|
rb.isKinematic = true;
|
||||||
|
rb.useGravity = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
go = Instantiate(config.worldItemPrefab, position, rotation);
|
||||||
|
}
|
||||||
|
var worldItem = go.GetComponent<WorldItem>();
|
||||||
|
|
||||||
|
if (worldItem == null)
|
||||||
|
worldItem = go.AddComponent<WorldItem>();
|
||||||
|
|
||||||
|
worldItem.Setup(itemData, amount);
|
||||||
|
|
||||||
|
if (logSpawns)
|
||||||
|
Debug.Log($"[Factory] Created WorldItem: {itemData.itemName} x{amount} at {position}");
|
||||||
|
|
||||||
|
return worldItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать предмет в мире с настраиваемым временем жизни
|
||||||
|
/// </summary>
|
||||||
|
public WorldItem CreateWorldItem(ItemData itemData, int amount, Vector3 position, float lifetime, Quaternion rotation = default)
|
||||||
|
{
|
||||||
|
var worldItem = CreateWorldItem(itemData, amount, position, rotation);
|
||||||
|
if (worldItem != null && lifetime > 0)
|
||||||
|
{
|
||||||
|
Destroy(worldItem.gameObject, lifetime);
|
||||||
|
}
|
||||||
|
return worldItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать спавнер предмета (точка появления)
|
||||||
|
/// </summary>
|
||||||
|
public ItemSpawner CreateItemSpawner(ItemData itemData, int amount, Vector3 position)
|
||||||
|
{
|
||||||
|
if (config == null || config.itemSpawnerPrefab == null)
|
||||||
|
{
|
||||||
|
// Создаём базовый спавнер без префаба
|
||||||
|
return CreateSpawnerFallback(itemData, amount, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
var go = Instantiate(config.itemSpawnerPrefab, position, Quaternion.identity);
|
||||||
|
var spawner = go.GetComponent<ItemSpawner>();
|
||||||
|
|
||||||
|
if (spawner == null)
|
||||||
|
spawner = go.AddComponent<ItemSpawner>();
|
||||||
|
|
||||||
|
spawner.Setup(itemData, amount, config.despawnTime);
|
||||||
|
|
||||||
|
if (logSpawns)
|
||||||
|
Debug.Log($"[Factory] Created Spawner: {itemData.itemName} x{amount}");
|
||||||
|
|
||||||
|
return spawner;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ItemSpawner CreateSpawnerFallback(ItemData itemData, int amount, Vector3 position)
|
||||||
|
{
|
||||||
|
var go = new GameObject($"Spawner_{itemData.itemName}");
|
||||||
|
go.transform.position = position;
|
||||||
|
var spawner = go.AddComponent<ItemSpawner>();
|
||||||
|
spawner.Setup(itemData, amount, config != null ? config.despawnTime : 300f);
|
||||||
|
return spawner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Выбросить предмет из инвентаря (drop)
|
||||||
|
/// </summary>
|
||||||
|
public WorldItem DropItem(ItemData itemData, int amount, Vector3 dropPosition, Vector3? velocity = null)
|
||||||
|
{
|
||||||
|
// Добавляем небольшое случайное смещение
|
||||||
|
Vector3 offset = Vector3.zero;
|
||||||
|
if (config != null)
|
||||||
|
{
|
||||||
|
offset = new Vector3(
|
||||||
|
Random.Range(-config.dropRandomness, config.dropRandomness),
|
||||||
|
0.5f,
|
||||||
|
Random.Range(-config.dropRandomness, config.dropRandomness)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 spawnPos = dropPosition + offset;
|
||||||
|
Quaternion rotation = Quaternion.Euler(
|
||||||
|
Random.Range(0, 360),
|
||||||
|
Random.Range(0, 360),
|
||||||
|
Random.Range(0, 360)
|
||||||
|
);
|
||||||
|
|
||||||
|
var worldItem = CreateWorldItem(itemData, amount, spawnPos, rotation);
|
||||||
|
|
||||||
|
// Добавляем начальную скорость (для выброса из инвентаря)
|
||||||
|
if (velocity.HasValue && worldItem != null)
|
||||||
|
{
|
||||||
|
var rb = worldItem.GetComponent<Rigidbody>();
|
||||||
|
if (rb == null)
|
||||||
|
rb = worldItem.gameObject.AddComponent<Rigidbody>();
|
||||||
|
|
||||||
|
rb.linearVelocity = velocity.Value + (Vector3.up * (config?.dropForce ?? 2f));
|
||||||
|
}
|
||||||
|
|
||||||
|
return worldItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Предмет подбирается игроком - вызывается из WorldItem
|
||||||
|
/// </summary>
|
||||||
|
public bool PickupItem(WorldItem worldItem, MonoBehaviour picker)
|
||||||
|
{
|
||||||
|
if (worldItem == null || worldItem.itemData == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int remaining = InventoryManager.Instance.AddItem(worldItem.itemData, worldItem.amount);
|
||||||
|
|
||||||
|
if (remaining <= 0)
|
||||||
|
{
|
||||||
|
if (logSpawns)
|
||||||
|
Debug.Log($"[Factory] Picked up: {worldItem.itemData.itemName} x{worldItem.amount}");
|
||||||
|
Destroy(worldItem.gameObject);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Частичный подбор
|
||||||
|
worldItem.amount = remaining;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать префаб из GameObject в рантайме (динамические предметы)
|
||||||
|
/// </summary>
|
||||||
|
public GameObject CreateItemModel(GameObject modelPrefab, Transform parent)
|
||||||
|
{
|
||||||
|
if (modelPrefab == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return Instantiate(modelPrefab, parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
/// <summary>
|
||||||
|
/// Кастомный редактор для быстрой настройки фабрики
|
||||||
|
/// </summary>
|
||||||
|
[CustomEditor(typeof(InventoryItemFactory))]
|
||||||
|
public class InventoryItemFactoryEditor : Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
var factory = (InventoryItemFactory)target;
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
|
||||||
|
if (factory.config == null)
|
||||||
|
{
|
||||||
|
EditorGUILayout.HelpBox(
|
||||||
|
"Создайте ItemFactoryConfig: Assets > Create > Inventory > Item Factory Config",
|
||||||
|
MessageType.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Создать ItemFactoryConfig"))
|
||||||
|
{
|
||||||
|
var config = ScriptableObject.CreateInstance<ItemFactoryConfig>();
|
||||||
|
AssetDatabase.CreateAsset(config, "Assets/Inventory/Configs/ItemFactoryConfig.asset");
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
factory.config = config;
|
||||||
|
Debug.Log("Создан ItemFactoryConfig");
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.Space(5);
|
||||||
|
|
||||||
|
if (GUILayout.Button("Создать тестовый предмет в сцене"))
|
||||||
|
{
|
||||||
|
if (InventoryManager.Instance?.itemDatabase?.Count > 0)
|
||||||
|
{
|
||||||
|
var item = InventoryManager.Instance.itemDatabase[0];
|
||||||
|
factory.CreateWorldItem(item, 5, Vector3.zero + Vector3.forward * 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("Сначала добавьте предметы в InventoryManager");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Assets/Inventory/Scripts/InventoryItemFactory.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryItemFactory.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2e734a4abaff54d45b8294cb6e023bea
|
||||||
601
Assets/Inventory/Scripts/InventoryManager.cs
Normal file
601
Assets/Inventory/Scripts/InventoryManager.cs
Normal file
@@ -0,0 +1,601 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
public class InventoryManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static InventoryManager Instance { get; private set; }
|
||||||
|
|
||||||
|
[Header("Inventory Settings")]
|
||||||
|
public int inventorySize = 36;
|
||||||
|
public Slot[] slots;
|
||||||
|
public Slot[] hotbarSlots; // 9 слотов хотбара (индексы 0-8)
|
||||||
|
|
||||||
|
[Header("Item Database")]
|
||||||
|
public List<ItemData> itemDatabase;
|
||||||
|
|
||||||
|
[Header("References")]
|
||||||
|
public GameObject inventoryPanel;
|
||||||
|
public Canvas inventoryCanvas;
|
||||||
|
|
||||||
|
[Header("Events")]
|
||||||
|
/// <param name="itemId">ID предмета</param>
|
||||||
|
/// <param name="amount">Количество</param>
|
||||||
|
public UnityEvent<string, int> OnItemAdded;
|
||||||
|
public UnityEvent<string, int> OnItemRemoved;
|
||||||
|
|
||||||
|
// Приватные поля
|
||||||
|
private Dictionary<string, ItemData> _itemDict;
|
||||||
|
private int _selectedHotbarSlot = 0;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
// Сделать этот объект корневым для DontDestroyOnLoad
|
||||||
|
transform.SetParent(null);
|
||||||
|
|
||||||
|
if (Instance == null)
|
||||||
|
{
|
||||||
|
Instance = this;
|
||||||
|
DontDestroyOnLoad(gameObject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создаём InventoryItemFactory если его нет
|
||||||
|
if (InventoryItemFactory.Instance == null)
|
||||||
|
{
|
||||||
|
var factoryGO = new GameObject("InventoryItemFactory");
|
||||||
|
factoryGO.AddComponent<InventoryItemFactory>();
|
||||||
|
DontDestroyOnLoad(factoryGO);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Словарь создаём лениво
|
||||||
|
RebuildItemDictionary();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Пересоздать словарь предметов из itemDatabase
|
||||||
|
/// </summary>
|
||||||
|
public void RebuildItemDictionary()
|
||||||
|
{
|
||||||
|
_itemDict = new Dictionary<string, ItemData>();
|
||||||
|
if (itemDatabase != null)
|
||||||
|
{
|
||||||
|
foreach (var item in itemDatabase)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(item?.id))
|
||||||
|
{
|
||||||
|
_itemDict[item.id] = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Debug.Log($"[InventoryManager] Loaded {_itemDict.Count} items into dictionary");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
// Инициализация слотов
|
||||||
|
if (slots == null || slots.Length == 0)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("Slots not assigned! Assign them in Inspector or use InventoryUIBuilder.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
slot?.UpdateSlotUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hotbarSlots != null)
|
||||||
|
{
|
||||||
|
foreach (var slot in hotbarSlots)
|
||||||
|
{
|
||||||
|
slot?.UpdateSlotUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Скрыть инвентарь по умолчанию
|
||||||
|
if (inventoryPanel != null)
|
||||||
|
inventoryPanel.SetActive(false);
|
||||||
|
|
||||||
|
// Убедимся что события существуют
|
||||||
|
if (InventoryEvents.Instance == null)
|
||||||
|
{
|
||||||
|
var eventsGO = new GameObject("InventoryEvents");
|
||||||
|
eventsGO.AddComponent<InventoryEvents>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
// Toggle инвентаря на Tab
|
||||||
|
if (Input.GetKeyDown(KeyCode.Tab))
|
||||||
|
{
|
||||||
|
ToggleInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Закрыть на Escape
|
||||||
|
if (Input.GetKeyDown(KeyCode.Escape) && inventoryPanel != null && inventoryPanel.activeSelf)
|
||||||
|
{
|
||||||
|
ToggleInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Горячие клавиши 1-9 для хотбара
|
||||||
|
for (int i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.Alpha1 + i))
|
||||||
|
{
|
||||||
|
SelectHotbarSlot(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выброс предмета на Q
|
||||||
|
if (Input.GetKeyDown(KeyCode.Q))
|
||||||
|
{
|
||||||
|
DropSelectedItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ToggleInventory()
|
||||||
|
{
|
||||||
|
if (inventoryPanel != null)
|
||||||
|
{
|
||||||
|
bool wasActive = inventoryPanel.activeSelf;
|
||||||
|
inventoryPanel.SetActive(!wasActive);
|
||||||
|
|
||||||
|
if (!wasActive)
|
||||||
|
{
|
||||||
|
Cursor.lockState = CursorLockMode.None;
|
||||||
|
InventoryEvents.Instance?.OnInventoryOpened?.Invoke();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cursor.lockState = CursorLockMode.Locked;
|
||||||
|
InventoryEvents.Instance?.OnInventoryClosed?.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectHotbarSlot(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= 9 || hotbarSlots == null || hotbarSlots.Length < 9)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Снимаем выделение со старого
|
||||||
|
if (_selectedHotbarSlot >= 0 && _selectedHotbarSlot < hotbarSlots.Length)
|
||||||
|
{
|
||||||
|
hotbarSlots[_selectedHotbarSlot].SetSelected(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
_selectedHotbarSlot = index;
|
||||||
|
hotbarSlots[index].SetSelected(true);
|
||||||
|
|
||||||
|
// Получаем выбранный предмет
|
||||||
|
var selectedItem = hotbarSlots[index].item;
|
||||||
|
Debug.Log($"[Inventory] Selected hotbar slot: {index} - {selectedItem?.itemName ?? "Empty"}");
|
||||||
|
|
||||||
|
// TODO: Эвент для использования предмета
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить предмет в выбранном слоте хотбара
|
||||||
|
/// </summary>
|
||||||
|
public ItemData GetSelectedHotbarItem()
|
||||||
|
{
|
||||||
|
if (hotbarSlots != null && _selectedHotbarSlot >= 0 && _selectedHotbarSlot < hotbarSlots.Length)
|
||||||
|
{
|
||||||
|
return hotbarSlots[_selectedHotbarSlot].item;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Выбросить выбранный предмет из хотбара
|
||||||
|
/// </summary>
|
||||||
|
public void DropSelectedItem()
|
||||||
|
{
|
||||||
|
if (hotbarSlots == null || _selectedHotbarSlot >= hotbarSlots.Length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var slot = hotbarSlots[_selectedHotbarSlot];
|
||||||
|
if (slot.IsEmpty) return;
|
||||||
|
|
||||||
|
var item = slot.item;
|
||||||
|
int amount = slot.amount;
|
||||||
|
|
||||||
|
// Создаём предмет в мире через factory
|
||||||
|
if (InventoryItemFactory.Instance != null)
|
||||||
|
{
|
||||||
|
// Используем позицию игрока
|
||||||
|
Vector3 dropPos = Vector3.zero; // Заменить на позицию игрока
|
||||||
|
if (Camera.main != null)
|
||||||
|
{
|
||||||
|
dropPos = Camera.main.transform.position + Camera.main.transform.forward * 2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
InventoryItemFactory.Instance.DropItem(item, amount, dropPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Очищаем слот
|
||||||
|
slot.Clear();
|
||||||
|
|
||||||
|
Debug.Log($"[Inventory] Dropped {item.itemName} x{amount}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== ОСНОВНЫЕ ОПЕРАЦИИ ====================
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить предмет в инвентарь
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Количество не поместившихся предметов</returns>
|
||||||
|
public int AddItem(string itemId, int amount = 1)
|
||||||
|
{
|
||||||
|
if (!_itemDict.TryGetValue(itemId, out ItemData item))
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Item not found: {itemId}");
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AddItem(item, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int AddItem(ItemData item, int amount = 1)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[AddItem] item is null!");
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log($"[AddItem] Adding {item.itemName} x{amount}, slots count: {slots?.Length ?? 0}");
|
||||||
|
|
||||||
|
if (slots == null || slots.Length == 0)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[AddItem] Slots not initialized!");
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сначала пытаемся доложить в существующие стеки (основной инвентарь)
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.IsEmpty) continue;
|
||||||
|
if (slot.item.id == item.id)
|
||||||
|
{
|
||||||
|
amount = slot.AddItems(item, amount);
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
OnItemAdded?.Invoke(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemAdded(item.id, slot.amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Добавляем в пустые слоты (основной инвентарь)
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.IsEmpty)
|
||||||
|
{
|
||||||
|
amount = slot.AddItems(item, amount);
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
OnItemAdded?.Invoke(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemAdded(item.id, slot.amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пробуем хотбар
|
||||||
|
foreach (var slot in hotbarSlots)
|
||||||
|
{
|
||||||
|
if (!slot.IsEmpty && slot.item.id == item.id)
|
||||||
|
{
|
||||||
|
amount = slot.AddItems(item, amount);
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
OnItemAdded?.Invoke(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemAdded(item.id, slot.amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var slot in hotbarSlots)
|
||||||
|
{
|
||||||
|
if (slot.IsEmpty)
|
||||||
|
{
|
||||||
|
amount = slot.AddItems(item, amount);
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
OnItemAdded?.Invoke(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemAdded(item.id, slot.amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удалить предмет из инвентаря
|
||||||
|
/// </summary>
|
||||||
|
public bool RemoveItem(string itemId, int amount = 1)
|
||||||
|
{
|
||||||
|
int remaining = amount;
|
||||||
|
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
{
|
||||||
|
if (slot.amount >= remaining)
|
||||||
|
{
|
||||||
|
var (item, taken) = slot.TakeItems(remaining);
|
||||||
|
OnItemRemoved?.Invoke(itemId, taken);
|
||||||
|
InventoryEvents.Instance?.InvokeItemRemoved(itemId, taken);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remaining -= slot.amount;
|
||||||
|
slot.Clear();
|
||||||
|
OnItemRemoved?.Invoke(itemId, slot.amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemRemoved(itemId, slot.amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пробуем хотбар
|
||||||
|
if (remaining > 0)
|
||||||
|
{
|
||||||
|
foreach (var slot in hotbarSlots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
{
|
||||||
|
if (slot.amount >= remaining)
|
||||||
|
{
|
||||||
|
var (item, taken) = slot.TakeItems(remaining);
|
||||||
|
OnItemRemoved?.Invoke(itemId, taken);
|
||||||
|
InventoryEvents.Instance?.InvokeItemRemoved(itemId, taken);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remaining -= slot.amount;
|
||||||
|
slot.Clear();
|
||||||
|
OnItemRemoved?.Invoke(itemId, slot.amount);
|
||||||
|
InventoryEvents.Instance?.InvokeItemRemoved(itemId, slot.amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return remaining <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить количество предмета в инвентаре
|
||||||
|
/// </summary>
|
||||||
|
public int GetItemCount(string itemId)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
if (slots != null)
|
||||||
|
{
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
{
|
||||||
|
count += slot.amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hotbarSlots != null)
|
||||||
|
{
|
||||||
|
foreach (var slot in hotbarSlots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
{
|
||||||
|
count += slot.amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Есть ли предмет в инвентаре
|
||||||
|
/// </summary>
|
||||||
|
public bool HasItem(string itemId, int amount = 1)
|
||||||
|
{
|
||||||
|
return GetItemCount(itemId) >= amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить слот по индексу
|
||||||
|
/// </summary>
|
||||||
|
public Slot GetSlot(int index)
|
||||||
|
{
|
||||||
|
if (index >= 0 && index < slots.Length)
|
||||||
|
return slots[index];
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Найти первый слот с указанным предметом
|
||||||
|
/// </summary>
|
||||||
|
public Slot FindSlotWithItem(string itemId)
|
||||||
|
{
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Найти все слоты с указанным предметом
|
||||||
|
/// </summary>
|
||||||
|
public List<Slot> FindAllSlotsWithItem(string itemId)
|
||||||
|
{
|
||||||
|
var result = new List<Slot>();
|
||||||
|
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.item != null && slot.item.id == itemId)
|
||||||
|
result.Add(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Найти первый пустой слот
|
||||||
|
/// </summary>
|
||||||
|
public Slot FindEmptySlot()
|
||||||
|
{
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
if (slot.IsEmpty)
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поменять предметы между двумя слотами
|
||||||
|
/// </summary>
|
||||||
|
public void SwapSlots(int fromIndex, int toIndex)
|
||||||
|
{
|
||||||
|
if (fromIndex < 0 || fromIndex >= slots.Length ||
|
||||||
|
toIndex < 0 || toIndex >= slots.Length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var fromSlot = slots[fromIndex];
|
||||||
|
var toSlot = slots[toIndex];
|
||||||
|
|
||||||
|
// Сохраняем данные
|
||||||
|
var tempItem = fromSlot.item;
|
||||||
|
var tempAmount = fromSlot.amount;
|
||||||
|
|
||||||
|
// Меняем
|
||||||
|
if (toSlot.IsEmpty)
|
||||||
|
{
|
||||||
|
fromSlot.Clear();
|
||||||
|
toSlot.SetItem(tempItem, tempAmount);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fromSlot.SetItem(toSlot.item, toSlot.amount);
|
||||||
|
toSlot.SetItem(tempItem, tempAmount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очистить инвентарь
|
||||||
|
/// </summary>
|
||||||
|
public void ClearInventory()
|
||||||
|
{
|
||||||
|
foreach (var slot in slots)
|
||||||
|
{
|
||||||
|
slot?.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вызывается когда слот очищен (внутренний метод)
|
||||||
|
/// </summary>
|
||||||
|
public void OnSlotCleared(int slotIndex)
|
||||||
|
{
|
||||||
|
// Можно добавить дополнительную логику
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== ТЕСТОВЫЕ МЕТОДЫ ====================
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать тестовый предмет в мире (для отладки)
|
||||||
|
/// </summary>
|
||||||
|
[ContextMenu("Spawn Test Item")]
|
||||||
|
public void SpawnTestItem()
|
||||||
|
{
|
||||||
|
if (itemDatabase == null || itemDatabase.Count == 0)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("No items in database!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создаём предмет напротив игрока
|
||||||
|
Vector3 spawnPos = Vector3.zero;
|
||||||
|
var player = GameObject.FindGameObjectWithTag("Player");
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
spawnPos = player.transform.position + player.transform.forward * 2f;
|
||||||
|
spawnPos.y = 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = itemDatabase[0];
|
||||||
|
if (InventoryItemFactory.Instance != null)
|
||||||
|
{
|
||||||
|
InventoryItemFactory.Instance.CreateWorldItem(item, 5, spawnPos);
|
||||||
|
Debug.Log($"Spawned test item: {item.itemName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== РАБОТА С JSON ====================
|
||||||
|
|
||||||
|
public string ExportToJson()
|
||||||
|
{
|
||||||
|
var inventoryData = new InventorySaveData();
|
||||||
|
inventoryData.slots = new SlotData[slots.Length];
|
||||||
|
|
||||||
|
for (int i = 0; i < slots.Length; i++)
|
||||||
|
{
|
||||||
|
inventoryData.slots[i] = new SlotData
|
||||||
|
{
|
||||||
|
itemId = slots[i].item?.id,
|
||||||
|
amount = slots[i].amount
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return JsonUtility.ToJson(inventoryData, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ImportFromJson(string json)
|
||||||
|
{
|
||||||
|
var inventoryData = JsonUtility.FromJson<InventorySaveData>(json);
|
||||||
|
|
||||||
|
for (int i = 0; i < Mathf.Min(inventoryData.slots.Length, slots.Length); i++)
|
||||||
|
{
|
||||||
|
var slotData = inventoryData.slots[i];
|
||||||
|
if (!string.IsNullOrEmpty(slotData.itemId) && _itemDict.TryGetValue(slotData.itemId, out ItemData item))
|
||||||
|
{
|
||||||
|
slots[i].SetItem(item, slotData.amount);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
slots[i].Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
class InventorySaveData
|
||||||
|
{
|
||||||
|
public SlotData[] slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
class SlotData
|
||||||
|
{
|
||||||
|
public string itemId;
|
||||||
|
public int amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventoryManager.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryManager.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a4c4603259067dc4e96f741653843b92
|
||||||
294
Assets/Inventory/Scripts/InventorySceneSetup.cs
Normal file
294
Assets/Inventory/Scripts/InventorySceneSetup.cs
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
public class InventorySceneSetup
|
||||||
|
{
|
||||||
|
[MenuItem("Tools/Create Player")]
|
||||||
|
public static void CreatePlayer()
|
||||||
|
{
|
||||||
|
var go = new GameObject("Player");
|
||||||
|
|
||||||
|
var cc = go.AddComponent<CharacterController>();
|
||||||
|
cc.height = 1.8f;
|
||||||
|
cc.radius = 0.5f;
|
||||||
|
cc.center = new Vector3(0, 0.9f, 0);
|
||||||
|
|
||||||
|
var character = go.AddComponent<charecter>();
|
||||||
|
character.walkSpeed = 5f;
|
||||||
|
character.runSpeed = 9f;
|
||||||
|
character.crouchSpeed = 2.5f;
|
||||||
|
character.jumpHeight = 1.5f;
|
||||||
|
character.gravity = -9.81f;
|
||||||
|
|
||||||
|
GameObject body = GameObject.CreatePrimitive(PrimitiveType.Capsule);
|
||||||
|
body.name = "Body";
|
||||||
|
body.transform.SetParent(go.transform);
|
||||||
|
body.transform.localPosition = Vector3.zero;
|
||||||
|
GameObject.Destroy(body.GetComponent<Collider>());
|
||||||
|
|
||||||
|
GameObject head = new GameObject("Head");
|
||||||
|
head.transform.SetParent(go.transform);
|
||||||
|
head.transform.localPosition = new Vector3(0, 0.8f, 0);
|
||||||
|
character.head = head.transform;
|
||||||
|
|
||||||
|
GameObject camObj = new GameObject("PlayerCamera");
|
||||||
|
camObj.transform.SetParent(head.transform);
|
||||||
|
camObj.transform.localPosition = new Vector3(0, 0.1f, 0);
|
||||||
|
var cam = camObj.AddComponent<Camera>();
|
||||||
|
cam.tag = "MainCamera";
|
||||||
|
|
||||||
|
var existingCam = GameObject.FindGameObjectWithTag("MainCamera");
|
||||||
|
if (existingCam != null && existingCam != camObj)
|
||||||
|
{
|
||||||
|
GameObject.Destroy(existingCam);
|
||||||
|
}
|
||||||
|
|
||||||
|
go.tag = "Player";
|
||||||
|
go.transform.position = new Vector3(0, 2, -5);
|
||||||
|
|
||||||
|
Selection.activeGameObject = go;
|
||||||
|
Debug.Log("[Tools] Создан игрок!");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/Create Item Prefab")]
|
||||||
|
public static void CreateItemPrefab()
|
||||||
|
{
|
||||||
|
var itemGO = new GameObject("NewItem");
|
||||||
|
itemGO.AddComponent<WorldItem>();
|
||||||
|
|
||||||
|
var sphere = itemGO.AddComponent<SphereCollider>();
|
||||||
|
sphere.radius = 0.5f;
|
||||||
|
sphere.isTrigger = true;
|
||||||
|
|
||||||
|
var visual = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||||
|
visual.name = "Visual";
|
||||||
|
visual.transform.SetParent(itemGO.transform);
|
||||||
|
visual.transform.localPosition = Vector3.zero;
|
||||||
|
visual.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
|
||||||
|
GameObject.Destroy(visual.GetComponent<Collider>());
|
||||||
|
|
||||||
|
Selection.activeGameObject = itemGO;
|
||||||
|
Debug.Log("[Tools] Создан префаб предмета!");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/Create Test Item in Scene")]
|
||||||
|
public static void CreateTestItem()
|
||||||
|
{
|
||||||
|
// Создаём тестовый предмет в сцене
|
||||||
|
var itemGO = new GameObject("TestItem");
|
||||||
|
itemGO.transform.position = new Vector3(0, 0.5f, 3);
|
||||||
|
|
||||||
|
// Визуал
|
||||||
|
var visual = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||||
|
visual.name = "Visual";
|
||||||
|
visual.transform.SetParent(itemGO.transform);
|
||||||
|
visual.transform.localPosition = Vector3.zero;
|
||||||
|
visual.transform.localScale = Vector3.one * 0.3f;
|
||||||
|
GameObject.Destroy(visual.GetComponent<Collider>());
|
||||||
|
|
||||||
|
// Компонент предмета
|
||||||
|
var worldItem = itemGO.AddComponent<WorldItem>();
|
||||||
|
worldItem.pickupDelay = 0f; // мгновенный подбор
|
||||||
|
worldItem.useFactory = false;
|
||||||
|
|
||||||
|
// Тестовые данные
|
||||||
|
var testItem = ScriptableObject.CreateInstance<ItemData>();
|
||||||
|
testItem.id = "test_item";
|
||||||
|
testItem.itemName = "Тестовый предмет";
|
||||||
|
testItem.description = "Просто тестовый предмет";
|
||||||
|
testItem.type = ItemType.Material;
|
||||||
|
testItem.maxStack = 64;
|
||||||
|
|
||||||
|
worldItem.itemData = testItem;
|
||||||
|
worldItem.amount = 5;
|
||||||
|
|
||||||
|
// Коллайдер для подбора (trigger для обычных коллайдеров)
|
||||||
|
var box = itemGO.AddComponent<BoxCollider>();
|
||||||
|
box.isTrigger = true;
|
||||||
|
box.size = Vector3.one;
|
||||||
|
|
||||||
|
Selection.activeGameObject = itemGO;
|
||||||
|
Debug.Log("[Tools] Создан тестовый предмет! Подойдите к нему игроком.");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/Setup Inventory Scene")]
|
||||||
|
public static void SetupScene()
|
||||||
|
{
|
||||||
|
var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
|
||||||
|
var rootObjects = scene.GetRootGameObjects();
|
||||||
|
|
||||||
|
foreach (var root in rootObjects)
|
||||||
|
{
|
||||||
|
if (root.GetComponent<InventoryManager>() != null)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("InventoryManager уже существует!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создаём GameManager
|
||||||
|
var gameManager = new GameObject("GameManager");
|
||||||
|
var im = gameManager.AddComponent<InventoryManager>();
|
||||||
|
gameManager.AddComponent<InventoryExampleItems>();
|
||||||
|
gameManager.AddComponent<InventoryTester>();
|
||||||
|
|
||||||
|
// Создаём Canvas
|
||||||
|
var canvasGO = new GameObject("InventoryCanvas");
|
||||||
|
var canvas = canvasGO.AddComponent<Canvas>();
|
||||||
|
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||||
|
canvas.sortingOrder = 100;
|
||||||
|
canvasGO.AddComponent<GraphicRaycaster>();
|
||||||
|
|
||||||
|
// Создаём панель инвентаря
|
||||||
|
var inventoryPanel = CreatePanel(canvasGO.transform, "InventoryPanel", new Color(0.15f, 0.15f, 0.15f, 0.95f));
|
||||||
|
var inventoryRect = inventoryPanel.GetComponent<RectTransform>();
|
||||||
|
SetRect(inventoryRect, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, new Vector2(500, 300));
|
||||||
|
|
||||||
|
// Заголовок
|
||||||
|
CreateTitle(inventoryPanel.transform, "Инвентарь", new Vector2(0, 130));
|
||||||
|
|
||||||
|
// Сетка инвентаря (4x9 = 36 слотов)
|
||||||
|
var inventoryGrid = CreateGrid(inventoryPanel.transform, "InventoryGrid", 9, 4, 50, 4, new Vector2(10, 40));
|
||||||
|
im.slots = CreateSlots(inventoryGrid, "InventorySlot_", 0, 36);
|
||||||
|
|
||||||
|
// Создаём хотбар
|
||||||
|
var hotbarPanel = CreatePanel(canvasGO.transform, "HotbarPanel", new Color(0.1f, 0.1f, 0.1f, 0.9f));
|
||||||
|
var hotbarRect = hotbarPanel.GetComponent<RectTransform>();
|
||||||
|
SetRect(hotbarRect, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0, 15), new Vector2(460, 60));
|
||||||
|
|
||||||
|
var hotbarGrid = CreateGrid(hotbarPanel.transform, "HotbarGrid", 9, 1, 50, 4, new Vector2(10, 10));
|
||||||
|
im.hotbarSlots = CreateSlots(hotbarGrid, "HotbarSlot_", 0, 9);
|
||||||
|
|
||||||
|
// Подключаем ссылку на панель
|
||||||
|
im.inventoryPanel = inventoryPanel;
|
||||||
|
im.inventoryCanvas = canvas;
|
||||||
|
|
||||||
|
// Скрываем панель
|
||||||
|
inventoryPanel.SetActive(false);
|
||||||
|
|
||||||
|
Debug.Log("[Tools] Инвентарь настроен! (36 слотов + 9 хотбар)");
|
||||||
|
}
|
||||||
|
|
||||||
|
static GameObject CreatePanel(Transform parent, string name, Color color)
|
||||||
|
{
|
||||||
|
var panel = new GameObject(name);
|
||||||
|
panel.transform.SetParent(parent, false);
|
||||||
|
panel.AddComponent<RectTransform>();
|
||||||
|
panel.AddComponent<Image>().color = color;
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetRect(RectTransform rect, Vector2 anchorMin, Vector2 anchorMax, Vector2 anchoredPosition, Vector2 sizeDelta)
|
||||||
|
{
|
||||||
|
rect.anchorMin = anchorMin;
|
||||||
|
rect.anchorMax = anchorMax;
|
||||||
|
rect.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
rect.anchoredPosition = anchoredPosition;
|
||||||
|
rect.sizeDelta = sizeDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CreateTitle(Transform parent, string text, Vector2 position)
|
||||||
|
{
|
||||||
|
var titleObj = new GameObject("Title");
|
||||||
|
titleObj.transform.SetParent(parent, false);
|
||||||
|
var rect = titleObj.AddComponent<RectTransform>();
|
||||||
|
rect.anchorMin = new Vector2(0, 1);
|
||||||
|
rect.anchorMax = new Vector2(1, 1);
|
||||||
|
rect.pivot = new Vector2(0.5f, 1);
|
||||||
|
rect.anchoredPosition = position;
|
||||||
|
rect.sizeDelta = new Vector2(-20, 30);
|
||||||
|
|
||||||
|
var tmp = titleObj.AddComponent<TextMeshProUGUI>();
|
||||||
|
tmp.text = text;
|
||||||
|
tmp.fontSize = 18;
|
||||||
|
tmp.alignment = TextAlignmentOptions.Center;
|
||||||
|
tmp.color = Color.white;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Transform CreateGrid(Transform parent, string name, int cols, int rows, float cellSize, float spacing, Vector2 offset)
|
||||||
|
{
|
||||||
|
var gridObj = new GameObject(name);
|
||||||
|
gridObj.transform.SetParent(parent, false);
|
||||||
|
var rect = gridObj.AddComponent<RectTransform>();
|
||||||
|
rect.anchorMin = Vector2.zero;
|
||||||
|
rect.anchorMax = Vector2.one;
|
||||||
|
rect.offsetMin = offset;
|
||||||
|
rect.offsetMax = -offset;
|
||||||
|
|
||||||
|
var grid = gridObj.AddComponent<GridLayoutGroup>();
|
||||||
|
grid.cellSize = new Vector2(cellSize, cellSize);
|
||||||
|
grid.spacing = new Vector2(spacing, spacing);
|
||||||
|
grid.startCorner = GridLayoutGroup.Corner.UpperLeft;
|
||||||
|
grid.startAxis = GridLayoutGroup.Axis.Horizontal;
|
||||||
|
grid.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
|
||||||
|
grid.constraintCount = cols;
|
||||||
|
|
||||||
|
return gridObj.transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Slot[] CreateSlots(Transform parent, string prefix, int startIndex, int count)
|
||||||
|
{
|
||||||
|
var slots = new Slot[count];
|
||||||
|
var slotSize = 50f;
|
||||||
|
var emptyColor = new Color(0.25f, 0.25f, 0.25f, 0.8f);
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
var slotObj = new GameObject(prefix + (startIndex + i));
|
||||||
|
slotObj.transform.SetParent(parent, false);
|
||||||
|
slotObj.AddComponent<RectTransform>().sizeDelta = new Vector2(slotSize, slotSize);
|
||||||
|
|
||||||
|
var bg = slotObj.AddComponent<Image>();
|
||||||
|
bg.color = emptyColor;
|
||||||
|
|
||||||
|
var slot = slotObj.AddComponent<Slot>();
|
||||||
|
slot.slotIndex = startIndex + i;
|
||||||
|
|
||||||
|
// Icon
|
||||||
|
var iconObj = new GameObject("Icon");
|
||||||
|
iconObj.transform.SetParent(slotObj.transform, false);
|
||||||
|
var iconRect = iconObj.AddComponent<RectTransform>();
|
||||||
|
iconRect.anchorMin = Vector2.zero;
|
||||||
|
iconRect.anchorMax = Vector2.one;
|
||||||
|
iconRect.offsetMin = new Vector2(4, 4);
|
||||||
|
iconRect.offsetMax = new Vector2(-4, -4);
|
||||||
|
slot.iconImage = iconObj.AddComponent<Image>();
|
||||||
|
slot.iconImage.preserveAspect = true;
|
||||||
|
slot.iconImage.enabled = false;
|
||||||
|
|
||||||
|
// Amount panel
|
||||||
|
var amountObj = new GameObject("AmountPanel");
|
||||||
|
amountObj.transform.SetParent(slotObj.transform, false);
|
||||||
|
var amountRect = amountObj.AddComponent<RectTransform>();
|
||||||
|
amountRect.anchorMin = Vector2.one;
|
||||||
|
amountRect.anchorMax = Vector2.one;
|
||||||
|
amountRect.pivot = new Vector2(1, 0);
|
||||||
|
amountRect.anchoredPosition = new Vector2(-2, 2);
|
||||||
|
amountRect.sizeDelta = new Vector2(22, 22);
|
||||||
|
slot.amountPanel = amountObj;
|
||||||
|
slot.amountPanel.SetActive(false);
|
||||||
|
|
||||||
|
amountObj.AddComponent<Image>().color = new Color(0, 0, 0, 0.7f);
|
||||||
|
|
||||||
|
var amountTextObj = new GameObject("Text");
|
||||||
|
amountTextObj.transform.SetParent(amountObj.transform, false);
|
||||||
|
amountTextObj.AddComponent<RectTransform>().sizeDelta = new Vector2(20, 20);
|
||||||
|
slot.amountText = amountTextObj.AddComponent<TextMeshProUGUI>();
|
||||||
|
slot.amountText.fontSize = 14;
|
||||||
|
slot.amountText.alignment = TextAlignmentOptions.Right;
|
||||||
|
slot.amountText.color = Color.white;
|
||||||
|
slot.amountText.fontStyle = FontStyles.Bold;
|
||||||
|
|
||||||
|
// Drag & Drop
|
||||||
|
var dragDrop = slotObj.AddComponent<InventoryDragDrop>();
|
||||||
|
dragDrop.slot = slot;
|
||||||
|
dragDrop.slotIndex = slot.slotIndex;
|
||||||
|
|
||||||
|
slots[i] = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
return slots;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventorySceneSetup.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventorySceneSetup.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 70e234cedfb31844792350a7206e4bad
|
||||||
101
Assets/Inventory/Scripts/InventorySetup.cs
Normal file
101
Assets/Inventory/Scripts/InventorySetup.cs
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using UnityEditor;
|
||||||
|
#endif
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Автоматически настраивает всю систему инвентаря на сцене
|
||||||
|
/// Добавить на пустой GameObject "GameManager" в сцене
|
||||||
|
/// </summary>
|
||||||
|
public class InventorySetup : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Настройки")]
|
||||||
|
public bool createUI = true;
|
||||||
|
public bool createManagers = true;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
// Не создаём если уже есть на сцене (после ручной настройки)
|
||||||
|
if (FindObjectOfType<InventoryManager>() != null)
|
||||||
|
{
|
||||||
|
Debug.Log("[InventorySetup] Inventory already exists, skipping creation");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (createManagers)
|
||||||
|
SetupManagers();
|
||||||
|
|
||||||
|
if (createUI)
|
||||||
|
SetupUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetupManagers()
|
||||||
|
{
|
||||||
|
var imGO = new GameObject("InventoryManager");
|
||||||
|
imGO.transform.SetParent(transform);
|
||||||
|
imGO.AddComponent<InventoryManager>();
|
||||||
|
|
||||||
|
var itemsGO = new GameObject("InventoryItems");
|
||||||
|
itemsGO.transform.SetParent(transform);
|
||||||
|
itemsGO.AddComponent<InventoryExampleItems>();
|
||||||
|
|
||||||
|
var testerGO = new GameObject("InventoryTester");
|
||||||
|
testerGO.transform.SetParent(transform);
|
||||||
|
testerGO.AddComponent<InventoryTester>();
|
||||||
|
|
||||||
|
Debug.Log("[InventorySetup] Managers created");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetupUI()
|
||||||
|
{
|
||||||
|
var canvasGO = new GameObject("InventoryCanvas");
|
||||||
|
canvasGO.transform.SetParent(transform);
|
||||||
|
|
||||||
|
var canvas = canvasGO.AddComponent<Canvas>();
|
||||||
|
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||||
|
canvas.sortingOrder = 100;
|
||||||
|
canvasGO.AddComponent<GraphicRaycaster>();
|
||||||
|
|
||||||
|
canvasGO.AddComponent<InventoryUIBuilder>();
|
||||||
|
|
||||||
|
Debug.Log("[InventorySetup] UI created");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
/// <summary>
|
||||||
|
/// Кнопка в инспекторе для быстрой настройки сцены
|
||||||
|
/// </summary>
|
||||||
|
[CustomEditor(typeof(InventorySetup))]
|
||||||
|
public class InventorySetupEditor : Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
if (GUILayout.Button("Настроить сцену для инвентаря"))
|
||||||
|
{
|
||||||
|
var target = (InventorySetup)this.target;
|
||||||
|
|
||||||
|
if (FindObjectOfType<InventoryManager>() == null)
|
||||||
|
{
|
||||||
|
target.createManagers = true;
|
||||||
|
target.createUI = true;
|
||||||
|
Debug.Log("Инвентарь будет настроен при запуске");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("InventoryManager уже существует на сцене!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
|
||||||
|
if (GUILayout.Button("Открыть сцену в Unity"))
|
||||||
|
{
|
||||||
|
EditorApplication.ExecuteMenuItem("Window/General/Scene");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Assets/Inventory/Scripts/InventorySetup.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventorySetup.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9a832ca7ed419e6479e1cc308a222f33
|
||||||
291
Assets/Inventory/Scripts/InventoryUIBuilder.cs
Normal file
291
Assets/Inventory/Scripts/InventoryUIBuilder.cs
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создаёт UI инвентаря программно с использованием TextMeshPro
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryUIBuilder : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Settings")]
|
||||||
|
public int hotbarSlots = 9;
|
||||||
|
public int inventoryRows = 4;
|
||||||
|
public int inventoryCols = 9;
|
||||||
|
|
||||||
|
[Header("Visual Settings")]
|
||||||
|
public float slotSize = 50f;
|
||||||
|
public float slotSpacing = 4f;
|
||||||
|
public float inventoryPadding = 10f;
|
||||||
|
public float hotbarPadding = 10f;
|
||||||
|
|
||||||
|
[Header("Colors")]
|
||||||
|
[SerializeField] private Color inventoryPanelColor = new Color(0.15f, 0.15f, 0.15f, 0.95f);
|
||||||
|
[SerializeField] private Color hotbarPanelColor = new Color(0.1f, 0.1f, 0.1f, 0.9f);
|
||||||
|
[SerializeField] private Color slotEmptyColor = new Color(0.25f, 0.25f, 0.25f, 0.8f);
|
||||||
|
[SerializeField] private Color slotFilledColor = new Color(0.35f, 0.35f, 0.35f, 0.95f);
|
||||||
|
|
||||||
|
[Header("Container References")]
|
||||||
|
public RectTransform inventoryPanelRect;
|
||||||
|
public RectTransform hotbarPanelRect;
|
||||||
|
public Canvas inventoryCanvas;
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
// Проверяем, не запущен ли уже BuildInventoryUI
|
||||||
|
if (InventoryManager.Instance != null &&
|
||||||
|
InventoryManager.Instance.slots != null &&
|
||||||
|
InventoryManager.Instance.slots.Length > 0)
|
||||||
|
{
|
||||||
|
Debug.Log("[InventoryUIBuilder] UI already built, skipping");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildInventoryUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildInventoryUI()
|
||||||
|
{
|
||||||
|
// Создаём или получаем Canvas
|
||||||
|
var canvas = GetComponent<Canvas>();
|
||||||
|
if (canvas == null)
|
||||||
|
{
|
||||||
|
canvas = gameObject.AddComponent<Canvas>();
|
||||||
|
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||||
|
canvas.sortingOrder = 100;
|
||||||
|
gameObject.AddComponent<GraphicRaycaster>();
|
||||||
|
}
|
||||||
|
inventoryCanvas = canvas;
|
||||||
|
|
||||||
|
// Настраиваем EventSystem если нет
|
||||||
|
if (FindObjectOfType<TMPro.TMP_InputField>() != null || FindObjectsOfType<TMPro.TextMeshProUGUI>().Length > 0)
|
||||||
|
{
|
||||||
|
// EventSystem уже есть
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создаём панель инвентаря
|
||||||
|
GameObject inventoryPanel = CreatePanel("InventoryPanel", transform, inventoryPanelColor);
|
||||||
|
inventoryPanelRect = inventoryPanel.GetComponent<RectTransform>();
|
||||||
|
|
||||||
|
float inventoryWidth = inventoryCols * (slotSize + slotSpacing) + inventoryPadding * 2;
|
||||||
|
float inventoryHeight = inventoryRows * (slotSize + slotSpacing) + inventoryPadding * 2 + 40; // +40 для заголовка
|
||||||
|
|
||||||
|
inventoryPanelRect.anchorMin = new Vector2(0.5f, 0.5f);
|
||||||
|
inventoryPanelRect.anchorMax = new Vector2(0.5f, 0.5f);
|
||||||
|
inventoryPanelRect.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
inventoryPanelRect.anchoredPosition = Vector2.zero;
|
||||||
|
inventoryPanelRect.sizeDelta = new Vector2(inventoryWidth, inventoryHeight);
|
||||||
|
|
||||||
|
// Заголовок
|
||||||
|
CreateTitle(inventoryPanel.transform, "Инвентарь", new Vector2(0, inventoryHeight / 2 - 20));
|
||||||
|
|
||||||
|
// Сетка инвентаря (4x9 = 36 слотов)
|
||||||
|
float gridHeight = inventoryRows * (slotSize + slotSpacing);
|
||||||
|
var inventoryGrid = CreateGrid(
|
||||||
|
inventoryPanel.transform,
|
||||||
|
"InventoryGrid",
|
||||||
|
inventoryCols,
|
||||||
|
inventoryRows,
|
||||||
|
slotSize,
|
||||||
|
slotSpacing,
|
||||||
|
new Vector2(inventoryPadding, inventoryPadding + 30)
|
||||||
|
);
|
||||||
|
InventoryManager.Instance.slots = CreateSlots(inventoryGrid, "InventorySlot_", 0, inventoryCols * inventoryRows);
|
||||||
|
|
||||||
|
// Создаём хотбар
|
||||||
|
GameObject hotbarPanel = CreatePanel("HotbarPanel", transform, hotbarPanelColor);
|
||||||
|
hotbarPanelRect = hotbarPanel.GetComponent<RectTransform>();
|
||||||
|
|
||||||
|
float hotbarWidth = hotbarSlots * (slotSize + slotSpacing) + hotbarPadding * 2;
|
||||||
|
|
||||||
|
hotbarPanelRect.anchorMin = new Vector2(0.5f, 0f);
|
||||||
|
hotbarPanelRect.anchorMax = new Vector2(0.5f, 0f);
|
||||||
|
hotbarPanelRect.pivot = new Vector2(0.5f, 0f);
|
||||||
|
hotbarPanelRect.anchoredPosition = new Vector2(0, 15);
|
||||||
|
hotbarPanelRect.sizeDelta = new Vector2(hotbarWidth, slotSize + hotbarPadding * 2);
|
||||||
|
|
||||||
|
var hotbarGrid = CreateGrid(
|
||||||
|
hotbarPanel.transform,
|
||||||
|
"HotbarGrid",
|
||||||
|
hotbarSlots,
|
||||||
|
1,
|
||||||
|
slotSize,
|
||||||
|
slotSpacing,
|
||||||
|
new Vector2(hotbarPadding, hotbarPadding)
|
||||||
|
);
|
||||||
|
InventoryManager.Instance.hotbarSlots = CreateSlots(hotbarGrid, "HotbarSlot_", 0, hotbarSlots);
|
||||||
|
|
||||||
|
// Настраиваем InventoryManager
|
||||||
|
InventoryManager.Instance.inventoryPanel = inventoryPanel;
|
||||||
|
InventoryManager.Instance.inventoryCanvas = inventoryCanvas;
|
||||||
|
|
||||||
|
Debug.Log($"[InventoryUIBuilder] Created {inventoryCols * inventoryRows} inventory slots + {hotbarSlots} hotbar slots");
|
||||||
|
}
|
||||||
|
|
||||||
|
GameObject CreatePanel(string name, Transform parent, Color color)
|
||||||
|
{
|
||||||
|
GameObject panel = new GameObject(name);
|
||||||
|
panel.transform.SetParent(parent, false);
|
||||||
|
|
||||||
|
var rect = panel.AddComponent<RectTransform>();
|
||||||
|
panel.AddComponent<Image>().color = color;
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateTitle(Transform parent, string text, Vector2 position)
|
||||||
|
{
|
||||||
|
GameObject titleObj = new GameObject("Title");
|
||||||
|
titleObj.transform.SetParent(parent, false);
|
||||||
|
|
||||||
|
var rect = titleObj.AddComponent<RectTransform>();
|
||||||
|
rect.anchorMin = new Vector2(0, 1);
|
||||||
|
rect.anchorMax = new Vector2(1, 1);
|
||||||
|
rect.pivot = new Vector2(0.5f, 1);
|
||||||
|
rect.anchoredPosition = position;
|
||||||
|
rect.sizeDelta = new Vector2(-20, 30);
|
||||||
|
|
||||||
|
var tmp = titleObj.AddComponent<TextMeshProUGUI>();
|
||||||
|
tmp.text = text;
|
||||||
|
tmp.fontSize = 18;
|
||||||
|
tmp.alignment = TextAlignmentOptions.Center;
|
||||||
|
tmp.color = Color.white;
|
||||||
|
}
|
||||||
|
|
||||||
|
Transform CreateGrid(Transform parent, string name, int cols, int rows, float cellSize, float spacing, Vector2 offset)
|
||||||
|
{
|
||||||
|
GameObject gridObj = new GameObject(name);
|
||||||
|
gridObj.transform.SetParent(parent, false);
|
||||||
|
|
||||||
|
var rect = gridObj.AddComponent<RectTransform>();
|
||||||
|
rect.anchorMin = Vector2.zero;
|
||||||
|
rect.anchorMax = Vector2.one;
|
||||||
|
rect.offsetMin = offset;
|
||||||
|
rect.offsetMax = -offset;
|
||||||
|
|
||||||
|
var grid = gridObj.AddComponent<GridLayoutGroup>();
|
||||||
|
grid.cellSize = new Vector2(cellSize, cellSize);
|
||||||
|
grid.spacing = new Vector2(spacing, spacing);
|
||||||
|
grid.startCorner = GridLayoutGroup.Corner.UpperLeft;
|
||||||
|
grid.startAxis = GridLayoutGroup.Axis.Horizontal;
|
||||||
|
grid.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
|
||||||
|
grid.constraintCount = cols;
|
||||||
|
grid.padding = new RectOffset(0, 0, 0, 0);
|
||||||
|
|
||||||
|
return gridObj.transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
Slot[] CreateSlots(Transform parent, string prefix, int startIndex, int count)
|
||||||
|
{
|
||||||
|
var slots = new Slot[count];
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
GameObject slotObj = new GameObject(prefix + (startIndex + i));
|
||||||
|
slotObj.transform.SetParent(parent, false);
|
||||||
|
|
||||||
|
var rect = slotObj.AddComponent<RectTransform>();
|
||||||
|
rect.sizeDelta = new Vector2(slotSize, slotSize);
|
||||||
|
|
||||||
|
// Background
|
||||||
|
var bg = slotObj.AddComponent<Image>();
|
||||||
|
bg.color = slotEmptyColor;
|
||||||
|
|
||||||
|
// Slot компонент
|
||||||
|
var slot = slotObj.AddComponent<Slot>();
|
||||||
|
slot.slotIndex = startIndex + i;
|
||||||
|
|
||||||
|
// Icon
|
||||||
|
GameObject iconObj = new GameObject("Icon");
|
||||||
|
iconObj.transform.SetParent(slotObj.transform, false);
|
||||||
|
var iconRect = iconObj.AddComponent<RectTransform>();
|
||||||
|
iconRect.anchorMin = Vector2.zero;
|
||||||
|
iconRect.anchorMax = Vector2.one;
|
||||||
|
iconRect.offsetMin = new Vector2(4, 4);
|
||||||
|
iconRect.offsetMax = new Vector2(-4, -4);
|
||||||
|
slot.iconImage = iconObj.AddComponent<Image>();
|
||||||
|
slot.iconImage.preserveAspect = true;
|
||||||
|
slot.iconImage.enabled = false;
|
||||||
|
|
||||||
|
// Amount panel
|
||||||
|
GameObject amountObj = new GameObject("AmountPanel");
|
||||||
|
amountObj.transform.SetParent(slotObj.transform, false);
|
||||||
|
var amountRect = amountObj.AddComponent<RectTransform>();
|
||||||
|
amountRect.anchorMin = Vector2.one;
|
||||||
|
amountRect.anchorMax = Vector2.one;
|
||||||
|
amountRect.pivot = new Vector2(1, 0);
|
||||||
|
amountRect.anchoredPosition = new Vector2(-2, 2);
|
||||||
|
amountRect.sizeDelta = new Vector2(22, 22);
|
||||||
|
slot.amountPanel = amountObj;
|
||||||
|
|
||||||
|
var amountBg = amountObj.AddComponent<Image>();
|
||||||
|
amountBg.color = new Color(0, 0, 0, 0.7f);
|
||||||
|
|
||||||
|
GameObject amountTextObj = new GameObject("Text");
|
||||||
|
amountTextObj.transform.SetParent(amountObj.transform, false);
|
||||||
|
var amountTextRect = amountTextObj.AddComponent<RectTransform>();
|
||||||
|
amountTextRect.anchorMin = Vector2.zero;
|
||||||
|
amountTextRect.anchorMax = Vector2.one;
|
||||||
|
slot.amountText = amountTextObj.AddComponent<TextMeshProUGUI>();
|
||||||
|
slot.amountText.fontSize = 14;
|
||||||
|
slot.amountText.alignment = TextAlignmentOptions.Right;
|
||||||
|
slot.amountText.color = Color.white;
|
||||||
|
slot.amountText.fontStyle = FontStyles.Bold;
|
||||||
|
|
||||||
|
// Применяем настройки через сеттер
|
||||||
|
slot.amountPanel.SetActive(false);
|
||||||
|
slot.slotBackground = bg;
|
||||||
|
|
||||||
|
// Drag & Drop
|
||||||
|
var dragDrop = slotObj.AddComponent<InventoryDragDrop>();
|
||||||
|
dragDrop.slot = slot;
|
||||||
|
dragDrop.slotIndex = slot.slotIndex;
|
||||||
|
|
||||||
|
// Подписка на события слота
|
||||||
|
slot.OnSlotClicked += OnSlotClicked;
|
||||||
|
|
||||||
|
slots[i] = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
return slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int _selectedSlot = -1;
|
||||||
|
|
||||||
|
private void OnSlotClicked(Slot slot)
|
||||||
|
{
|
||||||
|
// Снимаем выделение с предыдущего
|
||||||
|
if (_selectedSlot >= 0 && _selectedSlot < InventoryManager.Instance.slots.Length)
|
||||||
|
{
|
||||||
|
InventoryManager.Instance.slots[_selectedSlot].SetSelected(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выделяем новый
|
||||||
|
slot.SetSelected(true);
|
||||||
|
_selectedSlot = slot.slotIndex;
|
||||||
|
|
||||||
|
Debug.Log($"[UI] Selected slot: {_selectedSlot} - {slot.GetItem()?.itemName ?? "Empty"}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Пересоздать UI (например, при изменении настроек)
|
||||||
|
/// </summary>
|
||||||
|
public void Rebuild()
|
||||||
|
{
|
||||||
|
// Удаляем старые панели
|
||||||
|
if (inventoryPanelRect != null)
|
||||||
|
Destroy(inventoryPanelRect.gameObject);
|
||||||
|
if (hotbarPanelRect != null)
|
||||||
|
Destroy(hotbarPanelRect.gameObject);
|
||||||
|
|
||||||
|
BuildInventoryUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Показать/скрыть инвентарь
|
||||||
|
/// </summary>
|
||||||
|
public void ToggleInventory(bool show)
|
||||||
|
{
|
||||||
|
if (inventoryPanelRect != null)
|
||||||
|
inventoryPanelRect.gameObject.SetActive(show);
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/InventoryUIBuilder.cs.meta
Normal file
2
Assets/Inventory/Scripts/InventoryUIBuilder.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9296b7da4cf11cf41909512f177d7434
|
||||||
231
Assets/Inventory/Scripts/ItemBuilderTool.cs
Normal file
231
Assets/Inventory/Scripts/ItemBuilderTool.cs
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityEditor;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
public class ItemBuilderTool : EditorWindow
|
||||||
|
{
|
||||||
|
// Основные данные
|
||||||
|
private string itemName = "NewItem";
|
||||||
|
private string itemId = "";
|
||||||
|
private string description = "";
|
||||||
|
private ItemType itemType = ItemType.Material;
|
||||||
|
|
||||||
|
// Визуал
|
||||||
|
private GameObject modelPrefab;
|
||||||
|
private Sprite icon;
|
||||||
|
private Color previewColor = Color.gray;
|
||||||
|
|
||||||
|
// Свойства
|
||||||
|
private int maxStack = 64;
|
||||||
|
private int value = 1;
|
||||||
|
private float weight = 1f;
|
||||||
|
private bool isDroppable = true;
|
||||||
|
private bool isStackable = true;
|
||||||
|
|
||||||
|
// Префаб
|
||||||
|
private GameObject worldItemPrefab;
|
||||||
|
|
||||||
|
[MenuItem("Tools/Item Builder")]
|
||||||
|
public static void ShowWindow()
|
||||||
|
{
|
||||||
|
GetWindow<ItemBuilderTool>("Конструктор Предметов");
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnGUI()
|
||||||
|
{
|
||||||
|
GUILayout.Label("Создание предмета", EditorStyles.boldLabel);
|
||||||
|
|
||||||
|
// Основные данные
|
||||||
|
GUILayout.Label("Основное", EditorStyles.miniBoldLabel);
|
||||||
|
itemName = EditorGUILayout.TextField("Название", itemName);
|
||||||
|
itemId = EditorGUILayout.TextField("ID", itemId);
|
||||||
|
description = EditorGUILayout.TextField("Описание", description);
|
||||||
|
itemType = (ItemType)EditorGUILayout.EnumPopup("Тип предмета", itemType);
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
|
||||||
|
// Визуал
|
||||||
|
GUILayout.Label("Визуал", EditorStyles.miniBoldLabel);
|
||||||
|
modelPrefab = (GameObject)EditorGUILayout.ObjectField("3D модель", modelPrefab, typeof(GameObject), false);
|
||||||
|
icon = (Sprite)EditorGUILayout.ObjectField("Иконка", icon, typeof(Sprite), false);
|
||||||
|
|
||||||
|
if (icon == null)
|
||||||
|
{
|
||||||
|
previewColor = EditorGUILayout.ColorField("Цвет иконки", previewColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
|
||||||
|
// Свойства
|
||||||
|
GUILayout.Label("Свойства", EditorStyles.miniBoldLabel);
|
||||||
|
maxStack = EditorGUILayout.IntField("Макс. стек", maxStack);
|
||||||
|
value = EditorGUILayout.IntField("Цена", value);
|
||||||
|
weight = EditorGUILayout.FloatField("Вес", weight);
|
||||||
|
isDroppable = EditorGUILayout.Toggle("Можно выбросить", isDroppable);
|
||||||
|
isStackable = EditorGUILayout.Toggle("Стек", isStackable);
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
|
||||||
|
// Префаб
|
||||||
|
GUILayout.Label("Префаб предмета в мире", EditorStyles.miniBoldLabel);
|
||||||
|
worldItemPrefab = (GameObject)EditorGUILayout.ObjectField("WorldItem Prefab", worldItemPrefab, typeof(GameObject), false);
|
||||||
|
|
||||||
|
GUILayout.Space(20);
|
||||||
|
|
||||||
|
// Кнопки
|
||||||
|
GUI.color = Color.green;
|
||||||
|
if (GUILayout.Button("Создать ItemData"))
|
||||||
|
{
|
||||||
|
CreateItemData();
|
||||||
|
}
|
||||||
|
|
||||||
|
GUI.color = Color.cyan;
|
||||||
|
if (GUILayout.Button("Создать WorldItem в сцене"))
|
||||||
|
{
|
||||||
|
CreateWorldItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
GUI.color = Color.yellow;
|
||||||
|
if (GUILayout.Button("Создать префаб"))
|
||||||
|
{
|
||||||
|
CreateItemPrefab();
|
||||||
|
}
|
||||||
|
|
||||||
|
GUI.color = Color.white;
|
||||||
|
|
||||||
|
GUILayout.Space(10);
|
||||||
|
EditorGUILayout.HelpBox(
|
||||||
|
"1. Заполните данные предмета\n" +
|
||||||
|
"2. Назначьте модель и иконку\n" +
|
||||||
|
"3. Создайте ItemData или префаб",
|
||||||
|
MessageType.Info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateItemData()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(itemName))
|
||||||
|
{
|
||||||
|
EditorUtility.DisplayDialog("Ошибка", "Введите название предмета", "OK");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = ScriptableObject.CreateInstance<ItemData>();
|
||||||
|
|
||||||
|
item.id = string.IsNullOrEmpty(itemId) ? GUID.Generate().ToString() : itemId;
|
||||||
|
item.itemName = itemName;
|
||||||
|
item.description = description;
|
||||||
|
item.type = itemType;
|
||||||
|
item.modelPrefab = modelPrefab;
|
||||||
|
item.icon = icon != null ? icon : CreatePlaceholderIcon();
|
||||||
|
item.maxStack = maxStack;
|
||||||
|
item.value = value;
|
||||||
|
item.weight = weight;
|
||||||
|
item.isDroppable = isDroppable;
|
||||||
|
item.isStackable = isStackable;
|
||||||
|
|
||||||
|
// Сохраняем
|
||||||
|
string path = $"Assets/Inventory/Items/{itemName}.asset";
|
||||||
|
string folder = System.IO.Path.GetDirectoryName(path);
|
||||||
|
if (!System.IO.Directory.Exists(folder))
|
||||||
|
{
|
||||||
|
System.IO.Directory.CreateDirectory(folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetDatabase.CreateAsset(item, path);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
|
||||||
|
Selection.activeObject = item;
|
||||||
|
Debug.Log($"[ItemBuilder] Создан: {itemName}");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateWorldItem()
|
||||||
|
{
|
||||||
|
if (modelPrefab == null)
|
||||||
|
{
|
||||||
|
// Создаём простой визуал
|
||||||
|
var itemGO = new GameObject(itemName);
|
||||||
|
var visual = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||||
|
visual.name = "Visual";
|
||||||
|
visual.transform.SetParent(itemGO.transform);
|
||||||
|
visual.transform.localPosition = Vector3.zero;
|
||||||
|
visual.transform.localScale = Vector3.one * 0.3f;
|
||||||
|
DestroyImmediate(visual.GetComponent<Collider>());
|
||||||
|
|
||||||
|
var worldItem = itemGO.AddComponent<WorldItem>();
|
||||||
|
var col = itemGO.AddComponent<SphereCollider>();
|
||||||
|
col.radius = 0.5f;
|
||||||
|
col.isTrigger = true;
|
||||||
|
|
||||||
|
itemGO.transform.position = Vector3.zero;
|
||||||
|
Selection.activeGameObject = itemGO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var itemGO = Instantiate(modelPrefab);
|
||||||
|
itemGO.name = itemName;
|
||||||
|
itemGO.AddComponent<WorldItem>();
|
||||||
|
itemGO.transform.position = Vector3.zero;
|
||||||
|
Selection.activeGameObject = itemGO;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log($"[ItemBuilder] Создан WorldItem: {itemName}");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateItemPrefab()
|
||||||
|
{
|
||||||
|
string path = EditorUtility.SaveFilePanelInProject(
|
||||||
|
"Сохранить префаб",
|
||||||
|
itemName,
|
||||||
|
"prefab",
|
||||||
|
"Выберите место");
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(path)) return;
|
||||||
|
|
||||||
|
GameObject prefab;
|
||||||
|
if (modelPrefab != null)
|
||||||
|
{
|
||||||
|
prefab = Instantiate(modelPrefab);
|
||||||
|
prefab.name = itemName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prefab = new GameObject(itemName);
|
||||||
|
var visual = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||||
|
visual.name = "Visual";
|
||||||
|
visual.transform.SetParent(prefab.transform);
|
||||||
|
visual.transform.localPosition = Vector3.zero;
|
||||||
|
visual.transform.localScale = Vector3.one * 0.3f;
|
||||||
|
DestroyImmediate(visual.GetComponent<Collider>());
|
||||||
|
}
|
||||||
|
|
||||||
|
prefab.AddComponent<WorldItem>();
|
||||||
|
|
||||||
|
var col = prefab.GetComponent<Collider>();
|
||||||
|
if (col == null)
|
||||||
|
{
|
||||||
|
var sphere = prefab.AddComponent<SphereCollider>();
|
||||||
|
sphere.radius = 0.5f;
|
||||||
|
sphere.isTrigger = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameObject savedPrefab = PrefabUtility.SaveAsPrefabAsset(prefab, path);
|
||||||
|
DestroyImmediate(prefab);
|
||||||
|
|
||||||
|
Selection.activeObject = savedPrefab;
|
||||||
|
Debug.Log($"[ItemBuilder] Префаб сохранён: {path}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Sprite CreatePlaceholderIcon()
|
||||||
|
{
|
||||||
|
var tex = new Texture2D(64, 64);
|
||||||
|
var colors = new Color[64 * 64];
|
||||||
|
for (int i = 0; i < colors.Length; i++)
|
||||||
|
{
|
||||||
|
colors[i] = previewColor;
|
||||||
|
}
|
||||||
|
tex.SetPixels(colors);
|
||||||
|
tex.Apply();
|
||||||
|
return Sprite.Create(tex, new Rect(0, 0, 64, 64), new Vector2(0.5f, 0.5f));
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/ItemBuilderTool.cs.meta
Normal file
2
Assets/Inventory/Scripts/ItemBuilderTool.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5b29b6b4c7cab91429e66ed5012b12d7
|
||||||
53
Assets/Inventory/Scripts/ItemData.cs
Normal file
53
Assets/Inventory/Scripts/ItemData.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public enum ItemType
|
||||||
|
{
|
||||||
|
Block,
|
||||||
|
Weapon,
|
||||||
|
Armor,
|
||||||
|
Consumable,
|
||||||
|
Tool,
|
||||||
|
Material
|
||||||
|
}
|
||||||
|
|
||||||
|
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
|
||||||
|
public class ItemData : ScriptableObject
|
||||||
|
{
|
||||||
|
public string id;
|
||||||
|
public string itemName;
|
||||||
|
public string description;
|
||||||
|
public ItemType type;
|
||||||
|
public GameObject modelPrefab;
|
||||||
|
public Sprite icon;
|
||||||
|
public int maxStack = 64;
|
||||||
|
public bool isCraftable;
|
||||||
|
public CraftingRecipe craftingRecipe;
|
||||||
|
|
||||||
|
[Header("Item Properties")]
|
||||||
|
public float weight = 1f;
|
||||||
|
public int value = 1;
|
||||||
|
public bool isDroppable = true;
|
||||||
|
public bool isStackable = true;
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
public class CraftingRecipe
|
||||||
|
{
|
||||||
|
public string[] ingredients;
|
||||||
|
public int[] amounts;
|
||||||
|
public string resultId;
|
||||||
|
public int resultAmount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnEnable()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(id))
|
||||||
|
{
|
||||||
|
id = System.Guid.NewGuid().ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemData FromJson(string json) => JsonUtility.FromJson<ItemData>(json);
|
||||||
|
public string ToJson() => JsonUtility.ToJson(this, true);
|
||||||
|
|
||||||
|
public bool CanStackWith(ItemData other) => other != null && id == other.id && isStackable;
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/ItemData.cs.meta
Normal file
2
Assets/Inventory/Scripts/ItemData.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5741b63764436354ebad192c9b71f06c
|
||||||
262
Assets/Inventory/Scripts/ItemGenerator.cs
Normal file
262
Assets/Inventory/Scripts/ItemGenerator.cs
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
using UnityEditor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public class ItemGenerator : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Item Template")]
|
||||||
|
public string itemId = "";
|
||||||
|
public string itemName = "";
|
||||||
|
public string description = "";
|
||||||
|
public ItemType itemType = ItemType.Material;
|
||||||
|
public Sprite icon;
|
||||||
|
public GameObject modelPrefab;
|
||||||
|
public int maxStack = 64;
|
||||||
|
public bool isCraftable;
|
||||||
|
|
||||||
|
[Header("Crafting (if craftable)")]
|
||||||
|
public string[] craftIngredients;
|
||||||
|
public int[] craftAmounts;
|
||||||
|
public string craftResultId;
|
||||||
|
public int craftResultAmount = 1;
|
||||||
|
|
||||||
|
public ItemData GenerateItemData()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(itemId))
|
||||||
|
{
|
||||||
|
itemId = System.Guid.NewGuid().ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
var itemData = ScriptableObject.CreateInstance<ItemData>();
|
||||||
|
itemData.id = itemId;
|
||||||
|
itemData.itemName = itemName;
|
||||||
|
itemData.description = description;
|
||||||
|
itemData.type = itemType;
|
||||||
|
itemData.modelPrefab = modelPrefab;
|
||||||
|
itemData.icon = icon;
|
||||||
|
itemData.maxStack = maxStack;
|
||||||
|
itemData.isCraftable = isCraftable;
|
||||||
|
|
||||||
|
if (isCraftable && craftIngredients != null && craftIngredients.Length > 0)
|
||||||
|
{
|
||||||
|
itemData.craftingRecipe = new ItemData.CraftingRecipe
|
||||||
|
{
|
||||||
|
ingredients = craftIngredients,
|
||||||
|
amounts = craftAmounts,
|
||||||
|
resultId = craftResultId,
|
||||||
|
resultAmount = craftResultAmount
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ItemData> GenerateAll(List<ItemGenerator> generators)
|
||||||
|
{
|
||||||
|
var items = new List<ItemData>();
|
||||||
|
foreach (var generator in generators)
|
||||||
|
{
|
||||||
|
if (generator != null)
|
||||||
|
{
|
||||||
|
items.Add(generator.GenerateItemData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Предмет в мире - подбирается игроком
|
||||||
|
/// </summary>
|
||||||
|
public class WorldItem : MonoBehaviour
|
||||||
|
{
|
||||||
|
public ItemData itemData;
|
||||||
|
public int amount = 1;
|
||||||
|
|
||||||
|
[Header("Settings")]
|
||||||
|
public float pickupDelay = 0f;
|
||||||
|
public bool useFactory = true;
|
||||||
|
|
||||||
|
private bool _canPickup;
|
||||||
|
|
||||||
|
public void Setup(ItemData data, int count)
|
||||||
|
{
|
||||||
|
itemData = data;
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
if (data.modelPrefab != null)
|
||||||
|
{
|
||||||
|
var model = Instantiate(data.modelPrefab, transform);
|
||||||
|
model.transform.localPosition = Vector3.zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Задержка перед подбором
|
||||||
|
if (pickupDelay > 0)
|
||||||
|
Invoke(nameof(EnablePickup), pickupDelay);
|
||||||
|
else
|
||||||
|
_canPickup = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnablePickup() => _canPickup = true;
|
||||||
|
|
||||||
|
void OnTriggerEnter(Collider other)
|
||||||
|
{
|
||||||
|
TryPickup(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnControllerColliderHit(ControllerColliderHit hit)
|
||||||
|
{
|
||||||
|
TryPickup(hit.controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Подобрать предмет вручную (по кнопке)
|
||||||
|
/// </summary>
|
||||||
|
public bool TryPickupByButton()
|
||||||
|
{
|
||||||
|
Debug.Log($"[TryPickup] _canPickup={_canPickup}, itemData={itemData?.itemName}, amount={amount}, Instance={InventoryManager.Instance != null}");
|
||||||
|
|
||||||
|
if (!_canPickup)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[TryPickup] Cannot pickup - not ready yet");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (itemData == null)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[TryPickup] itemData is null!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (InventoryManager.Instance == null)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[TryPickup] InventoryManager.Instance is null!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int remaining = InventoryManager.Instance.AddItem(itemData, amount);
|
||||||
|
Debug.Log($"[TryPickup] AddItem returned remaining={remaining}");
|
||||||
|
|
||||||
|
if (remaining <= 0)
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
amount = remaining;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TryPickup(Collider other)
|
||||||
|
{
|
||||||
|
if (!_canPickup) return;
|
||||||
|
if (other == null) return;
|
||||||
|
if (!other.CompareTag("Player")) return;
|
||||||
|
|
||||||
|
if (useFactory && InventoryItemFactory.Instance != null)
|
||||||
|
{
|
||||||
|
InventoryItemFactory.Instance.PickupItem(this, this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback - старый способ
|
||||||
|
int remaining = InventoryManager.Instance.AddItem(itemData, amount);
|
||||||
|
if (remaining <= 0)
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
amount = remaining;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Выбросить предмет с силой
|
||||||
|
/// </summary>
|
||||||
|
public void Throw(Vector3 velocity)
|
||||||
|
{
|
||||||
|
var rb = GetComponent<Rigidbody>();
|
||||||
|
if (rb == null) rb = gameObject.AddComponent<Rigidbody>();
|
||||||
|
rb.linearVelocity = velocity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Точка спавна предмета
|
||||||
|
/// </summary>
|
||||||
|
public class ItemSpawner : MonoBehaviour
|
||||||
|
{
|
||||||
|
public ItemData item;
|
||||||
|
public int amount = 1;
|
||||||
|
public float despawnTime = 300f;
|
||||||
|
public bool spawnOnStart = false;
|
||||||
|
public bool useFactory = true;
|
||||||
|
|
||||||
|
public void Setup(ItemData itemData, int itemAmount, float despawn)
|
||||||
|
{
|
||||||
|
item = itemData;
|
||||||
|
amount = itemAmount;
|
||||||
|
despawnTime = despawn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
if (spawnOnStart) Spawn();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Spawn()
|
||||||
|
{
|
||||||
|
if (useFactory && InventoryItemFactory.Instance != null)
|
||||||
|
{
|
||||||
|
var worldItem = InventoryItemFactory.Instance.CreateWorldItem(item, amount, transform.position);
|
||||||
|
if (worldItem != null && despawnTime > 0)
|
||||||
|
{
|
||||||
|
Destroy(worldItem.gameObject, despawnTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback - старый способ
|
||||||
|
var prefab = Resources.Load<GameObject>("Prefabs/WorldItem");
|
||||||
|
if (prefab != null)
|
||||||
|
{
|
||||||
|
var worldItem = Instantiate(prefab, transform.position, Quaternion.identity).GetComponent<WorldItem>();
|
||||||
|
worldItem.Setup(item, amount);
|
||||||
|
Destroy(worldItem.gameObject, despawnTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Despawn()
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
[CustomEditor(typeof(ItemGenerator))]
|
||||||
|
public class ItemGeneratorEditor : Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
if (GUILayout.Button("Generate ItemData"))
|
||||||
|
{
|
||||||
|
var generator = (ItemGenerator)target;
|
||||||
|
var itemData = generator.GenerateItemData();
|
||||||
|
|
||||||
|
string path = $"Assets/Inventory/Items/{itemData.itemName}.asset";
|
||||||
|
AssetDatabase.CreateAsset(itemData, path);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
|
||||||
|
Debug.Log($"Created item: {itemData.itemName} at {path}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Assets/Inventory/Scripts/ItemGenerator.cs.meta
Normal file
2
Assets/Inventory/Scripts/ItemGenerator.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 912124eba177b3d4c8f4890d9b408b13
|
||||||
286
Assets/Inventory/Scripts/Slot.cs
Normal file
286
Assets/Inventory/Scripts/Slot.cs
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Слот инвентаря - отображает предмет и его количество
|
||||||
|
/// </summary>
|
||||||
|
public class Slot : MonoBehaviour
|
||||||
|
{
|
||||||
|
public int slotIndex;
|
||||||
|
public ItemData item;
|
||||||
|
public int amount;
|
||||||
|
|
||||||
|
[Header("UI References")]
|
||||||
|
public Image iconImage;
|
||||||
|
public TextMeshProUGUI amountText;
|
||||||
|
public GameObject amountPanel;
|
||||||
|
public Image slotBackground;
|
||||||
|
|
||||||
|
[Header("Visual Settings")]
|
||||||
|
[SerializeField] private Color emptySlotColor = new Color(0.2f, 0.2f, 0.2f, 0.5f);
|
||||||
|
[SerializeField] private Color filledSlotColor = new Color(0.3f, 0.3f, 0.3f, 0.9f);
|
||||||
|
[SerializeField] private Color hoverColor = new Color(0.5f, 0.5f, 0.5f, 1f);
|
||||||
|
[SerializeField] private Color selectedColor = new Color(0.4f, 0.6f, 0.9f, 1f);
|
||||||
|
|
||||||
|
[Header("Drag & Drop")]
|
||||||
|
[SerializeField] private bool allowDrag = true;
|
||||||
|
|
||||||
|
public bool IsEmpty => item == null || amount <= 0;
|
||||||
|
public bool HasItem => !IsEmpty;
|
||||||
|
|
||||||
|
// События для внешних подписчиков
|
||||||
|
public System.Action<Slot> OnSlotClicked;
|
||||||
|
public System.Action<Slot> OnSlotRightClicked;
|
||||||
|
public System.Action<Slot> OnSlotHovered;
|
||||||
|
public System.Action<Slot> OnSlotDragStart;
|
||||||
|
|
||||||
|
private bool _isSelected;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
// Автоматическое получение компонентов если не назначены
|
||||||
|
if (iconImage == null)
|
||||||
|
iconImage = transform.Find("Icon")?.GetComponent<Image>();
|
||||||
|
|
||||||
|
if (amountText == null)
|
||||||
|
amountText = transform.Find("AmountPanel/Text")?.GetComponent<TextMeshProUGUI>();
|
||||||
|
|
||||||
|
if (amountPanel == null)
|
||||||
|
amountPanel = transform.Find("AmountPanel")?.gameObject;
|
||||||
|
|
||||||
|
if (slotBackground == null)
|
||||||
|
slotBackground = GetComponent<Image>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
UpdateSlotUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновить визуальное отображение слота
|
||||||
|
/// </summary>
|
||||||
|
public void UpdateSlotUI()
|
||||||
|
{
|
||||||
|
if (IsEmpty)
|
||||||
|
{
|
||||||
|
ClearVisuals();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Иконка
|
||||||
|
if (item.icon != null)
|
||||||
|
{
|
||||||
|
iconImage.sprite = item.icon;
|
||||||
|
iconImage.enabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iconImage.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Количество
|
||||||
|
if (amount > 1)
|
||||||
|
{
|
||||||
|
amountText.text = amount.ToString();
|
||||||
|
amountPanel.SetActive(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
amountPanel.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Цвет фона
|
||||||
|
if (slotBackground != null)
|
||||||
|
slotBackground.color = filledSlotColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearVisuals()
|
||||||
|
{
|
||||||
|
iconImage.sprite = null;
|
||||||
|
iconImage.enabled = false;
|
||||||
|
amountPanel?.SetActive(false);
|
||||||
|
|
||||||
|
if (slotBackground != null)
|
||||||
|
slotBackground.color = emptySlotColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очистить слот
|
||||||
|
/// </summary>
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
item = null;
|
||||||
|
amount = 0;
|
||||||
|
UpdateSlotUI();
|
||||||
|
|
||||||
|
// Уведомляем менеджер
|
||||||
|
if (InventoryManager.Instance != null)
|
||||||
|
{
|
||||||
|
InventoryManager.Instance.OnSlotCleared(slotIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вызываем событие
|
||||||
|
InventoryEvents.Instance?.InvokeSlotChanged(slotIndex, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Установить предмет в слот
|
||||||
|
/// </summary>
|
||||||
|
public void SetItem(ItemData newItem, int newAmount)
|
||||||
|
{
|
||||||
|
item = newItem;
|
||||||
|
amount = newAmount;
|
||||||
|
UpdateSlotUI();
|
||||||
|
|
||||||
|
// Вызываем событие изменения
|
||||||
|
InventoryEvents.Instance?.InvokeSlotChanged(slotIndex, item?.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить предметы в слот
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Количество не поместившихся предметов</returns>
|
||||||
|
public int AddItems(ItemData newItem, int addAmount)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
// Пустой слот - просто кладём
|
||||||
|
item = newItem;
|
||||||
|
amount = Mathf.Min(addAmount, newItem.maxStack);
|
||||||
|
UpdateSlotUI();
|
||||||
|
|
||||||
|
// Событие добавления
|
||||||
|
InventoryEvents.Instance?.InvokeItemAdded(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeSlotChanged(slotIndex, item.id);
|
||||||
|
|
||||||
|
return addAmount - amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.id != newItem.id)
|
||||||
|
{
|
||||||
|
// Другой предмет - нельзя добавить
|
||||||
|
return addAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Тот же предмет - пытаемся добавить в стек
|
||||||
|
int space = item.maxStack - amount;
|
||||||
|
if (space <= 0) return addAmount;
|
||||||
|
|
||||||
|
int toAdd = Mathf.Min(space, addAmount);
|
||||||
|
amount += toAdd;
|
||||||
|
UpdateSlotUI();
|
||||||
|
|
||||||
|
// Событие изменения
|
||||||
|
InventoryEvents.Instance?.InvokeItemCountChanged(item.id, amount);
|
||||||
|
InventoryEvents.Instance?.InvokeSlotChanged(slotIndex, item.id);
|
||||||
|
|
||||||
|
return addAmount - toAdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Взять часть предметов из слота
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>(предмет, взятое количество)</returns>
|
||||||
|
public (ItemData, int) TakeItems(int takeAmount)
|
||||||
|
{
|
||||||
|
if (IsEmpty) return (null, 0);
|
||||||
|
|
||||||
|
int actualTake = Mathf.Min(takeAmount, amount);
|
||||||
|
amount -= actualTake;
|
||||||
|
|
||||||
|
ItemData resultItem = item;
|
||||||
|
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateSlotUI();
|
||||||
|
// Событие изменения количества
|
||||||
|
InventoryEvents.Instance?.InvokeItemCountChanged(item.id, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Событие удаления
|
||||||
|
InventoryEvents.Instance?.InvokeItemRemoved(resultItem.id, actualTake);
|
||||||
|
|
||||||
|
return (resultItem, actualTake);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Взять все предметы из слота
|
||||||
|
/// </summary>
|
||||||
|
public (ItemData, int) TakeAll()
|
||||||
|
{
|
||||||
|
return TakeItems(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== UI Events ====================
|
||||||
|
|
||||||
|
void OnMouseEnter()
|
||||||
|
{
|
||||||
|
if (slotBackground != null && !_isSelected)
|
||||||
|
slotBackground.color = hoverColor;
|
||||||
|
|
||||||
|
OnSlotHovered?.Invoke(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnMouseExit()
|
||||||
|
{
|
||||||
|
if (slotBackground != null && !_isSelected)
|
||||||
|
slotBackground.color = IsEmpty ? emptySlotColor : filledSlotColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnMouseDown()
|
||||||
|
{
|
||||||
|
if (Input.GetMouseButton(0))
|
||||||
|
{
|
||||||
|
OnSlotClicked?.Invoke(this);
|
||||||
|
|
||||||
|
if (allowDrag)
|
||||||
|
{
|
||||||
|
OnSlotDragStart?.Invoke(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Input.GetMouseButton(1))
|
||||||
|
{
|
||||||
|
OnSlotRightClicked?.Invoke(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Установить состояние выделения слота
|
||||||
|
/// </summary>
|
||||||
|
public void SetSelected(bool selected)
|
||||||
|
{
|
||||||
|
_isSelected = selected;
|
||||||
|
if (slotBackground != null)
|
||||||
|
{
|
||||||
|
slotBackground.color = selected ? selectedColor :
|
||||||
|
(IsEmpty ? emptySlotColor : filledSlotColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поменять содержимое с другим слотом
|
||||||
|
/// </summary>
|
||||||
|
public void SwapWith(Slot other)
|
||||||
|
{
|
||||||
|
if (other == null || other == this) return;
|
||||||
|
|
||||||
|
var tempItem = this.item;
|
||||||
|
var tempAmount = this.amount;
|
||||||
|
|
||||||
|
this.SetItem(other.item, other.amount);
|
||||||
|
other.SetItem(tempItem, tempAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== Getters ====================
|
||||||
|
|
||||||
|
public ItemData GetItem() => item;
|
||||||
|
public int GetAmount() => amount;
|
||||||
|
public string GetItemId() => item?.id;
|
||||||
|
public bool IsSelected() => _isSelected;
|
||||||
|
}
|
||||||
2
Assets/Inventory/Scripts/Slot.cs.meta
Normal file
2
Assets/Inventory/Scripts/Slot.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 700406249e03c6646b1d535e57851f30
|
||||||
8
Assets/Inventory/UI.meta
Normal file
8
Assets/Inventory/UI.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d550759647d40c24db6d25005afeac67
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/Items.meta
Normal file
8
Assets/Items.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aa34ca36a91fe1242816d2f68f8d9f0a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
8
Assets/TextMesh Pro.meta
Normal file
8
Assets/TextMesh Pro.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f54d1bd14bd3ca042bd867b519fee8cc
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/TextMesh Pro/Examples & Extras.meta
Normal file
8
Assets/TextMesh Pro/Examples & Extras.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ce51c8e33b734b4db6086586558c53a3
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/TextMesh Pro/Examples & Extras/Fonts.meta
Normal file
8
Assets/TextMesh Pro/Examples & Extras/Fonts.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b63e0053080646b9819789bf3bf9fa17
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
93
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton OFL.txt
Normal file
93
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
Copyright (c) 2011, Vernon Adams (vern@newtypography.co.uk),
|
||||||
|
with Reserved Font Name Anton.
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 73a79399807f4e8388c2cbb5494681ca
|
||||||
|
timeCreated: 1484172033
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton.ttf
Normal file
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton.ttf
Normal file
Binary file not shown.
19
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton.ttf.meta
Normal file
19
Assets/TextMesh Pro/Examples & Extras/Fonts/Anton.ttf.meta
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 997a43b767814dd0a7642ec9b78cba41
|
||||||
|
timeCreated: 1484172033
|
||||||
|
licenseType: Pro
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 1
|
||||||
|
characterPadding: 0
|
||||||
|
includeFontData: 1
|
||||||
|
use2xBehaviour: 0
|
||||||
|
fontNames: []
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
Copyright (c) 2010 by vernon adams (vern@newtypography.co.uk),
|
||||||
|
with Reserved Font Name Bangers.
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: efe0bf4ac872451e91612d1ae593f480
|
||||||
|
timeCreated: 1484171296
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Bangers.ttf
Normal file
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Bangers.ttf
Normal file
Binary file not shown.
19
Assets/TextMesh Pro/Examples & Extras/Fonts/Bangers.ttf.meta
Normal file
19
Assets/TextMesh Pro/Examples & Extras/Fonts/Bangers.ttf.meta
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5dd49b3eacc540408c98eee0de38e0f1
|
||||||
|
timeCreated: 1484171297
|
||||||
|
licenseType: Pro
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 1
|
||||||
|
characterPadding: 0
|
||||||
|
includeFontData: 1
|
||||||
|
use2xBehaviour: 0
|
||||||
|
fontNames: []
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a2b9e2a607dd2143b58c44bc32410b4
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 4
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 0
|
||||||
|
characterPadding: 1
|
||||||
|
includeFontData: 1
|
||||||
|
fontName: Electronic Highway Sign
|
||||||
|
fontNames:
|
||||||
|
- Electronic Highway Sign
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
ascentCalculationMode: 1
|
||||||
|
useLegacyBoundsCalculation: 0
|
||||||
|
shouldRoundAdvanceValue: 1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
Copyright (c) 2011-2012, Vernon Adams (vern@newtypography.co.uk), with Reserved Font Names 'Oswald'
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d2cf87a8a7a94aa8b80dff1c807c1178
|
||||||
|
timeCreated: 1484171296
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Oswald-Bold.ttf
Normal file
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Oswald-Bold.ttf
Normal file
Binary file not shown.
@@ -0,0 +1,19 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c9f6d0e7bc8541498c9a4799ba184ede
|
||||||
|
timeCreated: 1484171297
|
||||||
|
licenseType: Pro
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 1
|
||||||
|
characterPadding: 0
|
||||||
|
includeFontData: 1
|
||||||
|
use2xBehaviour: 0
|
||||||
|
fontNames: []
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f28c334d44214474d9702d3ad79ecb0a
|
||||||
|
timeCreated: 1484171296
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
This font is licensed under the Apache License, Version 2.0.
|
||||||
|
|
||||||
|
See the following link for full licensing terms https://www.apache.org/licenses/LICENSE-2.0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f0303f887b8fa7243a51432c478ff2f3
|
||||||
|
timeCreated: 1484171296
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Roboto-Bold.ttf
Normal file
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Roboto-Bold.ttf
Normal file
Binary file not shown.
@@ -0,0 +1,22 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4beb055f07aaff244873dec698d0363e
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 4
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 0
|
||||||
|
characterPadding: 1
|
||||||
|
includeFontData: 1
|
||||||
|
fontName: Roboto
|
||||||
|
fontNames:
|
||||||
|
- Roboto
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
ascentCalculationMode: 1
|
||||||
|
useLegacyBoundsCalculation: 0
|
||||||
|
shouldRoundAdvanceValue: 1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
92
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity - OFL.txt
Normal file
92
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity - OFL.txt
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
Copyright (c) 2020-2021, Unity, with Reserved Font Names 'Unity'
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0251f66ebc602a944b35bccd13be2738
|
||||||
|
timeCreated: 1484171296
|
||||||
|
licenseType: Pro
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity.ttf
Normal file
BIN
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity.ttf
Normal file
Binary file not shown.
21
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity.ttf.meta
Normal file
21
Assets/TextMesh Pro/Examples & Extras/Fonts/Unity.ttf.meta
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f4eec857a4fdf2f43be0e9f3d1a984e7
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 4
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 0
|
||||||
|
characterPadding: 1
|
||||||
|
includeFontData: 1
|
||||||
|
fontNames:
|
||||||
|
- Unity
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
ascentCalculationMode: 1
|
||||||
|
useLegacyBoundsCalculation: 0
|
||||||
|
shouldRoundAdvanceValue: 1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
9
Assets/TextMesh Pro/Examples & Extras/Materials.meta
Normal file
9
Assets/TextMesh Pro/Examples & Extras/Materials.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5808953df7a24274a851aa6dee52d30e
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1436068007
|
||||||
|
licenseType: Pro
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 6
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: Crate - Surface Shader Scene
|
||||||
|
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_ShaderKeywords: _EMISSION _NORMALMAP _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses: []
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BumpMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 8878a782f4334ecbbcf683b3ac780966, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailAlbedoMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMask:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailNormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EmissionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MainTex:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MetallicGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _OcclusionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _ParallaxMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Floats:
|
||||||
|
- _BumpScale: 0.5
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _EmissionScaleUI: 0
|
||||||
|
- _GlossMapScale: 1
|
||||||
|
- _Glossiness: 0.233
|
||||||
|
- _GlossyReflections: 1
|
||||||
|
- _Metallic: 0
|
||||||
|
- _Mode: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.02
|
||||||
|
- _SmoothnessTextureChannel: 1
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _UVSec: 0
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _Color: {r: 1, g: 1, b: 1, a: 0.712}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
- _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e6b9b44320f4448d9d5e0ee634259966
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
138
Assets/TextMesh Pro/Examples & Extras/Materials/Crate - URP.mat
Normal file
138
Assets/TextMesh Pro/Examples & Extras/Materials/Crate - URP.mat
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: Crate - URP
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _EMISSION
|
||||||
|
- _NORMALMAP
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _BumpMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 8878a782f4334ecbbcf683b3ac780966, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailAlbedoMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMask:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailNormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EmissionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MainTex:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MetallicGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _OcclusionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _ParallaxMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _BumpScale: 0.5
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 1
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 1, g: 1, b: 1, a: 0.7137255}
|
||||||
|
- _Color: {r: 1, g: 1, b: 1, a: 0.7137255}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
--- !u!114 &7626160506639672020
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
version: 9
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3b5cc91c3bf8cf74391252247f52fb59
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 6
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_Name: Ground - Logo Scene
|
||||||
|
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_ShaderKeywords: _NORMALMAP
|
||||||
|
m_LightmapFlags: 5
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_TexEnvs:
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _MainTex
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 1cdc5b506b1a4a33a53c30669ced1f51, type: 3}
|
||||||
|
m_Scale: {x: 20, y: 20}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _BumpMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 8b8c8a10edf94ddc8cc4cc4fcd5696a9, type: 3}
|
||||||
|
m_Scale: {x: 30, y: 50}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DetailNormalMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _ParallaxMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _OcclusionMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EmissionMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DetailMask
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DetailAlbedoMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _MetallicGlossMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _BorderTex
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _FillTex
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EdgeTex
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Floats:
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _SrcBlend
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DstBlend
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Radius
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Cutoff
|
||||||
|
second: .5
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Shininess
|
||||||
|
second: .220354751
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Parallax
|
||||||
|
second: .0199999996
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _ZWrite
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Glossiness
|
||||||
|
second: .344000012
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _BumpScale
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _OcclusionStrength
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DetailNormalMapScale
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _UVSec
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Mode
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Metallic
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EmissionScaleUI
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EdgeSoftness
|
||||||
|
second: 0
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _DiffusePower
|
||||||
|
second: 1
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Border
|
||||||
|
second: .0214285739
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Size
|
||||||
|
second: .100000001
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EdgeWidth
|
||||||
|
second: 0
|
||||||
|
m_Colors:
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EmissionColor
|
||||||
|
second: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _Color
|
||||||
|
second: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _SpecColor
|
||||||
|
second: {r: .5, g: .5, b: .5, a: 1}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _EmissionColorUI
|
||||||
|
second: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _FaceColor
|
||||||
|
second: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
data:
|
||||||
|
first:
|
||||||
|
name: _BorderColor
|
||||||
|
second: {r: 0, g: 0, b: 0, a: 1}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c719e38f25a9480abd2480ab621a2949
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 6
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: Ground - Surface Shader Scene
|
||||||
|
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_ShaderKeywords: _EMISSION
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses: []
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BorderTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _BumpMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: c45cd05946364f32aba704f0853a975b, type: 3}
|
||||||
|
m_Scale: {x: 10, y: 10}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailAlbedoMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMask:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailNormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EdgeTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EmissionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _FillTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MainTex:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 85ac55597b97403c82fc6601a93cf241, type: 3}
|
||||||
|
m_Scale: {x: 5, y: 5}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MetallicGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _OcclusionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _ParallaxMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Floats:
|
||||||
|
- _Border: 0.021428574
|
||||||
|
- _BumpScale: 0.25
|
||||||
|
- _ColorMask: 15
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DiffusePower: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _EdgeSoftness: 0
|
||||||
|
- _EdgeWidth: 0
|
||||||
|
- _EmissionScaleUI: 0
|
||||||
|
- _GlossMapScale: 1
|
||||||
|
- _Glossiness: 0.348
|
||||||
|
- _GlossyReflections: 1
|
||||||
|
- _Metallic: 0
|
||||||
|
- _Mode: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.02
|
||||||
|
- _Radius: 0
|
||||||
|
- _Shininess: 0.24302611
|
||||||
|
- _Size: 0.1
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _Stencil: 0
|
||||||
|
- _StencilComp: 8
|
||||||
|
- _StencilOp: 0
|
||||||
|
- _StencilReadMask: 255
|
||||||
|
- _StencilWriteMask: 255
|
||||||
|
- _Strength: 0.2
|
||||||
|
- _UVSec: 0
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BorderColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _Color: {r: 1, g: 1, b: 1, a: 0.8784314}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
- _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _SpecColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aadd5a709a48466c887296bb5b1b8110
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
173
Assets/TextMesh Pro/Examples & Extras/Materials/Ground - URP.mat
Normal file
173
Assets/TextMesh Pro/Examples & Extras/Materials/Ground - URP.mat
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: Ground - URP
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _EMISSION
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 85ac55597b97403c82fc6601a93cf241, type: 3}
|
||||||
|
m_Scale: {x: 5, y: 5}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _BorderTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _BumpMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: c45cd05946364f32aba704f0853a975b, type: 3}
|
||||||
|
m_Scale: {x: 10, y: 10}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailAlbedoMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMask:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailNormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EdgeTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _EmissionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _FillTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MainTex:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 85ac55597b97403c82fc6601a93cf241, type: 3}
|
||||||
|
m_Scale: {x: 5, y: 5}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MetallicGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _OcclusionMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _ParallaxMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _Border: 0.021428574
|
||||||
|
- _BumpScale: 0.25
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _ColorMask: 15
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DiffusePower: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EdgeSoftness: 0
|
||||||
|
- _EdgeWidth: 0
|
||||||
|
- _EmissionScaleUI: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 1
|
||||||
|
- _Glossiness: 0.348
|
||||||
|
- _GlossyReflections: 1
|
||||||
|
- _Metallic: 0
|
||||||
|
- _Mode: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.02
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _Radius: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Shininess: 0.24302611
|
||||||
|
- _Size: 0.1
|
||||||
|
- _Smoothness: 0.348
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Stencil: 0
|
||||||
|
- _StencilComp: 8
|
||||||
|
- _StencilOp: 0
|
||||||
|
- _StencilReadMask: 255
|
||||||
|
- _StencilWriteMask: 255
|
||||||
|
- _Strength: 0.2
|
||||||
|
- _Surface: 0
|
||||||
|
- _UVSec: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _BorderColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
- _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _SpecColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
--- !u!114 &8510939975645199906
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
version: 9
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 71529b88994c1a341b22bc57c038674a
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 6
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_Name: Small Crate_diffuse
|
||||||
|
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_ShaderKeywords: _EMISSION _NORMALMAP
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_TexEnvs:
|
||||||
|
- first:
|
||||||
|
name: _BumpMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 8878a782f4334ecbbcf683b3ac780966, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _DetailAlbedoMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _DetailMask
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _DetailNormalMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _EmissionMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _MainTex
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _MetallicGlossMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _OcclusionMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- first:
|
||||||
|
name: _ParallaxMap
|
||||||
|
second:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Floats:
|
||||||
|
- first:
|
||||||
|
name: _BumpScale
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _Cutoff
|
||||||
|
second: 0.5
|
||||||
|
- first:
|
||||||
|
name: _DetailNormalMapScale
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _DstBlend
|
||||||
|
second: 0
|
||||||
|
- first:
|
||||||
|
name: _GlossMapScale
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _Glossiness
|
||||||
|
second: 0.5
|
||||||
|
- first:
|
||||||
|
name: _GlossyReflections
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _Metallic
|
||||||
|
second: 0
|
||||||
|
- first:
|
||||||
|
name: _Mode
|
||||||
|
second: 0
|
||||||
|
- first:
|
||||||
|
name: _OcclusionStrength
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _Parallax
|
||||||
|
second: 0.02
|
||||||
|
- first:
|
||||||
|
name: _SmoothnessTextureChannel
|
||||||
|
second: 0
|
||||||
|
- first:
|
||||||
|
name: _SpecularHighlights
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _SrcBlend
|
||||||
|
second: 1
|
||||||
|
- first:
|
||||||
|
name: _UVSec
|
||||||
|
second: 0
|
||||||
|
- first:
|
||||||
|
name: _ZWrite
|
||||||
|
second: 1
|
||||||
|
m_Colors:
|
||||||
|
- first:
|
||||||
|
name: _Color
|
||||||
|
second: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- first:
|
||||||
|
name: _EmissionColor
|
||||||
|
second: {r: 0, g: 0, b: 0, a: 1}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22262639920f43d6be32430e4e58350d
|
||||||
|
timeCreated: 1473643741
|
||||||
|
licenseType: Pro
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
9
Assets/TextMesh Pro/Examples & Extras/Prefabs.meta
Normal file
9
Assets/TextMesh Pro/Examples & Extras/Prefabs.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5bff2544887143f5807c7d5059d07f79
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1436068007
|
||||||
|
licenseType: Pro
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
280
Assets/TextMesh Pro/Examples & Extras/Prefabs/Text Popup.prefab
Normal file
280
Assets/TextMesh Pro/Examples & Extras/Prefabs/Text Popup.prefab
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &121924
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
serializedVersion: 4
|
||||||
|
m_Component:
|
||||||
|
- 224: {fileID: 22414422}
|
||||||
|
- 222: {fileID: 22260028}
|
||||||
|
- 114: {fileID: 11487728}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: TextMeshPro Text
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!1 &188050
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
serializedVersion: 4
|
||||||
|
m_Component:
|
||||||
|
- 224: {fileID: 22450954}
|
||||||
|
- 222: {fileID: 22204918}
|
||||||
|
- 114: {fileID: 11486278}
|
||||||
|
- 114: {fileID: 11427010}
|
||||||
|
- 114: {fileID: 11405862}
|
||||||
|
- 225: {fileID: 22524478}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Text Popup
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &11405862
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 1741964061, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_HorizontalFit: 2
|
||||||
|
m_VerticalFit: 2
|
||||||
|
--- !u!114 &11427010
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Padding:
|
||||||
|
m_Left: 10
|
||||||
|
m_Right: 10
|
||||||
|
m_Top: 10
|
||||||
|
m_Bottom: 10
|
||||||
|
m_ChildAlignment: 0
|
||||||
|
m_Spacing: 0
|
||||||
|
m_ChildForceExpandWidth: 1
|
||||||
|
m_ChildForceExpandHeight: 1
|
||||||
|
--- !u!114 &11486278
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 0.10542818, g: 0.21589755, b: 0.47794116, a: 0.9411765}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
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
|
||||||
|
--- !u!114 &11487728
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 121924}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_text: Sample
|
||||||
|
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: 4294967295
|
||||||
|
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_enableVertexGradient: 0
|
||||||
|
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_overrideHtmlColors: 0
|
||||||
|
m_faceColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4294967295
|
||||||
|
m_outlineColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4278190080
|
||||||
|
m_fontSize: 36
|
||||||
|
m_fontSizeBase: 36
|
||||||
|
m_fontWeight: 400
|
||||||
|
m_enableAutoSizing: 0
|
||||||
|
m_fontSizeMin: 18
|
||||||
|
m_fontSizeMax: 72
|
||||||
|
m_fontStyle: 0
|
||||||
|
m_textAlignment: 514
|
||||||
|
m_isAlignmentEnumConverted: 1
|
||||||
|
m_characterSpacing: 0
|
||||||
|
m_wordSpacing: 0
|
||||||
|
m_lineSpacing: 0
|
||||||
|
m_lineSpacingMax: 0
|
||||||
|
m_paragraphSpacing: 0
|
||||||
|
m_charWidthMaxAdj: 0
|
||||||
|
m_enableWordWrapping: 0
|
||||||
|
m_wordWrappingRatios: 0.4
|
||||||
|
m_overflowMode: 0
|
||||||
|
m_firstOverflowCharacterIndex: -1
|
||||||
|
m_linkedTextComponent: {fileID: 0}
|
||||||
|
m_isLinkedTextComponent: 0
|
||||||
|
m_enableKerning: 1
|
||||||
|
m_enableExtraPadding: 0
|
||||||
|
checkPaddingRequired: 0
|
||||||
|
m_isRichText: 1
|
||||||
|
m_parseCtrlCharacters: 1
|
||||||
|
m_isOrthographic: 1
|
||||||
|
m_isCullingEnabled: 0
|
||||||
|
m_ignoreRectMaskCulling: 0
|
||||||
|
m_ignoreCulling: 1
|
||||||
|
m_horizontalMapping: 0
|
||||||
|
m_verticalMapping: 0
|
||||||
|
m_uvLineOffset: 0
|
||||||
|
m_geometrySortingOrder: 0
|
||||||
|
m_firstVisibleCharacter: 0
|
||||||
|
m_useMaxVisibleDescender: 1
|
||||||
|
m_pageToDisplay: 1
|
||||||
|
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_textInfo:
|
||||||
|
textComponent: {fileID: 0}
|
||||||
|
characterCount: 6
|
||||||
|
spriteCount: 0
|
||||||
|
spaceCount: 0
|
||||||
|
wordCount: 1
|
||||||
|
linkCount: 0
|
||||||
|
lineCount: 1
|
||||||
|
pageCount: 1
|
||||||
|
materialCount: 1
|
||||||
|
m_havePropertiesChanged: 1
|
||||||
|
m_isUsingLegacyAnimationComponent: 0
|
||||||
|
m_isVolumetricText: 0
|
||||||
|
m_spriteAnimator: {fileID: 0}
|
||||||
|
m_isInputParsingRequired: 1
|
||||||
|
m_inputSource: 0
|
||||||
|
m_hasFontAssetChanged: 0
|
||||||
|
m_subTextObjects:
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
m_baseMaterial: {fileID: 2100000, guid: 316f956b856b45c448987b5018ec3ef4, type: 2}
|
||||||
|
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
--- !u!222 &22204918
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
--- !u!222 &22260028
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 121924}
|
||||||
|
--- !u!224 &22414422
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 121924}
|
||||||
|
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_Children: []
|
||||||
|
m_Father: {fileID: 22450954}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!224 &22450954
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
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_Children:
|
||||||
|
- {fileID: 22414422}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 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: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!225 &22524478
|
||||||
|
CanvasGroup:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 188050}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_Alpha: 1
|
||||||
|
m_Interactable: 0
|
||||||
|
m_BlocksRaycasts: 0
|
||||||
|
m_IgnoreParentGroups: 0
|
||||||
|
--- !u!1001 &100100000
|
||||||
|
Prefab:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
m_TransformParent: {fileID: 0}
|
||||||
|
m_Modifications: []
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_ParentPrefab: {fileID: 0}
|
||||||
|
m_RootGameObject: {fileID: 188050}
|
||||||
|
m_IsPrefabParent: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b06f0e6c1dfa4356ac918da1bb32c603
|
||||||
|
timeCreated: 1435130987
|
||||||
|
licenseType: Store
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,219 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &100000
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 22495902}
|
||||||
|
- component: {fileID: 3300000}
|
||||||
|
- component: {fileID: 2300000}
|
||||||
|
- component: {fileID: 11400000}
|
||||||
|
- component: {fileID: 22227760}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: TextMeshPro - Prefab 1
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!23 &2300000
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 0
|
||||||
|
m_ReceiveShadows: 0
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RenderingLayerMask: 4294967295
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 0
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
--- !u!33 &3300000
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Mesh: {fileID: 0}
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_text: Seems to be ok!
|
||||||
|
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: 4294967295
|
||||||
|
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_enableVertexGradient: 0
|
||||||
|
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_overrideHtmlColors: 0
|
||||||
|
m_faceColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4294967295
|
||||||
|
m_outlineColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4278190080
|
||||||
|
m_fontSize: 36
|
||||||
|
m_fontSizeBase: 36
|
||||||
|
m_fontWeight: 400
|
||||||
|
m_enableAutoSizing: 0
|
||||||
|
m_fontSizeMin: 18
|
||||||
|
m_fontSizeMax: 72
|
||||||
|
m_fontStyle: 0
|
||||||
|
m_textAlignment: 0
|
||||||
|
m_isAlignmentEnumConverted: 0
|
||||||
|
m_characterSpacing: 0
|
||||||
|
m_wordSpacing: 0
|
||||||
|
m_lineSpacing: 0
|
||||||
|
m_lineSpacingMax: 0
|
||||||
|
m_paragraphSpacing: 0
|
||||||
|
m_charWidthMaxAdj: 0
|
||||||
|
m_enableWordWrapping: 0
|
||||||
|
m_wordWrappingRatios: 0.4
|
||||||
|
m_overflowMode: 0
|
||||||
|
m_firstOverflowCharacterIndex: -1
|
||||||
|
m_linkedTextComponent: {fileID: 0}
|
||||||
|
m_isLinkedTextComponent: 0
|
||||||
|
m_isTextTruncated: 0
|
||||||
|
m_enableKerning: 0
|
||||||
|
m_enableExtraPadding: 0
|
||||||
|
checkPaddingRequired: 0
|
||||||
|
m_isRichText: 1
|
||||||
|
m_parseCtrlCharacters: 1
|
||||||
|
m_isOrthographic: 0
|
||||||
|
m_isCullingEnabled: 0
|
||||||
|
m_ignoreRectMaskCulling: 0
|
||||||
|
m_ignoreCulling: 1
|
||||||
|
m_horizontalMapping: 0
|
||||||
|
m_verticalMapping: 0
|
||||||
|
m_uvLineOffset: 0.3
|
||||||
|
m_geometrySortingOrder: 0
|
||||||
|
m_firstVisibleCharacter: 0
|
||||||
|
m_useMaxVisibleDescender: 1
|
||||||
|
m_pageToDisplay: 0
|
||||||
|
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_textInfo:
|
||||||
|
textComponent: {fileID: 11400000}
|
||||||
|
characterCount: 15
|
||||||
|
spriteCount: 0
|
||||||
|
spaceCount: 3
|
||||||
|
wordCount: 4
|
||||||
|
linkCount: 0
|
||||||
|
lineCount: 1
|
||||||
|
pageCount: 1
|
||||||
|
materialCount: 1
|
||||||
|
m_havePropertiesChanged: 1
|
||||||
|
m_isUsingLegacyAnimationComponent: 0
|
||||||
|
m_isVolumetricText: 0
|
||||||
|
m_spriteAnimator: {fileID: 0}
|
||||||
|
m_isInputParsingRequired: 1
|
||||||
|
m_inputSource: 0
|
||||||
|
m_hasFontAssetChanged: 0
|
||||||
|
m_renderer: {fileID: 2300000}
|
||||||
|
m_subTextObjects:
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
m_maskType: 0
|
||||||
|
--- !u!222 &22227760
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
--- !u!224 &22495902
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
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_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 0
|
||||||
|
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: -4.87}
|
||||||
|
m_SizeDelta: {x: 28.005241, y: 4.035484}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!1001 &100100000
|
||||||
|
Prefab:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
m_TransformParent: {fileID: 0}
|
||||||
|
m_Modifications: []
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_ParentPrefab: {fileID: 0}
|
||||||
|
m_RootGameObject: {fileID: 100000}
|
||||||
|
m_IsPrefabParent: 1
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a6e39ced0ea046bcb636c3f0b2e2a745
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,219 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &100000
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 22478072}
|
||||||
|
- component: {fileID: 3300000}
|
||||||
|
- component: {fileID: 2300000}
|
||||||
|
- component: {fileID: 11400000}
|
||||||
|
- component: {fileID: 22224556}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: TextMeshPro - Prefab 2
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!23 &2300000
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 0
|
||||||
|
m_ReceiveShadows: 0
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RenderingLayerMask: 4294967295
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 0
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
--- !u!33 &3300000
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Mesh: {fileID: 0}
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||||
|
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
m_text: Hello World!
|
||||||
|
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: 4294967295
|
||||||
|
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_enableVertexGradient: 0
|
||||||
|
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_overrideHtmlColors: 0
|
||||||
|
m_faceColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4294967295
|
||||||
|
m_outlineColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4278190080
|
||||||
|
m_fontSize: 36
|
||||||
|
m_fontSizeBase: 36
|
||||||
|
m_fontWeight: 400
|
||||||
|
m_enableAutoSizing: 0
|
||||||
|
m_fontSizeMin: 18
|
||||||
|
m_fontSizeMax: 72
|
||||||
|
m_fontStyle: 0
|
||||||
|
m_textAlignment: 0
|
||||||
|
m_isAlignmentEnumConverted: 0
|
||||||
|
m_characterSpacing: 0
|
||||||
|
m_wordSpacing: 0
|
||||||
|
m_lineSpacing: 0
|
||||||
|
m_lineSpacingMax: 0
|
||||||
|
m_paragraphSpacing: 0
|
||||||
|
m_charWidthMaxAdj: 0
|
||||||
|
m_enableWordWrapping: 0
|
||||||
|
m_wordWrappingRatios: 0.4
|
||||||
|
m_overflowMode: 0
|
||||||
|
m_firstOverflowCharacterIndex: -1
|
||||||
|
m_linkedTextComponent: {fileID: 0}
|
||||||
|
m_isLinkedTextComponent: 0
|
||||||
|
m_isTextTruncated: 0
|
||||||
|
m_enableKerning: 0
|
||||||
|
m_enableExtraPadding: 0
|
||||||
|
checkPaddingRequired: 0
|
||||||
|
m_isRichText: 1
|
||||||
|
m_parseCtrlCharacters: 1
|
||||||
|
m_isOrthographic: 0
|
||||||
|
m_isCullingEnabled: 0
|
||||||
|
m_ignoreRectMaskCulling: 0
|
||||||
|
m_ignoreCulling: 1
|
||||||
|
m_horizontalMapping: 0
|
||||||
|
m_verticalMapping: 0
|
||||||
|
m_uvLineOffset: 0.3
|
||||||
|
m_geometrySortingOrder: 0
|
||||||
|
m_firstVisibleCharacter: 0
|
||||||
|
m_useMaxVisibleDescender: 1
|
||||||
|
m_pageToDisplay: 0
|
||||||
|
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_textInfo:
|
||||||
|
textComponent: {fileID: 11400000}
|
||||||
|
characterCount: 12
|
||||||
|
spriteCount: 0
|
||||||
|
spaceCount: 1
|
||||||
|
wordCount: 2
|
||||||
|
linkCount: 0
|
||||||
|
lineCount: 1
|
||||||
|
pageCount: 1
|
||||||
|
materialCount: 1
|
||||||
|
m_havePropertiesChanged: 1
|
||||||
|
m_isUsingLegacyAnimationComponent: 0
|
||||||
|
m_isVolumetricText: 0
|
||||||
|
m_spriteAnimator: {fileID: 0}
|
||||||
|
m_isInputParsingRequired: 1
|
||||||
|
m_inputSource: 0
|
||||||
|
m_hasFontAssetChanged: 0
|
||||||
|
m_renderer: {fileID: 2300000}
|
||||||
|
m_subTextObjects:
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
- {fileID: 0}
|
||||||
|
m_maskType: 0
|
||||||
|
--- !u!222 &22224556
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
--- !u!224 &22478072
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 100000}
|
||||||
|
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_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 0
|
||||||
|
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: 4.48}
|
||||||
|
m_SizeDelta: {x: 19.604034, y: 4.035484}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!1001 &100100000
|
||||||
|
Prefab:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
m_TransformParent: {fileID: 0}
|
||||||
|
m_Modifications: []
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_ParentPrefab: {fileID: 0}
|
||||||
|
m_RootGameObject: {fileID: 100000}
|
||||||
|
m_IsPrefabParent: 1
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fdad9d952ae84cafb74c63f2e694d042
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
9
Assets/TextMesh Pro/Examples & Extras/Resources.meta
Normal file
9
Assets/TextMesh Pro/Examples & Extras/Resources.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d6d3a169ad794942a21da6a552d62f6f
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1436068007
|
||||||
|
licenseType: Pro
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7f422cd1388b01047a58cd07c7a23d9d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0, type: 3}
|
||||||
|
m_Name: Blue to Purple - Vertical
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
topLeft: {r: 0, g: 0.83448267, b: 1, a: 1}
|
||||||
|
topRight: {r: 0.1544118, g: 0.5801215, b: 1, a: 1}
|
||||||
|
bottomLeft: {r: 0.49168324, g: 0, b: 0.7058823, a: 1}
|
||||||
|
bottomRight: {r: 0.4901961, g: 0, b: 0.7019608, a: 1}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 479a66fa4b094512a62b0a8e553ad95a
|
||||||
|
timeCreated: 1468189245
|
||||||
|
licenseType: Pro
|
||||||
|
NativeFormatImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 54d21f6ece3b46479f0c328f8c6007e0, type: 3}
|
||||||
|
m_Name: Dark to Light Green - Vertical
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
topLeft: {r: 0, g: .661764741, b: 0, a: 1}
|
||||||
|
topRight: {r: 0, g: .573529422, b: .00224910071, a: 1}
|
||||||
|
bottomLeft: {r: .525490224, g: 1, b: .490196109, a: 1}
|
||||||
|
bottomRight: {r: .421999991, g: .992156923, b: .374000013, a: 1}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user