├── ProjectSettings ├── ProjectVersion.txt ├── ClusterInputManager.asset ├── NetworkManager.asset ├── EditorBuildSettings.asset ├── TimeManager.asset ├── VFXManager.asset ├── AudioManager.asset ├── TagManager.asset ├── EditorSettings.asset ├── PresetManager.asset ├── UnityConnectSettings.asset ├── DynamicsManager.asset ├── Physics2DSettings.asset ├── NavMeshAreas.asset ├── GraphicsSettings.asset ├── QualitySettings.asset ├── InputManager.asset └── ProjectSettings.asset ├── Doc └── 1.png ├── Assets ├── Scenes │ ├── Atlas │ │ ├── MapAtlas.png │ │ └── MapAtlas.png.meta │ ├── RichText.unity.meta │ └── Atlas.meta ├── Editor.meta ├── Scenes.meta ├── Script.meta ├── Shader.meta ├── Material.meta ├── Script │ ├── Tools.meta │ ├── RichImage.cs.meta │ ├── RichText.cs.meta │ ├── RichTextCommon.cs.meta │ ├── RichTextRender.cs.meta │ ├── RichTextSprite.cs.meta │ ├── Tools │ │ ├── ListPool.cs.meta │ │ ├── UnityExtend.cs.meta │ │ ├── ListPool.cs │ │ └── UnityExtend.cs │ ├── RichTextCommon.cs │ ├── RichTextSprite.cs │ ├── RichTextRender.cs │ ├── RichImage.cs │ └── RichText.cs ├── Material │ ├── RichText.mat.meta │ └── RichText.mat ├── Shader │ ├── RichText.shader.meta │ └── RichText.shader └── Editor │ ├── RichImageEditor.cs.meta │ ├── RichTextEditor.cs.meta │ ├── RichTextEditor.cs │ └── RichImageEditor.cs ├── .gitignore └── README.md /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2018.4.25f1 2 | -------------------------------------------------------------------------------- /Doc/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/506638093/RichText/HEAD/Doc/1.png -------------------------------------------------------------------------------- /Assets/Scenes/Atlas/MapAtlas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/506638093/RichText/HEAD/Assets/Scenes/Atlas/MapAtlas.png -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.vs 2 | /Library 3 | /Logs 4 | /obj 5 | /Packages 6 | /Temp 7 | /RichText.sln 8 | /Assembly-CSharp.csproj 9 | /Assembly-CSharp-Editor.csproj 10 | ProjectSettings/UPRSettings.asset 11 | -------------------------------------------------------------------------------- /Assets/Scenes/RichText.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2f812422dd241943af766aa6091841c 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2607caf12681afb4a925a2d32f8e44d6 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 91db5e1224e7f794e92f095f853f3ec1 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Script.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2a4fd9be4cc8079418c8177f62174dd6 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2c2263643160af74da3bbf9ff241da44 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /Assets/Material.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bd4d1155a4bdc3f4c8c412b46e1f6295 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes/Atlas.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ffe8ff77b2cb02b468c6599b3ea5b939 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Script/Tools.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 68c250e0dffefda4b9856b2658a0ce0b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /Assets/Material/RichText.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cd7541105f4ca5944a9c4f313094473a 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.1 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Assets/Shader/RichText.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d4e7f55e4142b44ab8b2f182a9b09b3 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Script/RichImage.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c69a887854bb224885a09159bcc0fe4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/RichText.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d818d0f4d55dd74390c21129d9fea9a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RichImageEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8ac76cd9ab1f78348ad5137a0d15ed12 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RichTextEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 701285a354821dd45ad7a812516987b4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/RichTextCommon.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1b92369020afdd2438522a48508eff28 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/RichTextRender.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3156a9cd27153b74ba342b4a7c98affa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/RichTextSprite.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7657f57d7767c934689b520185372176 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/Tools/ListPool.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 614ec4677ddd16f42a6d0deba3d1e453 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Script/Tools/UnityExtend.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a23928dd166d5bb4e8189d109a0412f7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_RenderPipeSettingsPath: 10 | m_FixedTimeStep: 0.016666668 11 | m_MaxDeltaTime: 0.05 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RichText 2 | 高效、支持大规模头顶文字 3 | 4 | 需求:我们希望能支持大规模头顶文字功能,有图文混排、图文并排、进度条等功能。 5 | 我们希望drawcall尽量的少,我们不希望其中一个子节点改变就会导致大量重计算。 6 | 7 | 常用解决方案: 8 | 1、创建两个Canvas,一个font,一个Image。但并不能有效的解决上述问题。 9 | 2、利用TextMeshPro,但TextMeshPro对atlas支持不友好,对字体库缺少文字支持不友好。 10 | 11 | 综上所述: 12 | RichText有效的解决了上面的问题。我们依赖unity的高效动态合并功能。 13 | RichText支持UI模式和3D模式。 14 | 15 | ![Image text](https://github.com/506638093/RichText/blob/master/Doc/1.png) 16 | 17 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 1024 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /Assets/Script/RichTextCommon.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | using System.Collections.Generic; 7 | 8 | internal static class RichTextCommon 9 | { 10 | public static void EnsureSizeEx(this IList list, int size) 11 | { 12 | if (null != list) 13 | { 14 | var count = list.Count; 15 | for (int i = count; i < size; ++i) 16 | { 17 | list.Add(default(T)); 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - PostProcessing 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_SpritePackerMode: 0 12 | m_SpritePackerPaddingPower: 1 13 | m_EtcTextureCompressorBehavior: 1 14 | m_EtcTextureFastCompressor: 1 15 | m_EtcTextureNormalCompressor: 2 16 | m_EtcTextureBestCompressor: 4 17 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd 18 | m_ProjectGenerationRootNamespace: 19 | m_UserGeneratedProjectSuffix: 20 | m_CollabEditorSettings: 21 | inProgressEnabled: 1 22 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | m_DefaultList: 7 | - type: 8 | m_NativeTypeID: 108 9 | m_ManagedTypePPtr: {fileID: 0} 10 | m_ManagedTypeFallback: 11 | defaultPresets: 12 | - m_Preset: {fileID: 2655988077585873504, guid: c1cf8506f04ef2c4a88b64b6c4202eea, 13 | type: 2} 14 | - type: 15 | m_NativeTypeID: 1020 16 | m_ManagedTypePPtr: {fileID: 0} 17 | m_ManagedTypeFallback: 18 | defaultPresets: 19 | - m_Preset: {fileID: 2655988077585873504, guid: 0cd792cc87e492d43b4e95b205fc5cc6, 20 | type: 2} 21 | - type: 22 | m_NativeTypeID: 1006 23 | m_ManagedTypePPtr: {fileID: 0} 24 | m_ManagedTypeFallback: 25 | defaultPresets: 26 | - m_Preset: {fileID: 2655988077585873504, guid: 7a99f8aa944efe94cb9bd74562b7d5f9, 27 | type: 2} 28 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /Assets/Material/RichText.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: RichText 11 | m_Shader: {fileID: 4800000, guid: 3d4e7f55e4142b44ab8b2f182a9b09b3, type: 3} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _MainTex: 23 | m_Texture: {fileID: 10103, guid: 0000000000000000e000000000000000, type: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _SpriteTex: 27 | m_Texture: {fileID: 2800000, guid: 0192151b80666114d8a79352c9ecd13a, type: 3} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | m_Floats: [] 31 | m_Colors: 32 | - _Color: {r: 1, g: 1, b: 1, a: 1} 33 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 8 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | -------------------------------------------------------------------------------- /Assets/Script/Tools/ListPool.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | using System.Collections.Generic; 7 | 8 | namespace HuaHua 9 | { 10 | public static class ListPool 11 | { 12 | private static Queue> mListQueue = new Queue>(); 13 | 14 | public static List Get() 15 | { 16 | if(mListQueue.Count == 0) 17 | { 18 | mListQueue.Enqueue(new List()); 19 | } 20 | return mListQueue.Dequeue(); 21 | } 22 | 23 | public static List Get(List source) 24 | { 25 | List temp = Get(); 26 | temp.Clear(); 27 | if(temp.Capacity < source.Capacity) { temp.Capacity = source.Capacity; } 28 | temp.AddRange(source); 29 | return temp; 30 | } 31 | 32 | public static List Get(int capacity) 33 | { 34 | List temp = Get(); 35 | temp.Clear(); 36 | if(temp.Capacity < capacity) { temp.Capacity = capacity; } 37 | return temp; 38 | } 39 | 40 | public static void Release(List list) 41 | { 42 | list.Clear(); 43 | mListQueue.Enqueue(list); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_ReuseCollisionCallbacks: 1 28 | m_AutoSyncTransforms: 0 29 | m_AlwaysShowColliders: 0 30 | m_ShowColliderSleep: 1 31 | m_ShowColliderContacts: 0 32 | m_ShowColliderAABB: 0 33 | m_ContactArrowScale: 0.2 34 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 35 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 36 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 37 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 38 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 39 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /Assets/Shader/RichText.shader: -------------------------------------------------------------------------------- 1 | 2 | Shader "UI/RichText" 3 | { 4 | Properties 5 | { 6 | _MainTex("Font Texture", 2D) = "white" {} 7 | _SpriteTex("Sprite Texture", 2D) = "white" {} 8 | _Color("Text Color", Color) = (1, 1, 1, 1) 9 | } 10 | 11 | SubShader 12 | { 13 | Tags 14 | { 15 | "Queue" = "Transparent" 16 | "IgnoreProjector" = "True" 17 | "RenderType" = "Transparent" 18 | "PreviewType" = "Plane" 19 | } 20 | 21 | Lighting Off 22 | Cull Off 23 | ZTest Always 24 | ZWrite Off 25 | Blend SrcAlpha OneMinusSrcAlpha 26 | 27 | Pass 28 | { 29 | CGPROGRAM 30 | #pragma vertex vert 31 | #pragma fragment frag 32 | #pragma multi_compile _ UNITY_SINGLE_PASS_STEREO STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON 33 | 34 | #include "UnityCG.cginc" 35 | 36 | struct appdata_t 37 | { 38 | float4 vertex : POSITION; 39 | half4 color : COLOR; 40 | float2 uv0 : TEXCOORD0; 41 | float2 uv1 : TEXCOORD1; 42 | }; 43 | 44 | struct v2f 45 | { 46 | float4 vertex : POSITION; 47 | half4 color : COLOR; 48 | float2 uv0 : TEXCOORD0; 49 | float2 uv1 : TEXCOORD1; 50 | }; 51 | 52 | sampler2D _MainTex; 53 | float4 _MainTex_ST; 54 | 55 | sampler2D _SpriteTex; 56 | float4 _SpriteTex_ST; 57 | 58 | uniform fixed4 _Color; 59 | 60 | v2f vert(appdata_t v) 61 | { 62 | v2f o; 63 | o.vertex = UnityObjectToClipPos(v.vertex); 64 | o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex); 65 | o.uv1 = TRANSFORM_TEX(v.uv1, _SpriteTex); 66 | o.color = v.color;// *_Color; 67 | 68 | return o; 69 | } 70 | 71 | half4 frag(v2f i) : COLOR 72 | { 73 | half4 result = i.color * i.uv1.x; 74 | result.a *= (tex2D(_MainTex, i.uv0)).a; 75 | result += i.uv1.y * i.color * tex2D(_SpriteTex, i.uv0); 76 | 77 | return result; 78 | } 79 | ENDCG 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 39 | m_PreloadedShaders: [] 40 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 41 | type: 0} 42 | m_CustomRenderPipeline: {fileID: 0} 43 | m_TransparencySortMode: 0 44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 45 | m_DefaultRenderingPath: 1 46 | m_DefaultMobileRenderingPath: 1 47 | m_TierSettings: [] 48 | m_LightmapStripping: 0 49 | m_FogStripping: 0 50 | m_InstancingStripping: 0 51 | m_LightmapKeepPlain: 1 52 | m_LightmapKeepDirCombined: 1 53 | m_LightmapKeepDynamicPlain: 1 54 | m_LightmapKeepDynamicDirCombined: 1 55 | m_LightmapKeepShadowMask: 1 56 | m_LightmapKeepSubtractive: 1 57 | m_FogKeepLinear: 1 58 | m_FogKeepExp: 1 59 | m_FogKeepExp2: 1 60 | m_AlbedoSwatchInfos: [] 61 | m_LightsUseLinearIntensity: 0 62 | m_LightsUseColorTemperature: 0 63 | -------------------------------------------------------------------------------- /Assets/Editor/RichTextEditor.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | 7 | using UnityEngine; 8 | using UnityEditor; 9 | using UnityEditor.UI; 10 | using System; 11 | 12 | namespace UnityEngine.UI 13 | { 14 | [CustomEditor(typeof(RichText))] 15 | [CanEditMultipleObjects] 16 | public class RichTextEditor : GraphicEditor 17 | { 18 | 19 | protected override void OnEnable() 20 | { 21 | base.OnEnable(); 22 | 23 | var serializedObject = this.serializedObject; 24 | m_Text = serializedObject.FindProperty("m_Text"); 25 | m_FontData = serializedObject.FindProperty("m_FontData"); 26 | m_AtlasTexture = serializedObject.FindProperty("m_AtlasTexture"); 27 | m_UiMode = serializedObject.FindProperty("m_UiMode"); 28 | 29 | m_lpfnParseText = System.Delegate.CreateDelegate(typeof(Action), serializedObject.targetObject, "parseText") as Action; 30 | 31 | EditorApplication.update += CheckText; 32 | } 33 | 34 | protected override void OnDisable() 35 | { 36 | base.OnDisable(); 37 | 38 | EditorApplication.update -= CheckText; 39 | } 40 | 41 | private void CheckText() 42 | { 43 | var currentTextString = m_Text.stringValue; 44 | if (m_lastTextString != currentTextString) 45 | { 46 | m_lastTextString = currentTextString; 47 | 48 | var richText = serializedObject.targetObject as RichText; 49 | if (richText.IsActive() && null != m_lpfnParseText) 50 | { 51 | m_lpfnParseText(); 52 | } 53 | } 54 | } 55 | 56 | public override void OnInspectorGUI() 57 | { 58 | serializedObject.Update(); 59 | 60 | var richText = serializedObject.targetObject as RichText; 61 | 62 | EditorGUILayout.PropertyField(m_Text); 63 | EditorGUILayout.PropertyField(m_FontData); 64 | EditorGUILayout.PropertyField(m_AtlasTexture); 65 | if (richText.m_AtlasTexture) 66 | { 67 | var atlasPath = AssetDatabase.GetAssetPath(richText.m_AtlasTexture); 68 | atlasPath = atlasPath.Substring("Assets/Resources/".Length, atlasPath.Length - "Assets/Resources/".Length - ".png".Length) + "/"; 69 | if (atlasPath != richText.AtlasTexturePath) 70 | { 71 | richText.AtlasTexturePath = atlasPath; 72 | } 73 | } 74 | EditorGUILayout.PropertyField(m_UiMode); 75 | 76 | AppearanceControlsGUI(); 77 | RaycastControlsGUI(); 78 | serializedObject.ApplyModifiedProperties(); 79 | } 80 | 81 | private SerializedProperty m_Text; 82 | private SerializedProperty m_FontData; 83 | private SerializedProperty m_AtlasTexture; 84 | private SerializedProperty m_UiMode; 85 | 86 | private string m_lastTextString; 87 | private Action m_lpfnParseText; 88 | 89 | } 90 | 91 | 92 | } 93 | -------------------------------------------------------------------------------- /Assets/Script/Tools/UnityExtend.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | using UnityEngine; 7 | using UnityEngine.UI; 8 | 9 | namespace HuaHua 10 | { 11 | /// 12 | /// unity扩展类 13 | /// 14 | public static class UnityExtend 15 | { 16 | /// 17 | /// 获取或者添加一个脚本 18 | /// 19 | /// 20 | /// 21 | /// 22 | public static T GetOrAddComponent(this GameObject obj) where T : Component 23 | { 24 | T t = obj.GetComponent(); 25 | if (t == null) 26 | { 27 | t = obj.AddComponent(); 28 | } 29 | return t; 30 | } 31 | 32 | /// 33 | /// 获取或者添加一个脚本 34 | /// 35 | /// 36 | /// 37 | /// 38 | public static T GetOrAddComponent(this Transform t) where T : Component 39 | { 40 | T newT = t.GetComponent(); 41 | if (newT == null) 42 | { 43 | newT = t.gameObject.AddComponent(); 44 | } 45 | return newT; 46 | } 47 | 48 | public static void SetColor(this Graphic graphic, int r, int g, int b, int a) 49 | { 50 | graphic.color = new Color32((byte)r, (byte)g, (byte)b, (byte)a); 51 | } 52 | 53 | public static void SetColor(this Graphic graphic, int r, int g, int b) 54 | { 55 | graphic.color = new Color32((byte)r, (byte)g, (byte)b, 255); 56 | } 57 | 58 | /// 59 | /// 获取对象在Hierarchy中的节点路径 60 | /// 61 | public static string GetHierarchyPath(this Transform tran, Transform root = null) 62 | { 63 | return GetHierarchPathLoop(tran, root); 64 | } 65 | /// 66 | /// 获取对象在Hierarchy中的节点路径 67 | /// 68 | public static string GetHierarchyPath(this GameObject obj, Transform root = null) 69 | { 70 | return GetHierarchyPath(obj.transform, root); 71 | } 72 | /// 73 | /// 获取对象在Hierarchy中的节点路径 74 | /// 75 | public static string GetHierarchyPath(this Component obj, Transform root = null) 76 | { 77 | return GetHierarchyPath(obj.transform, root); 78 | } 79 | private static string GetHierarchPathLoop(Transform t, Transform root = null, string path = null) 80 | { 81 | if (string.IsNullOrEmpty(path)) 82 | { 83 | path = t.gameObject.name; 84 | } 85 | else 86 | { 87 | path = t.gameObject.name + "/" + path; 88 | } 89 | if (t.parent != null && t.parent != root) 90 | { 91 | return GetHierarchPathLoop(t.parent, root, path); 92 | } 93 | else 94 | { 95 | return path; 96 | } 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /Assets/Script/RichTextSprite.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | 7 | using System; 8 | using System.Text.RegularExpressions; 9 | 10 | namespace UnityEngine.UI 11 | { 12 | public class RichTextSprite 13 | { 14 | private RichText m_richText; 15 | private string m_name; 16 | private int m_vertexIndex; 17 | private Vector2 m_size; 18 | private Sprite m_sprite; 19 | private float m_fillAmount = 1.0f; 20 | private Image.Type m_type = Image.Type.Simple; 21 | 22 | public RichTextSprite(RichText richText) 23 | { 24 | if (null == richText) 25 | { 26 | throw new ArgumentNullException("RichText is null."); 27 | } 28 | 29 | m_richText = richText; 30 | } 31 | 32 | public bool SetValue(Match match) 33 | { 34 | if (null == match) 35 | { 36 | return false; 37 | } 38 | 39 | var keyCaptures = match.Groups[1].Captures; 40 | var valCaptures = match.Groups[2].Captures; 41 | 42 | var count = keyCaptures.Count; 43 | if (count != valCaptures.Count) 44 | { 45 | return false; 46 | } 47 | 48 | for (int i = 0; i < count; ++i) 49 | { 50 | var key = keyCaptures[i].Value; 51 | var val = valCaptures[i].Value; 52 | checkSetValue(match, key, val); 53 | } 54 | 55 | return true; 56 | } 57 | 58 | public void SetName(string name) 59 | { 60 | m_name = name; 61 | } 62 | 63 | public void SetSprite(string path) 64 | { 65 | //TODO 需要自己根据实际情况实现加载 66 | } 67 | 68 | public string GetName() 69 | { 70 | return m_name; 71 | } 72 | 73 | public void Reset() 74 | { 75 | SetName(null); 76 | m_type = Image.Type.Simple; 77 | } 78 | 79 | public Sprite GetSprite() 80 | { 81 | return m_sprite; 82 | } 83 | 84 | public int GetVertexIndex() 85 | { 86 | return m_vertexIndex; 87 | } 88 | 89 | public Vector2 GetSize() 90 | { 91 | return m_size; 92 | } 93 | 94 | public Image.Type GetImageType() 95 | { 96 | return m_type; 97 | } 98 | 99 | private void checkSetValue(Match match, string key, string val) 100 | { 101 | if (key == "n") 102 | { 103 | SetName(val); 104 | m_vertexIndex = match.Index; 105 | } 106 | else if (key == "s") 107 | { 108 | SetSprite(val); 109 | } 110 | else if (key == "w") 111 | { 112 | float width; 113 | float.TryParse(val, out width); 114 | m_size.x = width; 115 | } 116 | else if (key == "h") 117 | { 118 | float height; 119 | float.TryParse(val, out height); 120 | m_size.y = height; 121 | } 122 | else if (key == "t") 123 | { 124 | if (val == "s") 125 | { 126 | m_type = Image.Type.Sliced; 127 | } 128 | } 129 | } 130 | 131 | public void SetFillAmount(float amount) 132 | { 133 | amount = Mathf.Clamp01(amount); 134 | 135 | float eps = 0.001f; 136 | var delta = m_fillAmount - amount; 137 | if (delta > eps || delta < -eps) 138 | { 139 | m_fillAmount = amount; 140 | m_richText.SetVerticesDirty(); 141 | } 142 | } 143 | 144 | public float GetFillAmount() 145 | { 146 | return m_fillAmount; 147 | } 148 | 149 | public static MatchCollection GetMatches(string strText) 150 | { 151 | return _spriteTagRegex.Matches(strText); 152 | } 153 | 154 | private static readonly string _spriteTagPattern = @"['""]?)([\w\/]+)\k)+\s*\/>"; 155 | private static readonly Regex _spriteTagRegex = new Regex(_spriteTagPattern, RegexOptions.Singleline); 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /Assets/Script/RichTextRender.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | 7 | using HuaHua; 8 | 9 | namespace UnityEngine.UI 10 | { 11 | [ExecuteInEditMode] 12 | public class RichTextRender : MonoBehaviour 13 | { 14 | [System.NonSerialized] 15 | private MeshRenderer m_meshRender; 16 | [System.NonSerialized] 17 | private MeshFilter m_meshFilter; 18 | [System.NonSerialized] 19 | private Mesh m_mesh; 20 | 21 | private bool m_dirty; 22 | 23 | internal static readonly HideFlags MeshHideflags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.HideInInspector; 24 | 25 | struct MeshOrder 26 | { 27 | public Mesh mesh; 28 | public float z; 29 | public Matrix4x4 matrix; 30 | } 31 | 32 | public void MarkDirty() 33 | { 34 | m_dirty = true; 35 | #if UNITY_EDITOR 36 | OnCombineMesh(); 37 | #endif 38 | } 39 | 40 | private void OnCombineMesh() 41 | { 42 | RichText[] texts = GetComponentsInChildren(false); 43 | RichImage[] images = GetComponentsInChildren(false); 44 | var meshCount = texts.Length + images.Length; 45 | if (meshCount == 0) 46 | { 47 | if (m_mesh) 48 | { 49 | m_mesh.Clear(); 50 | } 51 | if (m_meshRender) 52 | { 53 | m_meshRender.enabled = false; 54 | } 55 | return; 56 | } 57 | 58 | if (m_meshRender == null) 59 | { 60 | m_meshRender = gameObject.GetOrAddComponent(); 61 | m_meshRender.hideFlags = MeshHideflags; 62 | 63 | m_meshFilter = gameObject.GetOrAddComponent(); 64 | m_meshFilter.hideFlags = MeshHideflags; 65 | 66 | m_mesh = new Mesh(); 67 | m_mesh.MarkDynamic(); 68 | m_mesh.hideFlags = MeshHideflags; 69 | } 70 | 71 | Material material = null; 72 | 73 | var meshes = ListPool.Get(); 74 | 75 | var worldToLocalMatrix = this.transform.worldToLocalMatrix; 76 | for (int i = 0; i < images.Length; ++i) 77 | { 78 | var image = images[i]; 79 | 80 | if (!image.IsActive()) 81 | { 82 | continue; 83 | } 84 | 85 | var mesh = image.Mesh(); 86 | if (mesh == null) 87 | { 88 | continue; 89 | } 90 | 91 | var meshOrder = new MeshOrder(); 92 | meshOrder.mesh = mesh; 93 | meshOrder.matrix = worldToLocalMatrix * image.transform.localToWorldMatrix; 94 | meshOrder.z = image.transform.localPosition.z; 95 | 96 | meshes.Add(meshOrder); 97 | 98 | if (material == null) 99 | { 100 | material = image.material; 101 | } 102 | } 103 | for (int j = 0; j < texts.Length; ++j) 104 | { 105 | var text = texts[j]; 106 | 107 | if (!text.IsActive()) 108 | { 109 | continue; 110 | } 111 | 112 | var mesh = text.Mesh(); 113 | if (mesh == null) 114 | { 115 | continue; 116 | } 117 | 118 | var meshOrder = new MeshOrder(); 119 | meshOrder.mesh = mesh; 120 | meshOrder.matrix = worldToLocalMatrix * text.transform.localToWorldMatrix; 121 | meshOrder.z = text.transform.localPosition.z; 122 | 123 | meshes.Add(meshOrder); 124 | 125 | if (material == null) 126 | { 127 | material = text.material; 128 | } 129 | } 130 | 131 | if (meshes.Count == 0) 132 | { 133 | if (m_meshRender) 134 | { 135 | m_meshRender.enabled = false; 136 | } 137 | return; 138 | } 139 | m_meshRender.enabled = true; 140 | 141 | meshes.Sort((lhs, rhs) => rhs.z.CompareTo(lhs.z)); 142 | 143 | CombineInstance[] combine = new CombineInstance[meshes.Count]; 144 | for (int i = 0; i < meshes.Count; ++i) 145 | { 146 | combine[i].mesh = meshes[i].mesh; 147 | combine[i].transform = meshes[i].matrix; 148 | } 149 | 150 | ListPool.Release(meshes); 151 | 152 | m_mesh.CombineMeshes(combine, true); 153 | m_meshFilter.sharedMesh = m_mesh; 154 | m_meshRender.sharedMaterial = material; 155 | } 156 | 157 | protected void OnEnable() 158 | { 159 | m_dirty = true; 160 | } 161 | 162 | private void LateUpdate() 163 | { 164 | if(m_dirty) 165 | { 166 | OnCombineMesh(); 167 | 168 | m_dirty = false; 169 | } 170 | } 171 | 172 | } 173 | 174 | } -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 4 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | particleRaycastBudget: 4 33 | asyncUploadTimeSlice: 2 34 | asyncUploadBufferSize: 16 35 | resolutionScalingFixedDPIFactor: 1 36 | excludedTargetPlatforms: [] 37 | - serializedVersion: 2 38 | name: Low 39 | pixelLightCount: 0 40 | shadows: 0 41 | shadowResolution: 0 42 | shadowProjection: 1 43 | shadowCascades: 1 44 | shadowDistance: 20 45 | shadowNearPlaneOffset: 3 46 | shadowCascade2Split: 0.33333334 47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 48 | shadowmaskMode: 0 49 | blendWeights: 2 50 | textureQuality: 0 51 | anisotropicTextures: 0 52 | antiAliasing: 0 53 | softParticles: 0 54 | softVegetation: 0 55 | realtimeReflectionProbes: 0 56 | billboardsFaceCameraPosition: 0 57 | vSyncCount: 0 58 | lodBias: 0.4 59 | maximumLODLevel: 0 60 | particleRaycastBudget: 16 61 | asyncUploadTimeSlice: 2 62 | asyncUploadBufferSize: 16 63 | resolutionScalingFixedDPIFactor: 1 64 | excludedTargetPlatforms: [] 65 | - serializedVersion: 2 66 | name: Medium 67 | pixelLightCount: 1 68 | shadows: 1 69 | shadowResolution: 0 70 | shadowProjection: 1 71 | shadowCascades: 1 72 | shadowDistance: 20 73 | shadowNearPlaneOffset: 3 74 | shadowCascade2Split: 0.33333334 75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 76 | shadowmaskMode: 0 77 | blendWeights: 2 78 | textureQuality: 0 79 | anisotropicTextures: 1 80 | antiAliasing: 0 81 | softParticles: 0 82 | softVegetation: 0 83 | realtimeReflectionProbes: 0 84 | billboardsFaceCameraPosition: 0 85 | vSyncCount: 1 86 | lodBias: 0.7 87 | maximumLODLevel: 0 88 | particleRaycastBudget: 64 89 | asyncUploadTimeSlice: 2 90 | asyncUploadBufferSize: 16 91 | resolutionScalingFixedDPIFactor: 1 92 | excludedTargetPlatforms: [] 93 | - serializedVersion: 2 94 | name: High 95 | pixelLightCount: 2 96 | shadows: 2 97 | shadowResolution: 1 98 | shadowProjection: 1 99 | shadowCascades: 2 100 | shadowDistance: 40 101 | shadowNearPlaneOffset: 3 102 | shadowCascade2Split: 0.33333334 103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 104 | shadowmaskMode: 1 105 | blendWeights: 2 106 | textureQuality: 0 107 | anisotropicTextures: 1 108 | antiAliasing: 2 109 | softParticles: 0 110 | softVegetation: 1 111 | realtimeReflectionProbes: 1 112 | billboardsFaceCameraPosition: 1 113 | vSyncCount: 1 114 | lodBias: 1 115 | maximumLODLevel: 0 116 | particleRaycastBudget: 256 117 | asyncUploadTimeSlice: 2 118 | asyncUploadBufferSize: 16 119 | resolutionScalingFixedDPIFactor: 1 120 | excludedTargetPlatforms: [] 121 | - serializedVersion: 2 122 | name: Very High 123 | pixelLightCount: 3 124 | shadows: 2 125 | shadowResolution: 2 126 | shadowProjection: 1 127 | shadowCascades: 2 128 | shadowDistance: 40 129 | shadowNearPlaneOffset: 3 130 | shadowCascade2Split: 0.33333334 131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 132 | shadowmaskMode: 1 133 | blendWeights: 4 134 | textureQuality: 0 135 | anisotropicTextures: 1 136 | antiAliasing: 4 137 | softParticles: 1 138 | softVegetation: 1 139 | realtimeReflectionProbes: 1 140 | billboardsFaceCameraPosition: 1 141 | vSyncCount: 1 142 | lodBias: 1.5 143 | maximumLODLevel: 0 144 | particleRaycastBudget: 1024 145 | asyncUploadTimeSlice: 2 146 | asyncUploadBufferSize: 16 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Ultra 151 | pixelLightCount: 4 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 4 156 | shadowDistance: 150 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 1 164 | antiAliasing: 4 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 2 171 | maximumLODLevel: 0 172 | particleRaycastBudget: 4096 173 | asyncUploadTimeSlice: 2 174 | asyncUploadBufferSize: 16 175 | resolutionScalingFixedDPIFactor: 1 176 | excludedTargetPlatforms: [] 177 | m_PerPlatformDefaultQuality: 178 | Android: 2 179 | Nintendo 3DS: 5 180 | Nintendo Switch: 5 181 | PS4: 5 182 | PSP2: 2 183 | Standalone: 5 184 | Tizen: 2 185 | WebGL: 3 186 | WiiU: 5 187 | Windows Store Apps: 5 188 | XboxOne: 5 189 | iPhone: 2 190 | tvOS: 2 191 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /Assets/Script/RichImage.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | 7 | using HuaHua; 8 | 9 | namespace UnityEngine.UI 10 | { 11 | [ExecuteInEditMode] 12 | public class RichImage : Image 13 | { 14 | [System.NonSerialized] 15 | private static readonly VertexHelper s_VertexHelper = new VertexHelper(); 16 | 17 | internal static readonly HideFlags MeshHideflags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.HideInInspector; 18 | 19 | [SerializeField] 20 | public ERichTextMode m_UiMode = ERichTextMode.ERTM_MergeText; 21 | 22 | [System.NonSerialized] 23 | private Mesh m_mesh; 24 | 25 | [System.NonSerialized] 26 | private Vector3 m_lastPosition; 27 | 28 | [System.NonSerialized] 29 | private Quaternion m_lastRotation; 30 | 31 | [System.NonSerialized] 32 | private Vector3 m_lastScale; 33 | 34 | public Mesh Mesh() 35 | { 36 | return m_mesh; 37 | } 38 | 39 | protected override void UpdateGeometry() 40 | { 41 | if (m_UiMode == ERichTextMode.ERTM_UI) 42 | { 43 | base.UpdateGeometry(); 44 | } 45 | else if (m_UiMode == ERichTextMode.ERTM_MergeText) 46 | { 47 | if (m_mesh == null) 48 | { 49 | m_mesh = new Mesh(); 50 | m_mesh.MarkDynamic(); 51 | m_mesh.hideFlags = MeshHideflags; 52 | } 53 | 54 | DoMeshGeneration3D(); 55 | 56 | var render = transform.GetComponentInParent(); 57 | if (render) 58 | { 59 | render.MarkDirty(); 60 | } 61 | } 62 | } 63 | 64 | private void DoMeshGeneration3D() 65 | { 66 | if (rectTransform != null && rectTransform.rect.width >= 0 && rectTransform.rect.height >= 0) 67 | { 68 | OnPopulateMesh3D(s_VertexHelper); 69 | } 70 | else 71 | { 72 | s_VertexHelper.Clear(); // clear the vertex helper so invalid graphics dont draw. 73 | } 74 | 75 | var components = ListPool.Get(); 76 | GetComponents(typeof(IMeshModifier), components); 77 | 78 | for (var i = 0; i < components.Count; i++) 79 | { 80 | ((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper); 81 | } 82 | 83 | ListPool.Release(components); 84 | 85 | s_VertexHelper.FillMesh(m_mesh); 86 | } 87 | 88 | private void setSpriteVertex(ref UIVertex v, Vector3 position, Vector2 uv0) 89 | { 90 | v.position = position; 91 | v.uv0 = uv0; 92 | v.uv1 = new Vector2(0, 1.0f); 93 | v.color = this.color.linear; 94 | } 95 | 96 | private void GenerateSimpleSprite(VertexHelper toFill) 97 | { 98 | var tagSize = rectTransform.sizeDelta; 99 | 100 | var texture = sprite.texture; 101 | var textureWidthInv = 1.0f / texture.width; 102 | var textureHeightInv = 1.0f / texture.height; 103 | var uvRect = sprite.textureRect; 104 | uvRect = new Rect(uvRect.x * textureWidthInv, uvRect.y * textureHeightInv, uvRect.width * textureWidthInv, uvRect.height * textureHeightInv); 105 | 106 | UIVertex[] v = new UIVertex[4]; 107 | for (int i = 0; i < 4; ++i) 108 | { 109 | v[i] = new UIVertex(); 110 | } 111 | 112 | Vector3 orgPos = Vector3.zero; 113 | orgPos.x -= rectTransform.pivot.x * tagSize.x; 114 | orgPos.y -= rectTransform.pivot.y * tagSize.y; 115 | 116 | // pos = (0, 0) 117 | var position = orgPos; 118 | var uv0 = new Vector2(uvRect.x, uvRect.y); 119 | setSpriteVertex(ref v[0], position, uv0); 120 | 121 | // pos = (1, 0) 122 | position = new Vector3(tagSize.x * fillAmount, 0, 0) + orgPos; 123 | uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y); 124 | setSpriteVertex(ref v[1], position, uv0); 125 | 126 | // pos = (1, 1) 127 | position = new Vector3(tagSize.x * fillAmount, tagSize.y, 0) + orgPos; 128 | uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y + uvRect.height); 129 | setSpriteVertex(ref v[2], position, uv0); 130 | 131 | // pos = (0, 1) 132 | position = new Vector3(0, tagSize.y, 0) + orgPos; 133 | uv0 = new Vector2(uvRect.x, uvRect.y + uvRect.height); 134 | setSpriteVertex(ref v[3], position, uv0); 135 | 136 | toFill.AddUIVertexQuad(v); 137 | } 138 | 139 | static readonly Vector2[] s_VertScratch = new Vector2[4]; 140 | static readonly Vector2[] s_UVScratch = new Vector2[4]; 141 | 142 | private void addSpriteQuad(VertexHelper toFill, int startIndex, Vector2 posMin, Vector2 posMax, Vector2 uvMin, Vector2 uvMax) 143 | { 144 | UIVertex[] v = new UIVertex[4]; 145 | for (int i = 0; i < 4; ++i) 146 | { 147 | v[i] = new UIVertex(); 148 | } 149 | 150 | setSpriteVertex(ref v[0], new Vector3(posMin.x, posMin.y, 0), new Vector2(uvMin.x, uvMin.y)); 151 | setSpriteVertex(ref v[1], new Vector3(posMin.x, posMax.y, 0), new Vector2(uvMin.x, uvMax.y)); 152 | setSpriteVertex(ref v[2], new Vector3(posMax.x, posMax.y, 0), new Vector2(uvMax.x, uvMax.y)); 153 | setSpriteVertex(ref v[3], new Vector3(posMax.x, posMin.y, 0), new Vector2(uvMax.x, uvMin.y)); 154 | 155 | toFill.AddUIVertexQuad(v); 156 | } 157 | 158 | private void GenerateSlicedSprite(VertexHelper toFill) 159 | { 160 | var tagSize = rectTransform.sizeDelta; 161 | 162 | Vector4 border = sprite.border; 163 | Vector4 adjustedBorders = border; 164 | 165 | Vector4 outer, inner; 166 | 167 | outer = Sprites.DataUtility.GetOuterUV(sprite); 168 | inner = Sprites.DataUtility.GetInnerUV(sprite); 169 | 170 | Vector2 orgPos = Vector2.zero; 171 | orgPos.x -= rectTransform.pivot.x * tagSize.x; 172 | orgPos.y -= rectTransform.pivot.y * tagSize.y; 173 | 174 | var length = Mathf.Max(tagSize.x * fillAmount - adjustedBorders.z, 0); 175 | s_VertScratch[0] = orgPos; 176 | s_VertScratch[3] = new Vector2(tagSize.x * fillAmount, tagSize.y) + orgPos; 177 | 178 | s_VertScratch[1].x = Mathf.Min(adjustedBorders.x, length); 179 | s_VertScratch[1].y = adjustedBorders.y; 180 | s_VertScratch[1] += orgPos; 181 | 182 | s_VertScratch[2].x = length; 183 | s_VertScratch[2].y = tagSize.y - adjustedBorders.w; 184 | s_VertScratch[2] += orgPos; 185 | 186 | s_UVScratch[0] = new Vector2(outer.x, outer.y); 187 | s_UVScratch[1] = new Vector2(inner.x, inner.y); 188 | s_UVScratch[2] = new Vector2(inner.z, inner.w); 189 | s_UVScratch[3] = new Vector2(outer.z, outer.w); 190 | 191 | int vertexCount = 0; 192 | for (int x = 0; x < 3; ++x) 193 | { 194 | int x2 = x + 1; 195 | 196 | for (int y = 0; y < 3; ++y) 197 | { 198 | int y2 = y + 1; 199 | 200 | addSpriteQuad(toFill, 201 | vertexCount, 202 | new Vector2(s_VertScratch[x].x, s_VertScratch[y].y), 203 | new Vector2(s_VertScratch[x2].x, s_VertScratch[y2].y), 204 | new Vector2(s_UVScratch[x].x, s_UVScratch[y].y), 205 | new Vector2(s_UVScratch[x2].x, s_UVScratch[y2].y)); 206 | 207 | vertexCount += 4; 208 | } 209 | } 210 | } 211 | 212 | protected void OnPopulateMesh3D(VertexHelper toFill) 213 | { 214 | toFill.Clear(); 215 | 216 | if (overrideSprite == null) 217 | { 218 | return; 219 | } 220 | 221 | switch (type) 222 | { 223 | case Type.Simple: 224 | GenerateSimpleSprite(toFill); 225 | break; 226 | case Type.Sliced: 227 | GenerateSlicedSprite(toFill); 228 | break; 229 | } 230 | } 231 | 232 | private void LateUpdate() 233 | { 234 | if (rectTransform.hasChanged) 235 | { 236 | rectTransform.hasChanged = false; 237 | 238 | if (m_UiMode == ERichTextMode.ERTM_MergeText) 239 | { 240 | var lastPosition = transform.localPosition; 241 | var lastRotation = transform.localRotation; 242 | var lastScale = transform.localScale; 243 | if (m_lastPosition != lastPosition || m_lastRotation != lastRotation || m_lastScale != lastScale) 244 | { 245 | m_lastPosition = lastPosition; 246 | m_lastRotation = lastRotation; 247 | m_lastScale = lastScale; 248 | SetVerticesDirty(); 249 | } 250 | } 251 | else 252 | { 253 | SetVerticesDirty(); 254 | } 255 | } 256 | } 257 | 258 | protected override void OnDisable() 259 | { 260 | base.OnDisable(); 261 | 262 | if (m_UiMode == ERichTextMode.ERTM_MergeText) 263 | { 264 | var render = transform.GetComponentInParent(); 265 | if (render) 266 | { 267 | render.MarkDirty(); 268 | } 269 | } 270 | } 271 | } 272 | } -------------------------------------------------------------------------------- /Assets/Editor/RichImageEditor.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UnityEngine; 3 | using UnityEditor.AnimatedValues; 4 | using UnityEngine.UI; 5 | 6 | namespace UnityEditor.UI 7 | { 8 | /// 9 | /// PropertyDrawer for [[SpriteState]]. 10 | /// This is a PropertyDrawer for SpriteState it is implemented using the standard unity PropertyDrawer framework. 11 | /// 12 | internal class SpriteDrawUtility 13 | { 14 | static Texture2D s_ContrastTex; 15 | 16 | // Returns a usable texture that looks like a high-contrast checker board. 17 | static Texture2D contrastTexture 18 | { 19 | get 20 | { 21 | if (s_ContrastTex == null) 22 | s_ContrastTex = CreateCheckerTex( 23 | new Color(0f, 0.0f, 0f, 0.5f), 24 | new Color(1f, 1f, 1f, 0.5f)); 25 | return s_ContrastTex; 26 | } 27 | } 28 | 29 | // Create a checker-background texture. 30 | static Texture2D CreateCheckerTex(Color c0, Color c1) 31 | { 32 | Texture2D tex = new Texture2D(16, 16); 33 | tex.name = "[Generated] Checker Texture"; 34 | tex.hideFlags = HideFlags.DontSave; 35 | 36 | for (int y = 0; y < 8; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c1); 37 | for (int y = 8; y < 16; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c0); 38 | for (int y = 0; y < 8; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c0); 39 | for (int y = 8; y < 16; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c1); 40 | 41 | tex.Apply(); 42 | tex.filterMode = FilterMode.Point; 43 | return tex; 44 | } 45 | 46 | // Create a gradient texture. 47 | static Texture2D CreateGradientTex() 48 | { 49 | Texture2D tex = new Texture2D(1, 16); 50 | tex.name = "[Generated] Gradient Texture"; 51 | tex.hideFlags = HideFlags.DontSave; 52 | 53 | Color c0 = new Color(1f, 1f, 1f, 0f); 54 | Color c1 = new Color(1f, 1f, 1f, 0.4f); 55 | 56 | for (int i = 0; i < 16; ++i) 57 | { 58 | float f = Mathf.Abs((i / 15f) * 2f - 1f); 59 | f *= f; 60 | tex.SetPixel(0, i, Color.Lerp(c0, c1, f)); 61 | } 62 | 63 | tex.Apply(); 64 | tex.filterMode = FilterMode.Bilinear; 65 | return tex; 66 | } 67 | 68 | // Draws the tiled texture. Like GUI.DrawTexture() but tiled instead of stretched. 69 | static void DrawTiledTexture(Rect rect, Texture tex) 70 | { 71 | float u = rect.width / tex.width; 72 | float v = rect.height / tex.height; 73 | 74 | Rect texCoords = new Rect(0, 0, u, v); 75 | TextureWrapMode originalMode = tex.wrapMode; 76 | tex.wrapMode = TextureWrapMode.Repeat; 77 | GUI.DrawTextureWithTexCoords(rect, tex, texCoords); 78 | tex.wrapMode = originalMode; 79 | } 80 | 81 | // Draw the specified Image. 82 | public static void DrawSprite(Sprite sprite, Rect drawArea, Color color) 83 | { 84 | if (sprite == null) 85 | return; 86 | 87 | Texture2D tex = sprite.texture; 88 | if (tex == null) 89 | return; 90 | 91 | Rect outer = sprite.rect; 92 | Rect inner = outer; 93 | inner.xMin += sprite.border.x; 94 | inner.yMin += sprite.border.y; 95 | inner.xMax -= sprite.border.z; 96 | inner.yMax -= sprite.border.w; 97 | 98 | Vector4 uv4 = UnityEngine.Sprites.DataUtility.GetOuterUV(sprite); 99 | Rect uv = new Rect(uv4.x, uv4.y, uv4.z - uv4.x, uv4.w - uv4.y); 100 | Vector4 padding = UnityEngine.Sprites.DataUtility.GetPadding(sprite); 101 | padding.x /= outer.width; 102 | padding.y /= outer.height; 103 | padding.z /= outer.width; 104 | padding.w /= outer.height; 105 | 106 | DrawSprite(tex, drawArea, padding, outer, inner, uv, color, null); 107 | } 108 | 109 | // Draw the specified Image. 110 | public static void DrawSprite(Texture tex, Rect drawArea, Rect outer, Rect uv, Color color) 111 | { 112 | DrawSprite(tex, drawArea, Vector4.zero, outer, outer, uv, color, null); 113 | } 114 | 115 | // Draw the specified Image. 116 | private static void DrawSprite(Texture tex, Rect drawArea, Vector4 padding, Rect outer, Rect inner, Rect uv, Color color, Material mat) 117 | { 118 | // Create the texture rectangle that is centered inside rect. 119 | Rect outerRect = drawArea; 120 | outerRect.width = Mathf.Abs(outer.width); 121 | outerRect.height = Mathf.Abs(outer.height); 122 | 123 | if (outerRect.width > 0f) 124 | { 125 | float f = drawArea.width / outerRect.width; 126 | outerRect.width *= f; 127 | outerRect.height *= f; 128 | } 129 | 130 | if (drawArea.height > outerRect.height) 131 | { 132 | outerRect.y += (drawArea.height - outerRect.height) * 0.5f; 133 | } 134 | else if (outerRect.height > drawArea.height) 135 | { 136 | float f = drawArea.height / outerRect.height; 137 | outerRect.width *= f; 138 | outerRect.height *= f; 139 | } 140 | 141 | if (drawArea.width > outerRect.width) 142 | outerRect.x += (drawArea.width - outerRect.width) * 0.5f; 143 | 144 | // Draw the background 145 | EditorGUI.DrawTextureTransparent(outerRect, null, ScaleMode.ScaleToFit, outer.width / outer.height); 146 | 147 | // Draw the Image 148 | GUI.color = color; 149 | 150 | Rect paddedTexArea = new Rect( 151 | outerRect.x + outerRect.width * padding.x, 152 | outerRect.y + outerRect.height * padding.w, 153 | outerRect.width - (outerRect.width * (padding.z + padding.x)), 154 | outerRect.height - (outerRect.height * (padding.w + padding.y)) 155 | ); 156 | 157 | if (mat == null) 158 | { 159 | GUI.DrawTextureWithTexCoords(paddedTexArea, tex, uv, true); 160 | } 161 | else 162 | { 163 | // NOTE: There is an issue in Unity that prevents it from clipping the drawn preview 164 | // using BeginGroup/EndGroup, and there is no way to specify a UV rect... 165 | EditorGUI.DrawPreviewTexture(paddedTexArea, tex, mat); 166 | } 167 | 168 | // Draw the border indicator lines 169 | GUI.BeginGroup(outerRect); 170 | { 171 | tex = contrastTexture; 172 | GUI.color = Color.white; 173 | 174 | if (inner.xMin != outer.xMin) 175 | { 176 | float x = (inner.xMin - outer.xMin) / outer.width * outerRect.width - 1; 177 | DrawTiledTexture(new Rect(x, 0f, 1f, outerRect.height), tex); 178 | } 179 | 180 | if (inner.xMax != outer.xMax) 181 | { 182 | float x = (inner.xMax - outer.xMin) / outer.width * outerRect.width - 1; 183 | DrawTiledTexture(new Rect(x, 0f, 1f, outerRect.height), tex); 184 | } 185 | 186 | if (inner.yMin != outer.yMin) 187 | { 188 | // GUI.DrawTexture is top-left based rather than bottom-left 189 | float y = (inner.yMin - outer.yMin) / outer.height * outerRect.height - 1; 190 | DrawTiledTexture(new Rect(0f, outerRect.height - y, outerRect.width, 1f), tex); 191 | } 192 | 193 | if (inner.yMax != outer.yMax) 194 | { 195 | float y = (inner.yMax - outer.yMin) / outer.height * outerRect.height - 1; 196 | DrawTiledTexture(new Rect(0f, outerRect.height - y, outerRect.width, 1f), tex); 197 | } 198 | } 199 | 200 | GUI.EndGroup(); 201 | } 202 | } 203 | 204 | /// 205 | /// Editor class used to edit UI Sprites. 206 | /// 207 | 208 | [CustomEditor(typeof(RichImage), true)] 209 | [CanEditMultipleObjects] 210 | /// 211 | /// Custom Editor for the Image Component. 212 | /// Extend this class to write a custom editor for an Image-derived component. 213 | /// 214 | public class RichImageEditor : GraphicEditor 215 | { 216 | SerializedProperty m_FillMethod; 217 | SerializedProperty m_FillOrigin; 218 | SerializedProperty m_FillAmount; 219 | SerializedProperty m_FillClockwise; 220 | SerializedProperty m_Type; 221 | SerializedProperty m_FillCenter; 222 | SerializedProperty m_Sprite; 223 | SerializedProperty m_PreserveAspect; 224 | SerializedProperty m_UseSpriteMesh; 225 | SerializedProperty m_UiMode; 226 | GUIContent m_SpriteContent; 227 | GUIContent m_SpriteTypeContent; 228 | GUIContent m_ClockwiseContent; 229 | AnimBool m_ShowSlicedOrTiled; 230 | AnimBool m_ShowSliced; 231 | AnimBool m_ShowTiled; 232 | AnimBool m_ShowFilled; 233 | AnimBool m_ShowType; 234 | 235 | protected override void OnEnable() 236 | { 237 | base.OnEnable(); 238 | 239 | m_SpriteContent = EditorGUIUtility.TrTextContent("Source Image"); 240 | m_SpriteTypeContent = EditorGUIUtility.TrTextContent("Image Type"); 241 | m_ClockwiseContent = EditorGUIUtility.TrTextContent("Clockwise"); 242 | 243 | m_Sprite = serializedObject.FindProperty("m_Sprite"); 244 | m_Type = serializedObject.FindProperty("m_Type"); 245 | m_FillCenter = serializedObject.FindProperty("m_FillCenter"); 246 | m_FillMethod = serializedObject.FindProperty("m_FillMethod"); 247 | m_FillOrigin = serializedObject.FindProperty("m_FillOrigin"); 248 | m_FillClockwise = serializedObject.FindProperty("m_FillClockwise"); 249 | m_FillAmount = serializedObject.FindProperty("m_FillAmount"); 250 | m_PreserveAspect = serializedObject.FindProperty("m_PreserveAspect"); 251 | m_UseSpriteMesh = serializedObject.FindProperty("m_UseSpriteMesh"); 252 | m_UiMode = serializedObject.FindProperty("m_UiMode"); 253 | 254 | m_ShowType = new AnimBool(m_Sprite.objectReferenceValue != null); 255 | m_ShowType.valueChanged.AddListener(Repaint); 256 | 257 | var typeEnum = (Image.Type)m_Type.enumValueIndex; 258 | 259 | m_ShowSlicedOrTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); 260 | m_ShowSliced = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); 261 | m_ShowTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); 262 | m_ShowFilled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); 263 | m_ShowSlicedOrTiled.valueChanged.AddListener(Repaint); 264 | m_ShowSliced.valueChanged.AddListener(Repaint); 265 | m_ShowTiled.valueChanged.AddListener(Repaint); 266 | m_ShowFilled.valueChanged.AddListener(Repaint); 267 | 268 | SetShowNativeSize(true); 269 | } 270 | 271 | protected override void OnDisable() 272 | { 273 | m_ShowType.valueChanged.RemoveListener(Repaint); 274 | m_ShowSlicedOrTiled.valueChanged.RemoveListener(Repaint); 275 | m_ShowSliced.valueChanged.RemoveListener(Repaint); 276 | m_ShowTiled.valueChanged.RemoveListener(Repaint); 277 | m_ShowFilled.valueChanged.RemoveListener(Repaint); 278 | } 279 | 280 | public override void OnInspectorGUI() 281 | { 282 | serializedObject.Update(); 283 | 284 | SpriteGUI(); 285 | AppearanceControlsGUI(); 286 | RaycastControlsGUI(); 287 | 288 | m_ShowType.target = m_Sprite.objectReferenceValue != null; 289 | if (EditorGUILayout.BeginFadeGroup(m_ShowType.faded)) 290 | TypeGUI(); 291 | EditorGUILayout.EndFadeGroup(); 292 | 293 | SetShowNativeSize(false); 294 | if (EditorGUILayout.BeginFadeGroup(m_ShowNativeSize.faded)) 295 | { 296 | EditorGUI.indentLevel++; 297 | 298 | if ((Image.Type)m_Type.enumValueIndex == Image.Type.Simple) 299 | EditorGUILayout.PropertyField(m_UseSpriteMesh); 300 | 301 | EditorGUILayout.PropertyField(m_PreserveAspect); 302 | EditorGUI.indentLevel--; 303 | } 304 | EditorGUILayout.EndFadeGroup(); 305 | NativeSizeButtonGUI(); 306 | 307 | EditorGUILayout.PropertyField(m_UiMode); 308 | 309 | serializedObject.ApplyModifiedProperties(); 310 | } 311 | 312 | void SetShowNativeSize(bool instant) 313 | { 314 | Image.Type type = (Image.Type)m_Type.enumValueIndex; 315 | bool showNativeSize = (type == Image.Type.Simple || type == Image.Type.Filled) && m_Sprite.objectReferenceValue != null; 316 | base.SetShowNativeSize(showNativeSize, instant); 317 | } 318 | 319 | /// 320 | /// Draw the atlas and Image selection fields. 321 | /// 322 | 323 | protected void SpriteGUI() 324 | { 325 | EditorGUI.BeginChangeCheck(); 326 | EditorGUILayout.PropertyField(m_Sprite, m_SpriteContent); 327 | if (EditorGUI.EndChangeCheck()) 328 | { 329 | var newSprite = m_Sprite.objectReferenceValue as Sprite; 330 | if (newSprite) 331 | { 332 | Image.Type oldType = (Image.Type)m_Type.enumValueIndex; 333 | if (newSprite.border.SqrMagnitude() > 0) 334 | { 335 | m_Type.enumValueIndex = (int)Image.Type.Sliced; 336 | } 337 | else if (oldType == Image.Type.Sliced) 338 | { 339 | m_Type.enumValueIndex = (int)Image.Type.Simple; 340 | } 341 | } 342 | } 343 | } 344 | 345 | /// 346 | /// Sprites's custom properties based on the type. 347 | /// 348 | 349 | protected void TypeGUI() 350 | { 351 | EditorGUILayout.PropertyField(m_Type, m_SpriteTypeContent); 352 | 353 | ++EditorGUI.indentLevel; 354 | { 355 | Image.Type typeEnum = (Image.Type)m_Type.enumValueIndex; 356 | 357 | bool showSlicedOrTiled = (!m_Type.hasMultipleDifferentValues && (typeEnum == Image.Type.Sliced || typeEnum == Image.Type.Tiled)); 358 | if (showSlicedOrTiled && targets.Length > 1) 359 | showSlicedOrTiled = targets.Select(obj => obj as Image).All(img => img.hasBorder); 360 | 361 | m_ShowSlicedOrTiled.target = showSlicedOrTiled; 362 | m_ShowSliced.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); 363 | m_ShowTiled.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); 364 | m_ShowFilled.target = (!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); 365 | 366 | Image image = target as Image; 367 | if (EditorGUILayout.BeginFadeGroup(m_ShowSlicedOrTiled.faded)) 368 | { 369 | if (image.hasBorder) 370 | EditorGUILayout.PropertyField(m_FillCenter); 371 | } 372 | EditorGUILayout.EndFadeGroup(); 373 | 374 | if (EditorGUILayout.BeginFadeGroup(m_ShowSliced.faded)) 375 | { 376 | if (image.sprite != null && !image.hasBorder) 377 | EditorGUILayout.HelpBox("This Image doesn't have a border.", MessageType.Warning); 378 | } 379 | EditorGUILayout.EndFadeGroup(); 380 | 381 | if (EditorGUILayout.BeginFadeGroup(m_ShowTiled.faded)) 382 | { 383 | if (image.sprite != null && !image.hasBorder && (image.sprite.texture.wrapMode != TextureWrapMode.Repeat || image.sprite.packed)) 384 | EditorGUILayout.HelpBox("It looks like you want to tile a sprite with no border. It would be more efficient to modify the Sprite properties, clear the Packing tag and set the Wrap mode to Repeat.", MessageType.Warning); 385 | } 386 | EditorGUILayout.EndFadeGroup(); 387 | 388 | if (EditorGUILayout.BeginFadeGroup(m_ShowFilled.faded)) 389 | { 390 | EditorGUI.BeginChangeCheck(); 391 | EditorGUILayout.PropertyField(m_FillMethod); 392 | if (EditorGUI.EndChangeCheck()) 393 | { 394 | m_FillOrigin.intValue = 0; 395 | } 396 | switch ((Image.FillMethod)m_FillMethod.enumValueIndex) 397 | { 398 | case Image.FillMethod.Horizontal: 399 | m_FillOrigin.intValue = (int)(Image.OriginHorizontal)EditorGUILayout.EnumPopup("Fill Origin", (Image.OriginHorizontal)m_FillOrigin.intValue); 400 | break; 401 | case Image.FillMethod.Vertical: 402 | m_FillOrigin.intValue = (int)(Image.OriginVertical)EditorGUILayout.EnumPopup("Fill Origin", (Image.OriginVertical)m_FillOrigin.intValue); 403 | break; 404 | case Image.FillMethod.Radial90: 405 | m_FillOrigin.intValue = (int)(Image.Origin90)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin90)m_FillOrigin.intValue); 406 | break; 407 | case Image.FillMethod.Radial180: 408 | m_FillOrigin.intValue = (int)(Image.Origin180)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin180)m_FillOrigin.intValue); 409 | break; 410 | case Image.FillMethod.Radial360: 411 | m_FillOrigin.intValue = (int)(Image.Origin360)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin360)m_FillOrigin.intValue); 412 | break; 413 | } 414 | } 415 | EditorGUILayout.EndFadeGroup(); 416 | 417 | EditorGUILayout.PropertyField(m_FillAmount); 418 | if ((Image.FillMethod)m_FillMethod.enumValueIndex > Image.FillMethod.Vertical) 419 | { 420 | EditorGUILayout.PropertyField(m_FillClockwise, m_ClockwiseContent); 421 | } 422 | } 423 | --EditorGUI.indentLevel; 424 | } 425 | 426 | /// 427 | /// A string containing the Image details to be used as a overlay on the component Preview. 428 | /// 429 | /// 430 | /// The Image details. 431 | /// 432 | 433 | public override string GetInfoString() 434 | { 435 | Image image = target as Image; 436 | Sprite sprite = image.sprite; 437 | 438 | int x = (sprite != null) ? Mathf.RoundToInt(sprite.rect.width) : 0; 439 | int y = (sprite != null) ? Mathf.RoundToInt(sprite.rect.height) : 0; 440 | 441 | return string.Format("Image Size: {0}x{1}", x, y); 442 | } 443 | } 444 | } 445 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 18 7 | productGUID: 50d95b9890e666844895964393f9ab27 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: RichText2 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 53 | iosShowActivityIndicatorOnLoading: -1 54 | androidShowActivityIndicatorOnLoading: -1 55 | displayResolutionDialog: 1 56 | iosUseCustomAppBackgroundBehavior: 0 57 | iosAllowHTTPDownload: 1 58 | allowedAutorotateToPortrait: 1 59 | allowedAutorotateToPortraitUpsideDown: 1 60 | allowedAutorotateToLandscapeRight: 1 61 | allowedAutorotateToLandscapeLeft: 1 62 | useOSAutorotation: 1 63 | use32BitDisplayBuffer: 1 64 | preserveFramebufferAlpha: 0 65 | disableDepthAndStencilBuffers: 0 66 | androidStartInFullscreen: 1 67 | androidRenderOutsideSafeArea: 0 68 | androidBlitType: 0 69 | defaultIsNativeResolution: 1 70 | macRetinaSupport: 1 71 | runInBackground: 1 72 | captureSingleScreen: 0 73 | muteOtherAudioSources: 0 74 | Prepare IOS For Recording: 0 75 | Force IOS Speakers When Recording: 0 76 | deferSystemGesturesMode: 0 77 | hideHomeButton: 0 78 | submitAnalytics: 1 79 | usePlayerLog: 1 80 | bakeCollisionMeshes: 0 81 | forceSingleInstance: 0 82 | resizableWindow: 0 83 | useMacAppStoreValidation: 0 84 | macAppStoreCategory: public.app-category.games 85 | gpuSkinning: 1 86 | graphicsJobs: 0 87 | xboxPIXTextureCapture: 0 88 | xboxEnableAvatar: 0 89 | xboxEnableKinect: 0 90 | xboxEnableKinectAutoTracking: 0 91 | xboxEnableFitness: 0 92 | visibleInBackground: 1 93 | allowFullscreenSwitch: 1 94 | graphicsJobMode: 0 95 | fullscreenMode: 1 96 | xboxSpeechDB: 0 97 | xboxEnableHeadOrientation: 0 98 | xboxEnableGuest: 0 99 | xboxEnablePIXSampling: 0 100 | metalFramebufferOnly: 0 101 | xboxOneResolution: 0 102 | xboxOneSResolution: 0 103 | xboxOneXResolution: 3 104 | xboxOneMonoLoggingLevel: 0 105 | xboxOneLoggingLevel: 1 106 | xboxOneDisableEsram: 0 107 | xboxOnePresentImmediateThreshold: 0 108 | switchQueueCommandMemory: 0 109 | switchQueueControlMemory: 16384 110 | switchQueueComputeMemory: 262144 111 | switchNVNShaderPoolsGranularity: 33554432 112 | switchNVNDefaultPoolsGranularity: 16777216 113 | switchNVNOtherPoolsGranularity: 16777216 114 | vulkanEnableSetSRGBWrite: 0 115 | m_SupportedAspectRatios: 116 | 4:3: 1 117 | 5:4: 1 118 | 16:10: 1 119 | 16:9: 1 120 | Others: 1 121 | bundleVersion: 0.1 122 | preloadedAssets: [] 123 | metroInputSource: 0 124 | wsaTransparentSwapchain: 0 125 | m_HolographicPauseOnTrackingLoss: 1 126 | xboxOneDisableKinectGpuReservation: 1 127 | xboxOneEnable7thCore: 1 128 | isWsaHolographicRemotingEnabled: 0 129 | vrSettings: 130 | cardboard: 131 | depthFormat: 0 132 | enableTransitionView: 0 133 | daydream: 134 | depthFormat: 0 135 | useSustainedPerformanceMode: 0 136 | enableVideoLayer: 0 137 | useProtectedVideoMemory: 0 138 | minimumSupportedHeadTracking: 0 139 | maximumSupportedHeadTracking: 1 140 | hololens: 141 | depthFormat: 1 142 | depthBufferSharingEnabled: 1 143 | oculus: 144 | sharedDepthBuffer: 1 145 | dashSupport: 1 146 | lowOverheadMode: 0 147 | protectedContext: 0 148 | v2Signing: 0 149 | enable360StereoCapture: 0 150 | protectGraphicsMemory: 0 151 | enableFrameTimingStats: 0 152 | useHDRDisplay: 0 153 | m_ColorGamuts: 00000000 154 | targetPixelDensity: 30 155 | resolutionScalingMode: 0 156 | androidSupportedAspectRatio: 1 157 | androidMaxAspectRatio: 2.1 158 | applicationIdentifier: {} 159 | buildNumber: {} 160 | AndroidBundleVersionCode: 1 161 | AndroidMinSdkVersion: 16 162 | AndroidTargetSdkVersion: 0 163 | AndroidPreferredInstallLocation: 1 164 | aotOptions: 165 | stripEngineCode: 1 166 | iPhoneStrippingLevel: 0 167 | iPhoneScriptCallOptimization: 0 168 | ForceInternetPermission: 0 169 | ForceSDCardPermission: 0 170 | CreateWallpaper: 0 171 | APKExpansionFiles: 0 172 | keepLoadedShadersAlive: 0 173 | StripUnusedMeshComponents: 1 174 | VertexChannelCompressionMask: 4054 175 | iPhoneSdkVersion: 988 176 | iOSTargetOSVersionString: 9.0 177 | tvOSSdkVersion: 0 178 | tvOSRequireExtendedGameController: 0 179 | tvOSTargetOSVersionString: 9.0 180 | uIPrerenderedIcon: 0 181 | uIRequiresPersistentWiFi: 0 182 | uIRequiresFullScreen: 1 183 | uIStatusBarHidden: 1 184 | uIExitOnSuspend: 0 185 | uIStatusBarStyle: 0 186 | iPhoneSplashScreen: {fileID: 0} 187 | iPhoneHighResSplashScreen: {fileID: 0} 188 | iPhoneTallHighResSplashScreen: {fileID: 0} 189 | iPhone47inSplashScreen: {fileID: 0} 190 | iPhone55inPortraitSplashScreen: {fileID: 0} 191 | iPhone55inLandscapeSplashScreen: {fileID: 0} 192 | iPhone58inPortraitSplashScreen: {fileID: 0} 193 | iPhone58inLandscapeSplashScreen: {fileID: 0} 194 | iPadPortraitSplashScreen: {fileID: 0} 195 | iPadHighResPortraitSplashScreen: {fileID: 0} 196 | iPadLandscapeSplashScreen: {fileID: 0} 197 | iPadHighResLandscapeSplashScreen: {fileID: 0} 198 | appleTVSplashScreen: {fileID: 0} 199 | appleTVSplashScreen2x: {fileID: 0} 200 | tvOSSmallIconLayers: [] 201 | tvOSSmallIconLayers2x: [] 202 | tvOSLargeIconLayers: [] 203 | tvOSLargeIconLayers2x: [] 204 | tvOSTopShelfImageLayers: [] 205 | tvOSTopShelfImageLayers2x: [] 206 | tvOSTopShelfImageWideLayers: [] 207 | tvOSTopShelfImageWideLayers2x: [] 208 | iOSLaunchScreenType: 0 209 | iOSLaunchScreenPortrait: {fileID: 0} 210 | iOSLaunchScreenLandscape: {fileID: 0} 211 | iOSLaunchScreenBackgroundColor: 212 | serializedVersion: 2 213 | rgba: 0 214 | iOSLaunchScreenFillPct: 100 215 | iOSLaunchScreenSize: 100 216 | iOSLaunchScreenCustomXibPath: 217 | iOSLaunchScreeniPadType: 0 218 | iOSLaunchScreeniPadImage: {fileID: 0} 219 | iOSLaunchScreeniPadBackgroundColor: 220 | serializedVersion: 2 221 | rgba: 0 222 | iOSLaunchScreeniPadFillPct: 100 223 | iOSLaunchScreeniPadSize: 100 224 | iOSLaunchScreeniPadCustomXibPath: 225 | iOSUseLaunchScreenStoryboard: 0 226 | iOSLaunchScreenCustomStoryboardPath: 227 | iOSDeviceRequirements: [] 228 | iOSURLSchemes: [] 229 | iOSBackgroundModes: 0 230 | iOSMetalForceHardShadows: 0 231 | metalEditorSupport: 1 232 | metalAPIValidation: 1 233 | iOSRenderExtraFrameOnPause: 0 234 | appleDeveloperTeamID: 235 | iOSManualSigningProvisioningProfileID: 236 | tvOSManualSigningProvisioningProfileID: 237 | iOSManualSigningProvisioningProfileType: 0 238 | tvOSManualSigningProvisioningProfileType: 0 239 | appleEnableAutomaticSigning: 0 240 | iOSRequireARKit: 0 241 | iOSAutomaticallyDetectAndAddCapabilities: 1 242 | appleEnableProMotion: 0 243 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 244 | templatePackageId: com.unity.template.3d@1.3.0 245 | templateDefaultScene: Assets/Scenes/SampleScene.unity 246 | AndroidTargetArchitectures: 5 247 | AndroidSplashScreenScale: 0 248 | androidSplashScreen: {fileID: 0} 249 | AndroidKeystoreName: 250 | AndroidKeyaliasName: 251 | AndroidBuildApkPerCpuArchitecture: 0 252 | AndroidTVCompatibility: 1 253 | AndroidIsGame: 1 254 | AndroidEnableTango: 0 255 | androidEnableBanner: 1 256 | androidUseLowAccuracyLocation: 0 257 | m_AndroidBanners: 258 | - width: 320 259 | height: 180 260 | banner: {fileID: 0} 261 | androidGamepadSupportLevel: 0 262 | resolutionDialogBanner: {fileID: 0} 263 | m_BuildTargetIcons: [] 264 | m_BuildTargetPlatformIcons: [] 265 | m_BuildTargetBatching: 266 | - m_BuildTarget: Standalone 267 | m_StaticBatching: 1 268 | m_DynamicBatching: 1 269 | - m_BuildTarget: tvOS 270 | m_StaticBatching: 1 271 | m_DynamicBatching: 0 272 | - m_BuildTarget: Android 273 | m_StaticBatching: 1 274 | m_DynamicBatching: 0 275 | - m_BuildTarget: iPhone 276 | m_StaticBatching: 1 277 | m_DynamicBatching: 0 278 | - m_BuildTarget: WebGL 279 | m_StaticBatching: 0 280 | m_DynamicBatching: 0 281 | m_BuildTargetGraphicsAPIs: 282 | - m_BuildTarget: AndroidPlayer 283 | m_APIs: 0b00000008000000 284 | m_Automatic: 1 285 | - m_BuildTarget: iOSSupport 286 | m_APIs: 10000000 287 | m_Automatic: 1 288 | - m_BuildTarget: AppleTVSupport 289 | m_APIs: 10000000 290 | m_Automatic: 0 291 | - m_BuildTarget: WebGLSupport 292 | m_APIs: 0b000000 293 | m_Automatic: 1 294 | m_BuildTargetVRSettings: 295 | - m_BuildTarget: Standalone 296 | m_Enabled: 0 297 | m_Devices: 298 | - Oculus 299 | - OpenVR 300 | m_BuildTargetEnableVuforiaSettings: [] 301 | openGLRequireES31: 0 302 | openGLRequireES31AEP: 0 303 | m_TemplateCustomTags: {} 304 | mobileMTRendering: 305 | Android: 1 306 | iPhone: 1 307 | tvOS: 1 308 | m_BuildTargetGroupLightmapEncodingQuality: [] 309 | m_BuildTargetGroupLightmapSettings: [] 310 | playModeTestRunnerEnabled: 0 311 | runPlayModeTestAsEditModeTest: 0 312 | actionOnDotNetUnhandledException: 1 313 | enableInternalProfiler: 0 314 | logObjCUncaughtExceptions: 1 315 | enableCrashReportAPI: 0 316 | cameraUsageDescription: 317 | locationUsageDescription: 318 | microphoneUsageDescription: 319 | switchNetLibKey: 320 | switchSocketMemoryPoolSize: 6144 321 | switchSocketAllocatorPoolSize: 128 322 | switchSocketConcurrencyLimit: 14 323 | switchScreenResolutionBehavior: 2 324 | switchUseCPUProfiler: 0 325 | switchApplicationID: 0x01004b9000490000 326 | switchNSODependencies: 327 | switchTitleNames_0: 328 | switchTitleNames_1: 329 | switchTitleNames_2: 330 | switchTitleNames_3: 331 | switchTitleNames_4: 332 | switchTitleNames_5: 333 | switchTitleNames_6: 334 | switchTitleNames_7: 335 | switchTitleNames_8: 336 | switchTitleNames_9: 337 | switchTitleNames_10: 338 | switchTitleNames_11: 339 | switchTitleNames_12: 340 | switchTitleNames_13: 341 | switchTitleNames_14: 342 | switchPublisherNames_0: 343 | switchPublisherNames_1: 344 | switchPublisherNames_2: 345 | switchPublisherNames_3: 346 | switchPublisherNames_4: 347 | switchPublisherNames_5: 348 | switchPublisherNames_6: 349 | switchPublisherNames_7: 350 | switchPublisherNames_8: 351 | switchPublisherNames_9: 352 | switchPublisherNames_10: 353 | switchPublisherNames_11: 354 | switchPublisherNames_12: 355 | switchPublisherNames_13: 356 | switchPublisherNames_14: 357 | switchIcons_0: {fileID: 0} 358 | switchIcons_1: {fileID: 0} 359 | switchIcons_2: {fileID: 0} 360 | switchIcons_3: {fileID: 0} 361 | switchIcons_4: {fileID: 0} 362 | switchIcons_5: {fileID: 0} 363 | switchIcons_6: {fileID: 0} 364 | switchIcons_7: {fileID: 0} 365 | switchIcons_8: {fileID: 0} 366 | switchIcons_9: {fileID: 0} 367 | switchIcons_10: {fileID: 0} 368 | switchIcons_11: {fileID: 0} 369 | switchIcons_12: {fileID: 0} 370 | switchIcons_13: {fileID: 0} 371 | switchIcons_14: {fileID: 0} 372 | switchSmallIcons_0: {fileID: 0} 373 | switchSmallIcons_1: {fileID: 0} 374 | switchSmallIcons_2: {fileID: 0} 375 | switchSmallIcons_3: {fileID: 0} 376 | switchSmallIcons_4: {fileID: 0} 377 | switchSmallIcons_5: {fileID: 0} 378 | switchSmallIcons_6: {fileID: 0} 379 | switchSmallIcons_7: {fileID: 0} 380 | switchSmallIcons_8: {fileID: 0} 381 | switchSmallIcons_9: {fileID: 0} 382 | switchSmallIcons_10: {fileID: 0} 383 | switchSmallIcons_11: {fileID: 0} 384 | switchSmallIcons_12: {fileID: 0} 385 | switchSmallIcons_13: {fileID: 0} 386 | switchSmallIcons_14: {fileID: 0} 387 | switchManualHTML: 388 | switchAccessibleURLs: 389 | switchLegalInformation: 390 | switchMainThreadStackSize: 1048576 391 | switchPresenceGroupId: 392 | switchLogoHandling: 0 393 | switchReleaseVersion: 0 394 | switchDisplayVersion: 1.0.0 395 | switchStartupUserAccount: 0 396 | switchTouchScreenUsage: 0 397 | switchSupportedLanguagesMask: 0 398 | switchLogoType: 0 399 | switchApplicationErrorCodeCategory: 400 | switchUserAccountSaveDataSize: 0 401 | switchUserAccountSaveDataJournalSize: 0 402 | switchApplicationAttribute: 0 403 | switchCardSpecSize: -1 404 | switchCardSpecClock: -1 405 | switchRatingsMask: 0 406 | switchRatingsInt_0: 0 407 | switchRatingsInt_1: 0 408 | switchRatingsInt_2: 0 409 | switchRatingsInt_3: 0 410 | switchRatingsInt_4: 0 411 | switchRatingsInt_5: 0 412 | switchRatingsInt_6: 0 413 | switchRatingsInt_7: 0 414 | switchRatingsInt_8: 0 415 | switchRatingsInt_9: 0 416 | switchRatingsInt_10: 0 417 | switchRatingsInt_11: 0 418 | switchRatingsInt_12: 0 419 | switchLocalCommunicationIds_0: 420 | switchLocalCommunicationIds_1: 421 | switchLocalCommunicationIds_2: 422 | switchLocalCommunicationIds_3: 423 | switchLocalCommunicationIds_4: 424 | switchLocalCommunicationIds_5: 425 | switchLocalCommunicationIds_6: 426 | switchLocalCommunicationIds_7: 427 | switchParentalControl: 0 428 | switchAllowsScreenshot: 1 429 | switchAllowsVideoCapturing: 1 430 | switchAllowsRuntimeAddOnContentInstall: 0 431 | switchDataLossConfirmation: 0 432 | switchUserAccountLockEnabled: 0 433 | switchSystemResourceMemory: 16777216 434 | switchSupportedNpadStyles: 3 435 | switchNativeFsCacheSize: 32 436 | switchIsHoldTypeHorizontal: 0 437 | switchSupportedNpadCount: 8 438 | switchSocketConfigEnabled: 0 439 | switchTcpInitialSendBufferSize: 32 440 | switchTcpInitialReceiveBufferSize: 64 441 | switchTcpAutoSendBufferSizeMax: 256 442 | switchTcpAutoReceiveBufferSizeMax: 256 443 | switchUdpSendBufferSize: 9 444 | switchUdpReceiveBufferSize: 42 445 | switchSocketBufferEfficiency: 4 446 | switchSocketInitializeEnabled: 1 447 | switchNetworkInterfaceManagerInitializeEnabled: 1 448 | switchPlayerConnectionEnabled: 1 449 | ps4NPAgeRating: 12 450 | ps4NPTitleSecret: 451 | ps4NPTrophyPackPath: 452 | ps4ParentalLevel: 11 453 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 454 | ps4Category: 0 455 | ps4MasterVersion: 01.00 456 | ps4AppVersion: 01.00 457 | ps4AppType: 0 458 | ps4ParamSfxPath: 459 | ps4VideoOutPixelFormat: 0 460 | ps4VideoOutInitialWidth: 1920 461 | ps4VideoOutBaseModeInitialWidth: 1920 462 | ps4VideoOutReprojectionRate: 60 463 | ps4PronunciationXMLPath: 464 | ps4PronunciationSIGPath: 465 | ps4BackgroundImagePath: 466 | ps4StartupImagePath: 467 | ps4StartupImagesFolder: 468 | ps4IconImagesFolder: 469 | ps4SaveDataImagePath: 470 | ps4SdkOverride: 471 | ps4BGMPath: 472 | ps4ShareFilePath: 473 | ps4ShareOverlayImagePath: 474 | ps4PrivacyGuardImagePath: 475 | ps4NPtitleDatPath: 476 | ps4RemotePlayKeyAssignment: -1 477 | ps4RemotePlayKeyMappingDir: 478 | ps4PlayTogetherPlayerCount: 0 479 | ps4EnterButtonAssignment: 1 480 | ps4ApplicationParam1: 0 481 | ps4ApplicationParam2: 0 482 | ps4ApplicationParam3: 0 483 | ps4ApplicationParam4: 0 484 | ps4DownloadDataSize: 0 485 | ps4GarlicHeapSize: 2048 486 | ps4ProGarlicHeapSize: 2560 487 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 488 | ps4pnSessions: 1 489 | ps4pnPresence: 1 490 | ps4pnFriends: 1 491 | ps4pnGameCustomData: 1 492 | playerPrefsSupport: 0 493 | enableApplicationExit: 0 494 | resetTempFolder: 1 495 | restrictedAudioUsageRights: 0 496 | ps4UseResolutionFallback: 0 497 | ps4ReprojectionSupport: 0 498 | ps4UseAudio3dBackend: 0 499 | ps4SocialScreenEnabled: 0 500 | ps4ScriptOptimizationLevel: 0 501 | ps4Audio3dVirtualSpeakerCount: 14 502 | ps4attribCpuUsage: 0 503 | ps4PatchPkgPath: 504 | ps4PatchLatestPkgPath: 505 | ps4PatchChangeinfoPath: 506 | ps4PatchDayOne: 0 507 | ps4attribUserManagement: 0 508 | ps4attribMoveSupport: 0 509 | ps4attrib3DSupport: 0 510 | ps4attribShareSupport: 0 511 | ps4attribExclusiveVR: 0 512 | ps4disableAutoHideSplash: 0 513 | ps4videoRecordingFeaturesUsed: 0 514 | ps4contentSearchFeaturesUsed: 0 515 | ps4attribEyeToEyeDistanceSettingVR: 0 516 | ps4IncludedModules: [] 517 | monoEnv: 518 | splashScreenBackgroundSourceLandscape: {fileID: 0} 519 | splashScreenBackgroundSourcePortrait: {fileID: 0} 520 | spritePackerPolicy: 521 | webGLMemorySize: 256 522 | webGLExceptionSupport: 1 523 | webGLNameFilesAsHashes: 0 524 | webGLDataCaching: 1 525 | webGLDebugSymbols: 0 526 | webGLEmscriptenArgs: 527 | webGLModulesDirectory: 528 | webGLTemplate: APPLICATION:Default 529 | webGLAnalyzeBuildSize: 0 530 | webGLUseEmbeddedResources: 0 531 | webGLCompressionFormat: 1 532 | webGLLinkerTarget: 1 533 | webGLThreadsSupport: 0 534 | scriptingDefineSymbols: {} 535 | platformArchitecture: {} 536 | scriptingBackend: {} 537 | il2cppCompilerConfiguration: {} 538 | managedStrippingLevel: {} 539 | incrementalIl2cppBuild: {} 540 | allowUnsafeCode: 0 541 | additionalIl2CppArgs: 542 | scriptingRuntimeVersion: 1 543 | apiCompatibilityLevelPerPlatform: {} 544 | m_RenderingPath: 1 545 | m_MobileRenderingPath: 1 546 | metroPackageName: Template_3D 547 | metroPackageVersion: 548 | metroCertificatePath: 549 | metroCertificatePassword: 550 | metroCertificateSubject: 551 | metroCertificateIssuer: 552 | metroCertificateNotAfter: 0000000000000000 553 | metroApplicationDescription: Template_3D 554 | wsaImages: {} 555 | metroTileShortName: 556 | metroTileShowName: 0 557 | metroMediumTileShowName: 0 558 | metroLargeTileShowName: 0 559 | metroWideTileShowName: 0 560 | metroSupportStreamingInstall: 0 561 | metroLastRequiredScene: 0 562 | metroDefaultTileSize: 1 563 | metroTileForegroundText: 2 564 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 565 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 566 | a: 1} 567 | metroSplashScreenUseBackgroundColor: 0 568 | platformCapabilities: {} 569 | metroTargetDeviceFamilies: {} 570 | metroFTAName: 571 | metroFTAFileTypes: [] 572 | metroProtocolName: 573 | metroCompilationOverrides: 1 574 | XboxOneProductId: 575 | XboxOneUpdateKey: 576 | XboxOneSandboxId: 577 | XboxOneContentId: 578 | XboxOneTitleId: 579 | XboxOneSCId: 580 | XboxOneGameOsOverridePath: 581 | XboxOnePackagingOverridePath: 582 | XboxOneAppManifestOverridePath: 583 | XboxOneVersion: 1.0.0.0 584 | XboxOnePackageEncryption: 0 585 | XboxOnePackageUpdateGranularity: 2 586 | XboxOneDescription: 587 | XboxOneLanguage: 588 | - enus 589 | XboxOneCapability: [] 590 | XboxOneGameRating: {} 591 | XboxOneIsContentPackage: 0 592 | XboxOneEnableGPUVariability: 1 593 | XboxOneSockets: {} 594 | XboxOneSplashScreen: {fileID: 0} 595 | XboxOneAllowedProductIds: [] 596 | XboxOnePersistentLocalStorageSize: 0 597 | XboxOneXTitleMemory: 8 598 | xboxOneScriptCompiler: 1 599 | XboxOneOverrideIdentityName: 600 | vrEditorSettings: 601 | daydream: 602 | daydreamIconForeground: {fileID: 0} 603 | daydreamIconBackground: {fileID: 0} 604 | cloudServicesEnabled: 605 | UNet: 1 606 | luminIcon: 607 | m_Name: 608 | m_ModelFolderPath: 609 | m_PortalFolderPath: 610 | luminCert: 611 | m_CertPath: 612 | m_PrivateKeyPath: 613 | luminIsChannelApp: 0 614 | luminVersion: 615 | m_VersionCode: 1 616 | m_VersionName: 617 | facebookSdkVersion: 7.9.4 618 | facebookAppId: 619 | facebookCookies: 1 620 | facebookLogging: 1 621 | facebookStatus: 1 622 | facebookXfbml: 0 623 | facebookFrictionlessRequests: 1 624 | apiCompatibilityLevel: 6 625 | cloudProjectId: 626 | framebufferDepthMemorylessMode: 0 627 | projectName: 628 | organizationId: 629 | cloudEnabled: 0 630 | enableNativePlatformBackendsForNewInputSystem: 0 631 | disableOldInputManagerSupport: 0 632 | legacyClampBlendShapeWeights: 0 633 | -------------------------------------------------------------------------------- /Assets/Script/RichText.cs: -------------------------------------------------------------------------------- 1 | /*** 2 | * HuaHua 3 | * 2020-09-25 4 | * 富文本,一个drawcall 支持文字和图片混排 5 | **/ 6 | 7 | using System.Collections.Generic; 8 | using System.Text.RegularExpressions; 9 | using HuaHua; 10 | 11 | namespace UnityEngine.UI 12 | { 13 | [System.Serializable] 14 | public enum ERichTextMode 15 | { 16 | ERTM_UI, 17 | ERTM_3DText, 18 | ERTM_MergeText, 19 | } 20 | 21 | [ExecuteInEditMode] 22 | public class RichText : Text 23 | { 24 | #region member 25 | public override string text 26 | { 27 | get 28 | { 29 | return m_Text; 30 | } 31 | 32 | set 33 | { 34 | if (string.IsNullOrEmpty(value)) 35 | { 36 | if (string.IsNullOrEmpty(m_Text)) 37 | { 38 | return; 39 | } 40 | m_Text = string.Empty; 41 | 42 | parseText(); 43 | SetVerticesDirty(); 44 | } 45 | else if (m_Text != value) 46 | { 47 | m_Text = value; 48 | 49 | parseText(); 50 | SetVerticesDirty(); 51 | SetLayoutDirty(); 52 | } 53 | } 54 | } 55 | 56 | [SerializeField] 57 | public Texture2D m_AtlasTexture; 58 | 59 | [SerializeField] 60 | private string m_AtlasTexturePath; 61 | 62 | public string AtlasTexturePath 63 | { 64 | get 65 | { 66 | return m_AtlasTexturePath; 67 | } 68 | set 69 | { 70 | m_AtlasTexturePath = value; 71 | } 72 | } 73 | 74 | [SerializeField] 75 | public ERichTextMode m_UiMode = ERichTextMode.ERTM_MergeText; 76 | 77 | [System.NonSerialized] 78 | private MeshRenderer m_meshRender; 79 | [System.NonSerialized] 80 | private MeshFilter m_meshFilter; 81 | [System.NonSerialized] 82 | private Mesh m_mesh; 83 | 84 | [System.NonSerialized] 85 | private Vector3 m_lastPosition; 86 | 87 | [System.NonSerialized] 88 | private Quaternion m_lastRotation; 89 | 90 | [System.NonSerialized] 91 | private Vector3 m_lastScale; 92 | 93 | private string m_parseText; 94 | private readonly UIVertex[] m_tempVerts = new UIVertex[4]; 95 | private readonly List m_spriteList = new List(); 96 | [System.NonSerialized] 97 | private static readonly VertexHelper s_VertexHelper = new VertexHelper(); 98 | 99 | internal static readonly HideFlags MeshHideflags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.HideInInspector; 100 | #endregion //member 101 | 102 | #region public function 103 | public Mesh Mesh() 104 | { 105 | return m_mesh; 106 | } 107 | 108 | public void SetSpriteFillAmount(string name, float amount) 109 | { 110 | for (int i = 0; i < m_spriteList.Count; ++i) 111 | { 112 | if(m_spriteList[i].GetName().Equals(name)) 113 | { 114 | m_spriteList[i].SetFillAmount(amount); 115 | break; 116 | } 117 | } 118 | } 119 | #endregion //public function 120 | 121 | #region unity function 122 | 123 | protected override void UpdateGeometry() 124 | { 125 | if (m_UiMode == ERichTextMode.ERTM_UI) 126 | { 127 | base.UpdateGeometry(); 128 | } 129 | else if (m_UiMode == ERichTextMode.ERTM_3DText) 130 | { 131 | if (m_meshRender == null) 132 | { 133 | m_meshRender = gameObject.GetOrAddComponent(); 134 | m_meshRender.sharedMaterial = material; 135 | m_meshRender.hideFlags = MeshHideflags; 136 | 137 | m_meshFilter = gameObject.GetOrAddComponent(); 138 | m_meshFilter.hideFlags = MeshHideflags; 139 | 140 | m_mesh = new Mesh(); 141 | m_mesh.MarkDynamic(); 142 | m_mesh.hideFlags = MeshHideflags; 143 | } 144 | 145 | DoMeshGeneration3D(); 146 | } 147 | else if (m_UiMode == ERichTextMode.ERTM_MergeText) 148 | { 149 | if (m_mesh == null) 150 | { 151 | m_mesh = new Mesh(); 152 | m_mesh.MarkDynamic(); 153 | m_mesh.hideFlags = MeshHideflags; 154 | } 155 | DoMeshGeneration3D(); 156 | 157 | var render = transform.GetComponentInParent(); 158 | if (render) 159 | { 160 | render.MarkDirty(); 161 | } 162 | } 163 | } 164 | 165 | private void DoMeshGeneration3D() 166 | { 167 | if (rectTransform != null && rectTransform.rect.width >= 0 && rectTransform.rect.height >= 0) 168 | { 169 | OnPopulateMesh(s_VertexHelper); 170 | } 171 | else 172 | { 173 | s_VertexHelper.Clear(); // clear the vertex helper so invalid graphics dont draw. 174 | } 175 | 176 | var components = ListPool.Get(); 177 | GetComponents(typeof(IMeshModifier), components); 178 | 179 | for (var i = 0; i < components.Count; i++) 180 | { 181 | ((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper); 182 | } 183 | 184 | ListPool.Release(components); 185 | 186 | s_VertexHelper.FillMesh(m_mesh); 187 | 188 | if (m_meshFilter) 189 | { 190 | m_meshFilter.sharedMesh = m_mesh; 191 | } 192 | } 193 | 194 | protected override void OnEnable() 195 | { 196 | this.supportRichText = true; 197 | 198 | parseText(); 199 | 200 | if (mainTexture) 201 | { 202 | m_Material.SetTexture("_MainTex", mainTexture); 203 | } 204 | if (m_AtlasTexture) 205 | { 206 | m_Material.SetTexture("_SpriteTex", m_AtlasTexture); 207 | } 208 | 209 | SetVerticesDirty(); 210 | 211 | base.OnEnable(); 212 | } 213 | 214 | protected override void OnDisable() 215 | { 216 | if (m_UiMode == ERichTextMode.ERTM_MergeText) 217 | { 218 | var render = transform.GetComponentInParent(); 219 | if (render) 220 | { 221 | render.MarkDirty(); 222 | } 223 | } 224 | 225 | base.OnDisable(); 226 | } 227 | 228 | private void LateUpdate() 229 | { 230 | if (rectTransform.hasChanged) 231 | { 232 | rectTransform.hasChanged = false; 233 | 234 | if (m_UiMode == ERichTextMode.ERTM_MergeText) 235 | { 236 | var lastPosition = transform.localPosition; 237 | var lastRotation = transform.localRotation; 238 | var lastScale = transform.localScale; 239 | if (m_lastPosition != lastPosition || m_lastRotation != lastRotation || m_lastScale != lastScale) 240 | { 241 | m_lastPosition = lastPosition; 242 | m_lastRotation = lastRotation; 243 | m_lastScale = lastScale; 244 | SetVerticesDirty(); 245 | } 246 | } 247 | else 248 | { 249 | SetVerticesDirty(); 250 | } 251 | } 252 | } 253 | 254 | #endregion //unity function 255 | 256 | #region function 257 | private void parseText() 258 | { 259 | m_parseText = text; 260 | parseSprite(m_parseText); 261 | } 262 | 263 | private void parseSprite(string strText) 264 | { 265 | if (string.IsNullOrEmpty(strText) || -1 == strText.IndexOf("= 0) 287 | { 288 | m_spriteList.EnsureSizeEx(index + 1); 289 | RichTextSprite sprt = m_spriteList[index] ?? (m_spriteList[index] = new RichTextSprite(this)); 290 | return sprt; 291 | } 292 | 293 | return null; 294 | } 295 | 296 | private void parseSprite(int startIndex) 297 | { 298 | var count = m_spriteList.Count; 299 | for (int i = startIndex; i < count; ++i) 300 | { 301 | var tag = m_spriteList[i]; 302 | tag.Reset(); 303 | } 304 | } 305 | 306 | private void handleSprite(VertexHelper toFill) 307 | { 308 | var count = m_spriteList.Count; 309 | for (int i = 0; i < count; i++) 310 | { 311 | RichTextSprite richSprite = m_spriteList[i]; 312 | var name = richSprite.GetName(); 313 | var sprite = richSprite.GetSprite(); 314 | if (string.IsNullOrEmpty(name) || null == sprite) 315 | { 316 | continue; 317 | } 318 | 319 | if (richSprite.GetImageType() == Image.Type.Simple) 320 | { 321 | GenerateSimpleSprite(toFill, richSprite, sprite); 322 | } 323 | else if (richSprite.GetImageType() == Image.Type.Sliced) 324 | { 325 | GenerateSlicedSprite(toFill, richSprite, sprite); 326 | } 327 | 328 | } 329 | } 330 | 331 | static readonly Vector2[] s_VertScratch = new Vector2[4]; 332 | static readonly Vector2[] s_UVScratch = new Vector2[4]; 333 | 334 | private Vector4 GetAdjustedBorders(Vector4 border, Rect adjustedRect) 335 | { 336 | Rect originalRect = rectTransform.rect; 337 | 338 | for (int axis = 0; axis <= 1; axis++) 339 | { 340 | float borderScaleRatio; 341 | 342 | // The adjusted rect (adjusted for pixel correctness) 343 | // may be slightly larger than the original rect. 344 | // Adjust the border to match the adjustedRect to avoid 345 | // small gaps between borders (case 833201). 346 | if (originalRect.size[axis] != 0) 347 | { 348 | borderScaleRatio = adjustedRect.size[axis] / originalRect.size[axis]; 349 | border[axis] *= borderScaleRatio; 350 | border[axis + 2] *= borderScaleRatio; 351 | } 352 | 353 | // If the rect is smaller than the combined borders, then there's not room for the borders at their normal size. 354 | // In order to avoid artefacts with overlapping borders, we scale the borders down to fit. 355 | float combinedBorders = border[axis] + border[axis + 2]; 356 | if (adjustedRect.size[axis] < combinedBorders && combinedBorders != 0) 357 | { 358 | borderScaleRatio = adjustedRect.size[axis] / combinedBorders; 359 | border[axis] *= borderScaleRatio; 360 | border[axis + 2] *= borderScaleRatio; 361 | } 362 | } 363 | return border; 364 | } 365 | 366 | private void GenerateSlicedSprite(VertexHelper toFill, RichTextSprite richSprite, Sprite sprite) 367 | { 368 | UIVertex v = UIVertex.simpleVert; 369 | var vertexIndex = richSprite.GetVertexIndex() * 4; 370 | var fetchIndex = vertexIndex + 3; 371 | if (fetchIndex >= toFill.currentVertCount) 372 | { 373 | return; 374 | } 375 | 376 | toFill.PopulateUIVertex(ref v, fetchIndex); 377 | Vector3 textPos = v.position; 378 | 379 | var tagSize = richSprite.GetSize(); 380 | 381 | Vector4 border = sprite.border; 382 | Vector4 adjustedBorders = border; 383 | 384 | Vector4 outer, inner; 385 | 386 | outer = Sprites.DataUtility.GetOuterUV(sprite); 387 | inner = Sprites.DataUtility.GetInnerUV(sprite); 388 | 389 | s_VertScratch[0] = new Vector2(0, 0); 390 | s_VertScratch[3] = new Vector2(tagSize.x, tagSize.y); 391 | 392 | s_VertScratch[1].x = adjustedBorders.x; 393 | s_VertScratch[1].y = adjustedBorders.y; 394 | 395 | s_VertScratch[2].x = tagSize.x - adjustedBorders.z; 396 | s_VertScratch[2].y = tagSize.y - adjustedBorders.w; 397 | 398 | for (int i = 0; i < 4; ++i) 399 | { 400 | s_VertScratch[i].x += textPos.x; 401 | s_VertScratch[i].y += textPos.y; 402 | } 403 | 404 | s_UVScratch[0] = new Vector2(outer.x, outer.y); 405 | s_UVScratch[1] = new Vector2(inner.x, inner.y); 406 | s_UVScratch[2] = new Vector2(inner.z, inner.w); 407 | s_UVScratch[3] = new Vector2(outer.z, outer.w); 408 | 409 | int vertexCount = 0; 410 | for (int x = 0; x < 3; ++x) 411 | { 412 | int x2 = x + 1; 413 | 414 | for (int y = 0; y < 3; ++y) 415 | { 416 | int y2 = y + 1; 417 | 418 | addSpriteQuad(toFill, 419 | vertexIndex + vertexCount, 420 | new Vector2(s_VertScratch[x].x, s_VertScratch[y].y), 421 | new Vector2(s_VertScratch[x2].x, s_VertScratch[y2].y), 422 | new Vector2(s_UVScratch[x].x, s_UVScratch[y].y), 423 | new Vector2(s_UVScratch[x2].x, s_UVScratch[y2].y)); 424 | 425 | vertexCount += 4; 426 | } 427 | } 428 | } 429 | 430 | private void GenerateSimpleSprite(VertexHelper toFill, RichTextSprite richSprite, Sprite sprite) 431 | { 432 | UIVertex v = UIVertex.simpleVert; 433 | var vertexIndex = richSprite.GetVertexIndex() * 4; 434 | var fetchIndex = vertexIndex + 3; 435 | if (fetchIndex >= toFill.currentVertCount) 436 | { 437 | return; 438 | } 439 | 440 | toFill.PopulateUIVertex(ref v, fetchIndex); 441 | Vector3 textPos = v.position; 442 | 443 | var tagSize = richSprite.GetSize(); 444 | 445 | var texture = sprite.texture; 446 | var textureWidthInv = 1.0f / texture.width; 447 | var textureHeightInv = 1.0f / texture.height; 448 | var uvRect = sprite.textureRect; 449 | uvRect = new Rect(uvRect.x * textureWidthInv, uvRect.y * textureHeightInv, uvRect.width * textureWidthInv, uvRect.height * textureHeightInv); 450 | 451 | // pos = (0, 0) 452 | var position = new Vector3(0, 0, 0) + textPos; 453 | var uv0 = new Vector2(uvRect.x, uvRect.y); 454 | setSpriteVertex(toFill, vertexIndex, position, uv0); 455 | 456 | var fillAmount = richSprite.GetFillAmount(); 457 | 458 | // pos = (1, 0) 459 | position = new Vector3(tagSize.x * fillAmount, 0, 0) + textPos; 460 | uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y); 461 | setSpriteVertex(toFill, ++vertexIndex, position, uv0); 462 | 463 | // pos = (1, 1) 464 | position = new Vector3(tagSize.x * fillAmount, tagSize.y, 0) + textPos; 465 | uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y + uvRect.height); 466 | setSpriteVertex(toFill, ++vertexIndex, position, uv0); 467 | 468 | // pos = (0, 1) 469 | position = new Vector3(0, tagSize.y, 0) + textPos; 470 | uv0 = new Vector2(uvRect.x, uvRect.y + uvRect.height); 471 | setSpriteVertex(toFill, ++vertexIndex, position, uv0); 472 | } 473 | 474 | private void setSpriteVertex(VertexHelper toFill, int vertexIndex, Vector3 position, Vector2 uv0) 475 | { 476 | UIVertex v = new UIVertex(); 477 | toFill.PopulateUIVertex(ref v, vertexIndex); 478 | v.position = position; 479 | v.uv0 = uv0; 480 | v.uv1 = new Vector2(0, 1.0f); 481 | toFill.SetUIVertex(v, vertexIndex); 482 | } 483 | 484 | private void addSpriteQuad(VertexHelper toFill, int startIndex, Vector2 posMin, Vector2 posMax, Vector2 uvMin, Vector2 uvMax) 485 | { 486 | setSpriteVertex(toFill, startIndex, new Vector3(posMin.x, posMin.y, 0), new Vector2(uvMin.x, uvMin.y)); 487 | setSpriteVertex(toFill, startIndex + 1, new Vector3(posMin.x, posMax.y, 0), new Vector2(uvMin.x, uvMax.y)); 488 | setSpriteVertex(toFill, startIndex + 2, new Vector3(posMax.x, posMax.y, 0), new Vector2(uvMax.x, uvMax.y)); 489 | setSpriteVertex(toFill, startIndex + 3, new Vector3(posMax.x, posMin.y, 0), new Vector2(uvMax.x, uvMin.y)); 490 | } 491 | 492 | protected override void OnPopulateMesh(VertexHelper toFill) 493 | { 494 | if (null == font) 495 | { 496 | return; 497 | } 498 | 499 | // We don't care if we the font Texture changes while we are doing our Update. 500 | // The end result of cachedTextGenerator will be valid for this instance. 501 | // Otherwise we can get issues like Case 619238. 502 | m_DisableFontTextureRebuiltCallback = true; 503 | 504 | Vector2 extents = rectTransform.rect.size; 505 | 506 | var settings = GetGenerationSettings(extents); 507 | cachedTextGenerator.Populate(m_parseText, settings); 508 | 509 | Rect inputRect = rectTransform.rect; 510 | 511 | // get the text alignment anchor point for the text in local space 512 | Vector2 textAnchorPivot = GetTextAnchorPivot(alignment); 513 | Vector2 refPoint = Vector2.zero; 514 | refPoint.x = (textAnchorPivot.x == 1 ? inputRect.xMax : inputRect.xMin); 515 | refPoint.y = (textAnchorPivot.y == 0 ? inputRect.yMin : inputRect.yMax); 516 | 517 | // Determine fraction of pixel to offset text mesh. 518 | Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint; 519 | 520 | // Apply the offset to the vertices 521 | IList verts = cachedTextGenerator.verts; 522 | float unitsPerPixel = 1 / pixelsPerUnit; 523 | //Last 4 verts are always a new line... 524 | int vertCount = verts.Count - 4; 525 | 526 | toFill.Clear(); 527 | 528 | if (roundingOffset != Vector2.zero) 529 | { 530 | for (int i = 0; i < vertCount; ++i) 531 | { 532 | int tempVertsIndex = i & 3; 533 | m_tempVerts[tempVertsIndex] = verts[i]; 534 | m_tempVerts[tempVertsIndex].position *= unitsPerPixel; 535 | m_tempVerts[tempVertsIndex].position.x += roundingOffset.x; 536 | m_tempVerts[tempVertsIndex].position.y += roundingOffset.y; 537 | m_tempVerts[tempVertsIndex].uv1 = new Vector2(1.0f, 0); 538 | 539 | if (tempVertsIndex == 3) 540 | { 541 | toFill.AddUIVertexQuad(m_tempVerts); 542 | } 543 | } 544 | } 545 | else 546 | { 547 | for (int i = 0; i < vertCount; ++i) 548 | { 549 | int tempVertsIndex = i & 3; 550 | m_tempVerts[tempVertsIndex] = verts[i]; 551 | m_tempVerts[tempVertsIndex].position *= unitsPerPixel; 552 | m_tempVerts[tempVertsIndex].uv1 = new Vector2(1.0f, 0); 553 | 554 | if (tempVertsIndex == 3) 555 | { 556 | toFill.AddUIVertexQuad(m_tempVerts); 557 | } 558 | } 559 | } 560 | 561 | handleSprite(toFill); 562 | m_DisableFontTextureRebuiltCallback = false; 563 | } 564 | 565 | 566 | #endregion //function 567 | 568 | } 569 | 570 | } -------------------------------------------------------------------------------- /Assets/Scenes/Atlas/MapAtlas.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0192151b80666114d8a79352c9ecd13a 3 | TextureImporter: 4 | fileIDToRecycleName: 5 | 21300000: MapAtlas 6 | 21300002: bg_arrow_zhishi 7 | 21300004: bg_bar_black 8 | 21300006: bg_icon_circle 9 | 21300008: btn_bianji 10 | 21300010: btn_cehuiduiwu 11 | 21300012: btn_duiwuxiangqing 12 | 21300014: btn_jiaruzhufang 13 | 21300016: btn_map_blue 14 | 21300018: btn_map_yellow 15 | 21300020: btn_shuqian_fenxiang 16 | 21300022: btn_shuqian_shanchu 17 | 21300024: btn_sousuo 18 | 21300026: btn_yeqian_diren01 19 | 21300028: btn_yeqian_diren02 20 | 21300030: btn_yeqian_lianmeng01 21 | 21300032: btn_yeqian_lianmeng02 22 | 21300034: btn_yeqian_pengyou01 23 | 21300036: btn_yeqian_pengyou02 24 | 21300038: btn_yeqian_quanbu01 25 | 21300040: btn_yeqian_quanbu02 26 | 21300042: btn_yeqian_teshu01 27 | 21300044: btn_yeqian_teshu02 28 | 21300046: icon_difang 29 | 21300048: icon_famuchang 30 | 21300050: icon_juntuan 31 | 21300052: icon_kuangshi 32 | 21300054: icon_mudizuobiao 33 | 21300056: icon_nongchang 34 | 21300058: icon_pengyou 35 | 21300060: icon_shicaichang 36 | 21300062: icon_shijie 37 | 21300064: icon_teshu 38 | 21300066: icon_zuobiaodian 39 | 21300068: lihui_yeguai1 40 | 21300070: lihui_yeguai2 41 | 21300072: lihui_yeguai3 42 | 21300074: line_jiantou 43 | 21300076: line_yuandian 44 | 21300078: bg_shuzidi 45 | 21300080: btn_fenxiang 46 | 21300082: btn_shoucang 47 | 21300084: btn_xinxi 48 | 21300086: di_fukuang_quan 49 | 21300088: icon_zhanli 50 | 21300090: dingdianqiancheng 51 | 21300092: juntuanqiancheng 52 | 21300094: kongdi 53 | 21300096: icon_dingdianqiancheng 54 | 21300098: icon_juntuanqiancheng 55 | 21300100: icon_kongdi 56 | 21300102: 101 57 | 21300104: 102 58 | 21300106: 103 59 | 21300108: 104 60 | 21300110: baohu 61 | 21300112: cc_bg 62 | 21300114: cjd_blue 63 | 21300116: cjd_green 64 | 21300118: cjd_red 65 | 21300120: fire 66 | 21300122: lv_bg 67 | 21300124: kuang_lightBox 68 | 21300126: icon_search2 69 | 21300128: icon_search3 70 | 21300130: icon_search4 71 | 21300132: icon_search5 72 | 21300134: xuanzhongquan 73 | 21300136: jiantou 74 | 21300138: di 75 | 21300140: heidi 76 | 21300142: qiancheng 77 | 21300144: shoucang 78 | 21300146: zuobiao_blue 79 | 21300148: zuobiao_orange 80 | 21300150: liwu 81 | 21300152: dengji-di 82 | 21300154: dengji-huang 83 | 21300156: dengji-lan 84 | 21300158: dengjijiaobiao-di 85 | 21300160: dengjijiaobiao 86 | 21300162: jinggso 87 | 21300164: zhenwang 88 | 21300166: hero 89 | 21300168: btn_juntuan 90 | 21300170: btn_jiantou_1 91 | 21300172: btn_xinxi_1 92 | 21300174: kuang_shousheng 93 | 21300176: shousheng 94 | 21300178: cunzhuang 95 | 21300180: di2 96 | 21300182: kuang_qipao_02 97 | 21300184: EA_Narrow_buildA_04 98 | 21300186: di_biaoqian 99 | 21300188: di_txt 100 | 21300190: juntuanbiaozhi 101 | 21300192: feitinganniu 102 | 21300194: pic_juntuan_di 103 | 21300196: pic_juntuan_ewaijiangli_di 104 | 21300198: pic_juntuan_paimingfenge_di 105 | 21300200: pic_juntuan_paimingzong_di 106 | 21300202: pic_juntuan_zuixiamianxian 107 | 21300204: pic_juntuan_jianglifengexian 108 | 21300206: shixiao 109 | 21300208: shuijingqiu 110 | 21300210: yishixiao 111 | 21300212: icon_sou 112 | 21300214: icon_sou_02 113 | 21300216: anniu-huang 114 | 21300218: anniu-lan 115 | 21300220: dingwei 116 | 21300222: feiting 117 | 21300224: huijia 118 | 21300226: yidong 119 | 21300228: dingwei_1 120 | 21300230: icon4 121 | 21300232: icon_5 122 | 21300234: icon5 123 | 21300236: button3 124 | 21300238: gengduo 125 | 21300240: shanxing-di 126 | 21300242: shanxing_di 127 | 21300244: bg1 128 | 21300246: bg2 129 | 21300248: bg3 130 | 21300250: bg4 131 | 21300252: icon1 132 | 21300254: icon2 133 | 21300256: icon3 134 | 21300258: icon8 135 | 21300260: img1 136 | 21300262: img2 137 | 21300264: state1 138 | 21300266: state2 139 | 21300268: state3 140 | 21300270: daibing 141 | 21300272: fanhuizhong 142 | 21300274: hei-di 143 | 21300276: kongxian 144 | 21300278: tansuo 145 | 21300280: xingjun 146 | 21300282: icon_dadi_chakan 147 | 21300284: icon_dadi_jinru 148 | 21300286: icon_dadi_weizhi 149 | 21300288: dadituanniu 150 | 21300290: tiao_quanxian 151 | 21300292: pic_yy_heilong_tk_juntuandi 152 | 21300294: shixiaodi 153 | 21300296: qianwang 154 | 21300298: pic_sf_EA_Narrow_buildB_04 155 | 21300300: pic_sf_yingxiongweizhi 156 | 21300302: pic_sf_yuandi 157 | 21300304: pic_sf_EA_Narrow_buildA_03 158 | externalObjects: {} 159 | serializedVersion: 9 160 | mipmaps: 161 | mipMapMode: 0 162 | enableMipMap: 0 163 | sRGBTexture: 1 164 | linearTexture: 0 165 | fadeOut: 0 166 | borderMipMap: 0 167 | mipMapsPreserveCoverage: 0 168 | alphaTestReferenceValue: 0.5 169 | mipMapFadeDistanceStart: 1 170 | mipMapFadeDistanceEnd: 3 171 | bumpmap: 172 | convertToNormalMap: 0 173 | externalNormalMap: 0 174 | heightScale: 0.25 175 | normalMapFilter: 0 176 | isReadable: 0 177 | streamingMipmaps: 0 178 | streamingMipmapsPriority: 0 179 | grayScaleToAlpha: 0 180 | generateCubemap: 6 181 | cubemapConvolution: 0 182 | seamlessCubemap: 0 183 | textureFormat: 1 184 | maxTextureSize: 2048 185 | textureSettings: 186 | serializedVersion: 2 187 | filterMode: -1 188 | aniso: -1 189 | mipBias: -100 190 | wrapU: 1 191 | wrapV: 1 192 | wrapW: 1 193 | nPOTScale: 0 194 | lightmap: 0 195 | compressionQuality: 50 196 | spriteMode: 2 197 | spriteExtrude: 1 198 | spriteMeshType: 0 199 | alignment: 0 200 | spritePivot: {x: 0.5, y: 0.5} 201 | spritePixelsToUnits: 100 202 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 203 | spriteGenerateFallbackPhysicsShape: 1 204 | alphaUsage: 1 205 | alphaIsTransparency: 1 206 | spriteTessellationDetail: -1 207 | textureType: 8 208 | textureShape: 1 209 | singleChannelComponent: 0 210 | maxTextureSizeSet: 0 211 | compressionQualitySet: 0 212 | textureFormatSet: 0 213 | platformSettings: 214 | - serializedVersion: 2 215 | buildTarget: DefaultTexturePlatform 216 | maxTextureSize: 2048 217 | resizeAlgorithm: 0 218 | textureFormat: -1 219 | textureCompression: 0 220 | compressionQuality: 50 221 | crunchedCompression: 0 222 | allowsAlphaSplitting: 0 223 | overridden: 0 224 | androidETC2FallbackOverride: 0 225 | - serializedVersion: 2 226 | buildTarget: Standalone 227 | maxTextureSize: 2048 228 | resizeAlgorithm: 0 229 | textureFormat: -1 230 | textureCompression: 0 231 | compressionQuality: 50 232 | crunchedCompression: 0 233 | allowsAlphaSplitting: 0 234 | overridden: 0 235 | androidETC2FallbackOverride: 0 236 | - serializedVersion: 2 237 | buildTarget: Android 238 | maxTextureSize: 2048 239 | resizeAlgorithm: 0 240 | textureFormat: -1 241 | textureCompression: 0 242 | compressionQuality: 50 243 | crunchedCompression: 0 244 | allowsAlphaSplitting: 0 245 | overridden: 0 246 | androidETC2FallbackOverride: 0 247 | spriteSheet: 248 | serializedVersion: 2 249 | sprites: 250 | - serializedVersion: 2 251 | name: anniu-huang 252 | rect: 253 | serializedVersion: 2 254 | x: 406 255 | y: 375 256 | width: 56 257 | height: 58 258 | alignment: 0 259 | pivot: {x: 0.5, y: 0.5} 260 | border: {x: 0, y: 0, z: 0, w: 0} 261 | outline: [] 262 | physicsShape: [] 263 | tessellationDetail: -1 264 | bones: [] 265 | spriteID: 65beb5866bcd2424885b342ba6cdc020 266 | vertices: [] 267 | indices: 268 | edges: [] 269 | weights: [] 270 | - serializedVersion: 2 271 | name: anniu-lan 272 | rect: 273 | serializedVersion: 2 274 | x: 406 275 | y: 315 276 | width: 56 277 | height: 58 278 | alignment: 0 279 | pivot: {x: 0.5, y: 0.5} 280 | border: {x: 0, y: 0, z: 0, w: 0} 281 | outline: [] 282 | physicsShape: [] 283 | tessellationDetail: -1 284 | bones: [] 285 | spriteID: 5d51f50246c426e45b84143da8d4ae40 286 | vertices: [] 287 | indices: 288 | edges: [] 289 | weights: [] 290 | - serializedVersion: 2 291 | name: bg2 292 | rect: 293 | serializedVersion: 2 294 | x: 133 295 | y: 191 296 | width: 86 297 | height: 23 298 | alignment: 0 299 | pivot: {x: 0.5, y: 0.5} 300 | border: {x: 0, y: 0, z: 0, w: 0} 301 | outline: [] 302 | physicsShape: [] 303 | tessellationDetail: -1 304 | bones: [] 305 | spriteID: 8f9ad297f6bae9c4d900c1c52b84c01c 306 | vertices: [] 307 | indices: 308 | edges: [] 309 | weights: [] 310 | - serializedVersion: 2 311 | name: bg3 312 | rect: 313 | serializedVersion: 2 314 | x: 231 315 | y: 183 316 | width: 27 317 | height: 33 318 | alignment: 0 319 | pivot: {x: 0.5, y: 0.5} 320 | border: {x: 10, y: 0, z: 10, w: 0} 321 | outline: [] 322 | physicsShape: [] 323 | tessellationDetail: -1 324 | bones: [] 325 | spriteID: 0fce92984b11b8740ab0adf0fcdf8973 326 | vertices: [] 327 | indices: 328 | edges: [] 329 | weights: [] 330 | - serializedVersion: 2 331 | name: bg4 332 | rect: 333 | serializedVersion: 2 334 | x: 262 335 | y: 363 336 | width: 142 337 | height: 142 338 | alignment: 0 339 | pivot: {x: 0.5, y: 0.5} 340 | border: {x: 0, y: 0, z: 0, w: 0} 341 | outline: [] 342 | physicsShape: [] 343 | tessellationDetail: -1 344 | bones: [] 345 | spriteID: e8b6b3ffbefcc3644b4fb8c1d94000b3 346 | vertices: [] 347 | indices: 348 | edges: [] 349 | weights: [] 350 | - serializedVersion: 2 351 | name: bg_bar_black 352 | rect: 353 | serializedVersion: 2 354 | x: 1 355 | y: 6 356 | width: 41 357 | height: 24 358 | alignment: 0 359 | pivot: {x: 0.5, y: 0.5} 360 | border: {x: 0, y: 0, z: 0, w: 0} 361 | outline: [] 362 | physicsShape: [] 363 | tessellationDetail: -1 364 | bones: [] 365 | spriteID: 3670e8576e419d542b2393ebfcd3064d 366 | vertices: [] 367 | indices: 368 | edges: [] 369 | weights: [] 370 | - serializedVersion: 2 371 | name: btn_duiwuxiangqing 372 | rect: 373 | serializedVersion: 2 374 | x: 466 375 | y: 434 376 | width: 45 377 | height: 35 378 | alignment: 0 379 | pivot: {x: 0.5, y: 0.5} 380 | border: {x: 0, y: 0, z: 0, w: 0} 381 | outline: [] 382 | physicsShape: [] 383 | tessellationDetail: -1 384 | bones: [] 385 | spriteID: e2ab0c0b1b65cb948998887480920074 386 | vertices: [] 387 | indices: 388 | edges: [] 389 | weights: [] 390 | - serializedVersion: 2 391 | name: btn_jiantou_1 392 | rect: 393 | serializedVersion: 2 394 | x: 101 395 | y: 128 396 | width: 30 397 | height: 32 398 | alignment: 0 399 | pivot: {x: 0.5, y: 0.5} 400 | border: {x: 0, y: 0, z: 0, w: 0} 401 | outline: [] 402 | physicsShape: [] 403 | tessellationDetail: -1 404 | bones: [] 405 | spriteID: 08bbcc7554fa2d64cae8c57b697300b9 406 | vertices: [] 407 | indices: 408 | edges: [] 409 | weights: [] 410 | - serializedVersion: 2 411 | name: button3 412 | rect: 413 | serializedVersion: 2 414 | x: 406 415 | y: 435 416 | width: 58 417 | height: 52 418 | alignment: 0 419 | pivot: {x: 0.5, y: 0.5} 420 | border: {x: 12, y: 17, z: 16, w: 15} 421 | outline: [] 422 | physicsShape: [] 423 | tessellationDetail: -1 424 | bones: [] 425 | spriteID: 15bcadd1a872c6a438077d01108bb167 426 | vertices: [] 427 | indices: 428 | edges: [] 429 | weights: [] 430 | - serializedVersion: 2 431 | name: dadituanniu 432 | rect: 433 | serializedVersion: 2 434 | x: 1 435 | y: 150 436 | width: 98 437 | height: 98 438 | alignment: 0 439 | pivot: {x: 0.5, y: 0.5} 440 | border: {x: 0, y: 0, z: 0, w: 0} 441 | outline: [] 442 | physicsShape: [] 443 | tessellationDetail: -1 444 | bones: [] 445 | spriteID: 325371d3f618125448ff285ae917512e 446 | vertices: [] 447 | indices: 448 | edges: [] 449 | weights: [] 450 | - serializedVersion: 2 451 | name: daibing 452 | rect: 453 | serializedVersion: 2 454 | x: 231 455 | y: 161 456 | width: 27 457 | height: 20 458 | alignment: 0 459 | pivot: {x: 0.5, y: 0.5} 460 | border: {x: 0, y: 0, z: 0, w: 0} 461 | outline: [] 462 | physicsShape: [] 463 | tessellationDetail: -1 464 | bones: [] 465 | spriteID: 9249aa3a00420c64a851c7e6f1743c7b 466 | vertices: [] 467 | indices: 468 | edges: [] 469 | weights: [] 470 | - serializedVersion: 2 471 | name: di 472 | rect: 473 | serializedVersion: 2 474 | x: 406 475 | y: 489 476 | width: 59 477 | height: 16 478 | alignment: 0 479 | pivot: {x: 0.5, y: 0.5} 480 | border: {x: 0, y: 0, z: 0, w: 0} 481 | outline: [] 482 | physicsShape: [] 483 | tessellationDetail: -1 484 | bones: [] 485 | spriteID: ee19c38027752dd459be0f3dd29d7256 486 | vertices: [] 487 | indices: 488 | edges: [] 489 | weights: [] 490 | - serializedVersion: 2 491 | name: di2 492 | rect: 493 | serializedVersion: 2 494 | x: 73 495 | y: 106 496 | width: 18 497 | height: 18 498 | alignment: 0 499 | pivot: {x: 0.5, y: 0.5} 500 | border: {x: 0, y: 0, z: 0, w: 0} 501 | outline: [] 502 | physicsShape: [] 503 | tessellationDetail: -1 504 | bones: [] 505 | spriteID: c45466218cfec6b499e822fcefe8276f 506 | vertices: [] 507 | indices: 508 | edges: [] 509 | weights: [] 510 | - serializedVersion: 2 511 | name: di_biaoqian 512 | rect: 513 | serializedVersion: 2 514 | x: 251 515 | y: 350 516 | width: 8 517 | height: 30 518 | alignment: 0 519 | pivot: {x: 0.5, y: 0.5} 520 | border: {x: 2, y: 9, z: 2, w: 3} 521 | outline: [] 522 | physicsShape: [] 523 | tessellationDetail: -1 524 | bones: [] 525 | spriteID: bf9b6a1a0d4928c42a9517bd15e95b57 526 | vertices: [] 527 | indices: 528 | edges: [] 529 | weights: [] 530 | - serializedVersion: 2 531 | name: di_txt 532 | rect: 533 | serializedVersion: 2 534 | x: 134 535 | y: 244 536 | width: 113 537 | height: 7 538 | alignment: 0 539 | pivot: {x: 0.5, y: 0.5} 540 | border: {x: 0, y: 0, z: 0, w: 0} 541 | outline: [] 542 | physicsShape: [] 543 | tessellationDetail: -1 544 | bones: [] 545 | spriteID: b8cd086a5b258d4458980f3bb63c6524 546 | vertices: [] 547 | indices: 548 | edges: [] 549 | weights: [] 550 | - serializedVersion: 2 551 | name: dingwei 552 | rect: 553 | serializedVersion: 2 554 | x: 101 555 | y: 162 556 | width: 30 557 | height: 37 558 | alignment: 0 559 | pivot: {x: 0.5, y: 0.5} 560 | border: {x: 0, y: 0, z: 0, w: 0} 561 | outline: [] 562 | physicsShape: [] 563 | tessellationDetail: -1 564 | bones: [] 565 | spriteID: 6e0d5e4af32bd3f4b98574755aa2b228 566 | vertices: [] 567 | indices: 568 | edges: [] 569 | weights: [] 570 | - serializedVersion: 2 571 | name: dingwei_1 572 | rect: 573 | serializedVersion: 2 574 | x: 231 575 | y: 218 576 | width: 16 577 | height: 24 578 | alignment: 0 579 | pivot: {x: 0.5, y: 0.5} 580 | border: {x: 0, y: 0, z: 0, w: 0} 581 | outline: [] 582 | physicsShape: [] 583 | tessellationDetail: -1 584 | bones: [] 585 | spriteID: fb2a381e48257904f9c3dca908f59b11 586 | vertices: [] 587 | indices: 588 | edges: [] 589 | weights: [] 590 | - serializedVersion: 2 591 | name: fanhuizhong 592 | rect: 593 | serializedVersion: 2 594 | x: 204 595 | y: 165 596 | width: 25 597 | height: 24 598 | alignment: 0 599 | pivot: {x: 0.5, y: 0.5} 600 | border: {x: 0, y: 0, z: 0, w: 0} 601 | outline: [] 602 | physicsShape: [] 603 | tessellationDetail: -1 604 | bones: [] 605 | spriteID: dec69c45fbb279747923d40d34f80b49 606 | vertices: [] 607 | indices: 608 | edges: [] 609 | weights: [] 610 | - serializedVersion: 2 611 | name: feiting 612 | rect: 613 | serializedVersion: 2 614 | x: 1 615 | y: 32 616 | width: 41 617 | height: 42 618 | alignment: 0 619 | pivot: {x: 0.5, y: 0.5} 620 | border: {x: 0, y: 0, z: 0, w: 0} 621 | outline: [] 622 | physicsShape: [] 623 | tessellationDetail: -1 624 | bones: [] 625 | spriteID: cd671c2b8f1087946a972d9b1a4eacd1 626 | vertices: [] 627 | indices: 628 | edges: [] 629 | weights: [] 630 | - serializedVersion: 2 631 | name: gengduo 632 | rect: 633 | serializedVersion: 2 634 | x: 405 635 | y: 302 636 | width: 35 637 | height: 11 638 | alignment: 0 639 | pivot: {x: 0.5, y: 0.5} 640 | border: {x: 0, y: 0, z: 0, w: 0} 641 | outline: [] 642 | physicsShape: [] 643 | tessellationDetail: -1 644 | bones: [] 645 | spriteID: 1fa11623c73c26a4e94d3a680b7c5952 646 | vertices: [] 647 | indices: 648 | edges: [] 649 | weights: [] 650 | - serializedVersion: 2 651 | name: hei-di 652 | rect: 653 | serializedVersion: 2 654 | x: 251 655 | y: 341 656 | width: 7 657 | height: 7 658 | alignment: 0 659 | pivot: {x: 0.5, y: 0.5} 660 | border: {x: 0, y: 0, z: 0, w: 0} 661 | outline: [] 662 | physicsShape: [] 663 | tessellationDetail: -1 664 | bones: [] 665 | spriteID: ed4d340c0d9dbba4592c077ab43148d0 666 | vertices: [] 667 | indices: 668 | edges: [] 669 | weights: [] 670 | - serializedVersion: 2 671 | name: hero 672 | rect: 673 | serializedVersion: 2 674 | x: 464 675 | y: 345 676 | width: 46 677 | height: 46 678 | alignment: 0 679 | pivot: {x: 0.5, y: 0.5} 680 | border: {x: 0, y: 0, z: 0, w: 0} 681 | outline: [] 682 | physicsShape: [] 683 | tessellationDetail: -1 684 | bones: [] 685 | spriteID: 2e6af9b76b746d04483e7e8ecc92102a 686 | vertices: [] 687 | indices: 688 | edges: [] 689 | weights: [] 690 | - serializedVersion: 2 691 | name: huijia 692 | rect: 693 | serializedVersion: 2 694 | x: 464 695 | y: 393 696 | width: 47 697 | height: 39 698 | alignment: 0 699 | pivot: {x: 0.5, y: 0.5} 700 | border: {x: 0, y: 0, z: 0, w: 0} 701 | outline: [] 702 | physicsShape: [] 703 | tessellationDetail: -1 704 | bones: [] 705 | spriteID: c66bf61272a37de4b900b516896e3633 706 | vertices: [] 707 | indices: 708 | edges: [] 709 | weights: [] 710 | - serializedVersion: 2 711 | name: icon4 712 | rect: 713 | serializedVersion: 2 714 | x: 156 715 | y: 25 716 | width: 32 717 | height: 32 718 | alignment: 0 719 | pivot: {x: 0.5, y: 0.5} 720 | border: {x: 0, y: 0, z: 0, w: 0} 721 | outline: [] 722 | physicsShape: [] 723 | tessellationDetail: -1 724 | bones: [] 725 | spriteID: d7c7ac3e3c0e79546806aafb61504462 726 | vertices: [] 727 | indices: 728 | edges: [] 729 | weights: [] 730 | - serializedVersion: 2 731 | name: icon5 732 | rect: 733 | serializedVersion: 2 734 | x: 190 735 | y: 25 736 | width: 32 737 | height: 32 738 | alignment: 0 739 | pivot: {x: 0.5, y: 0.5} 740 | border: {x: 0, y: 0, z: 0, w: 0} 741 | outline: [] 742 | physicsShape: [] 743 | tessellationDetail: -1 744 | bones: [] 745 | spriteID: 6044f503a79cbb641a9b92b872b10e42 746 | vertices: [] 747 | indices: 748 | edges: [] 749 | weights: [] 750 | - serializedVersion: 2 751 | name: icon_dadi_chakan 752 | rect: 753 | serializedVersion: 2 754 | x: 52 755 | y: 68 756 | width: 34 757 | height: 36 758 | alignment: 0 759 | pivot: {x: 0.5, y: 0.5} 760 | border: {x: 0, y: 0, z: 0, w: 0} 761 | outline: [] 762 | physicsShape: [] 763 | tessellationDetail: -1 764 | bones: [] 765 | spriteID: fc9446b8593b2114f937c908ba438ed7 766 | vertices: [] 767 | indices: 768 | edges: [] 769 | weights: [] 770 | - serializedVersion: 2 771 | name: icon_dadi_jinru 772 | rect: 773 | serializedVersion: 2 774 | x: 88 775 | y: 49 776 | width: 34 777 | height: 36 778 | alignment: 0 779 | pivot: {x: 0.5, y: 0.5} 780 | border: {x: 0, y: 0, z: 0, w: 0} 781 | outline: [] 782 | physicsShape: [] 783 | tessellationDetail: -1 784 | bones: [] 785 | spriteID: 5e03646bf1eb4c4419e2fbf716850f82 786 | vertices: [] 787 | indices: 788 | edges: [] 789 | weights: [] 790 | - serializedVersion: 2 791 | name: icon_dadi_weizhi 792 | rect: 793 | serializedVersion: 2 794 | x: 352 795 | y: 123 796 | width: 36 797 | height: 66 798 | alignment: 0 799 | pivot: {x: 0.5, y: 0.5} 800 | border: {x: 0, y: 0, z: 0, w: 0} 801 | outline: [] 802 | physicsShape: [] 803 | tessellationDetail: -1 804 | bones: [] 805 | spriteID: 8e6518eda29306f44ba242656dbb8e1f 806 | vertices: [] 807 | indices: 808 | edges: [] 809 | weights: [] 810 | - serializedVersion: 2 811 | name: icon_dingdianqiancheng 812 | rect: 813 | serializedVersion: 2 814 | x: 134 815 | y: 253 816 | width: 115 817 | height: 127 818 | alignment: 0 819 | pivot: {x: 0.5, y: 0.5} 820 | border: {x: 0, y: 0, z: 0, w: 0} 821 | outline: [] 822 | physicsShape: [] 823 | tessellationDetail: -1 824 | bones: [] 825 | spriteID: 0f2a60709b9d2f3459b1cdb11f701fc4 826 | vertices: [] 827 | indices: 828 | edges: [] 829 | weights: [] 830 | - serializedVersion: 2 831 | name: icon_juntuan 832 | rect: 833 | serializedVersion: 2 834 | x: 121 835 | y: 13 836 | width: 33 837 | height: 34 838 | alignment: 0 839 | pivot: {x: 0.5, y: 0.5} 840 | border: {x: 0, y: 0, z: 0, w: 0} 841 | outline: [] 842 | physicsShape: [] 843 | tessellationDetail: -1 844 | bones: [] 845 | spriteID: e238e5c423d822043b5f6a226ec1c52a 846 | vertices: [] 847 | indices: 848 | edges: [] 849 | weights: [] 850 | - serializedVersion: 2 851 | name: icon_juntuanqiancheng 852 | rect: 853 | serializedVersion: 2 854 | x: 391 855 | y: 172 856 | width: 115 857 | height: 127 858 | alignment: 0 859 | pivot: {x: 0.5, y: 0.5} 860 | border: {x: 0, y: 0, z: 0, w: 0} 861 | outline: [] 862 | physicsShape: [] 863 | tessellationDetail: -1 864 | bones: [] 865 | spriteID: 38f658e804f01f04a894351ec920ba23 866 | vertices: [] 867 | indices: 868 | edges: [] 869 | weights: [] 870 | - serializedVersion: 2 871 | name: icon_kongdi 872 | rect: 873 | serializedVersion: 2 874 | x: 1 875 | y: 250 876 | width: 131 877 | height: 130 878 | alignment: 0 879 | pivot: {x: 0.5, y: 0.5} 880 | border: {x: 0, y: 0, z: 0, w: 0} 881 | outline: [] 882 | physicsShape: [] 883 | tessellationDetail: -1 884 | bones: [] 885 | spriteID: c7aee0d4015ff0a4eae6ada82e89ec9f 886 | vertices: [] 887 | indices: 888 | edges: [] 889 | weights: [] 890 | - serializedVersion: 2 891 | name: icon_shijie 892 | rect: 893 | serializedVersion: 2 894 | x: 172 895 | y: 59 896 | width: 33 897 | height: 33 898 | alignment: 0 899 | pivot: {x: 0.5, y: 0.5} 900 | border: {x: 0, y: 0, z: 0, w: 0} 901 | outline: [] 902 | physicsShape: [] 903 | tessellationDetail: -1 904 | bones: [] 905 | spriteID: b1e9b778ec595174a85c15b5d266d6c6 906 | vertices: [] 907 | indices: 908 | edges: [] 909 | weights: [] 910 | - serializedVersion: 2 911 | name: icon_sou 912 | rect: 913 | serializedVersion: 2 914 | x: 354 915 | y: 191 916 | width: 34 917 | height: 40 918 | alignment: 0 919 | pivot: {x: 0.5, y: 0.5} 920 | border: {x: 0, y: 0, z: 0, w: 0} 921 | outline: [] 922 | physicsShape: [] 923 | tessellationDetail: -1 924 | bones: [] 925 | spriteID: b0b16936efeae56478196a1de75f3b8b 926 | vertices: [] 927 | indices: 928 | edges: [] 929 | weights: [] 930 | - serializedVersion: 2 931 | name: icon_sou_02 932 | rect: 933 | serializedVersion: 2 934 | x: 73 935 | y: 126 936 | width: 18 937 | height: 22 938 | alignment: 0 939 | pivot: {x: 0.5, y: 0.5} 940 | border: {x: 0, y: 0, z: 0, w: 0} 941 | outline: [] 942 | physicsShape: [] 943 | tessellationDetail: -1 944 | bones: [] 945 | spriteID: e47484ed083069644b08cb2b4bb1fa7f 946 | vertices: [] 947 | indices: 948 | edges: [] 949 | weights: [] 950 | - serializedVersion: 2 951 | name: img1 952 | rect: 953 | serializedVersion: 2 954 | x: 464 955 | y: 305 956 | width: 43 957 | height: 38 958 | alignment: 0 959 | pivot: {x: 0.5, y: 0.5} 960 | border: {x: 0, y: 0, z: 0, w: 0} 961 | outline: [] 962 | physicsShape: [] 963 | tessellationDetail: -1 964 | bones: [] 965 | spriteID: b9153c2baccde494c8091cfb4a0fb3e4 966 | vertices: [] 967 | indices: 968 | edges: [] 969 | weights: [] 970 | - serializedVersion: 2 971 | name: img2 972 | rect: 973 | serializedVersion: 2 974 | x: 472 975 | y: 471 976 | width: 37 977 | height: 40 978 | alignment: 0 979 | pivot: {x: 0.5, y: 0.5} 980 | border: {x: 0, y: 0, z: 0, w: 0} 981 | outline: [] 982 | physicsShape: [] 983 | tessellationDetail: -1 984 | bones: [] 985 | spriteID: 3c253f188d0ae054bb419667ef0f8696 986 | vertices: [] 987 | indices: 988 | edges: [] 989 | weights: [] 990 | - serializedVersion: 2 991 | name: juntuanbiaozhi 992 | rect: 993 | serializedVersion: 2 994 | x: 230 995 | y: 76 996 | width: 24 997 | height: 31 998 | alignment: 0 999 | pivot: {x: 0.5, y: 0.5} 1000 | border: {x: 0, y: 0, z: 0, w: 0} 1001 | outline: [] 1002 | physicsShape: [] 1003 | tessellationDetail: -1 1004 | bones: [] 1005 | spriteID: daf803cfc3e8524488dfa17601461341 1006 | vertices: [] 1007 | indices: 1008 | edges: [] 1009 | weights: [] 1010 | - serializedVersion: 2 1011 | name: kongxian 1012 | rect: 1013 | serializedVersion: 2 1014 | x: 204 1015 | y: 139 1016 | width: 25 1017 | height: 24 1018 | alignment: 0 1019 | pivot: {x: 0.5, y: 0.5} 1020 | border: {x: 0, y: 0, z: 0, w: 0} 1021 | outline: [] 1022 | physicsShape: [] 1023 | tessellationDetail: -1 1024 | bones: [] 1025 | spriteID: 77ad5875108878d45aeda8454b93d687 1026 | vertices: [] 1027 | indices: 1028 | edges: [] 1029 | weights: [] 1030 | - serializedVersion: 2 1031 | name: kuang_qipao_02 1032 | rect: 1033 | serializedVersion: 2 1034 | x: 261 1035 | y: 233 1036 | width: 128 1037 | height: 128 1038 | alignment: 0 1039 | pivot: {x: 0.5, y: 0.5} 1040 | border: {x: 0, y: 0, z: 0, w: 0} 1041 | outline: [] 1042 | physicsShape: [] 1043 | tessellationDetail: -1 1044 | bones: [] 1045 | spriteID: db2b048c5e6137048bc4ffdde4fe7efb 1046 | vertices: [] 1047 | indices: 1048 | edges: [] 1049 | weights: [] 1050 | - serializedVersion: 2 1051 | name: pic_juntuan_di 1052 | rect: 1053 | serializedVersion: 2 1054 | x: 391 1055 | y: 318 1056 | width: 12 1057 | height: 43 1058 | alignment: 0 1059 | pivot: {x: 0.5, y: 0.5} 1060 | border: {x: 2, y: 2, z: 2, w: 2} 1061 | outline: [] 1062 | physicsShape: [] 1063 | tessellationDetail: -1 1064 | bones: [] 1065 | spriteID: 3d2ad38a66dd16544b6dd43a03943fec 1066 | vertices: [] 1067 | indices: 1068 | edges: [] 1069 | weights: [] 1070 | - serializedVersion: 2 1071 | name: pic_juntuan_ewaijiangli_di 1072 | rect: 1073 | serializedVersion: 2 1074 | x: 249 1075 | y: 238 1076 | width: 10 1077 | height: 13 1078 | alignment: 0 1079 | pivot: {x: 0.5, y: 0.5} 1080 | border: {x: 2, y: 4, z: 2, w: 2} 1081 | outline: [] 1082 | physicsShape: [] 1083 | tessellationDetail: -1 1084 | bones: [] 1085 | spriteID: c129df5dc535e0f419a475745d59b87e 1086 | vertices: [] 1087 | indices: 1088 | edges: [] 1089 | weights: [] 1090 | - serializedVersion: 2 1091 | name: pic_juntuan_jianglifengexian 1092 | rect: 1093 | serializedVersion: 2 1094 | x: 1 1095 | y: 507 1096 | width: 469 1097 | height: 4 1098 | alignment: 0 1099 | pivot: {x: 0.5, y: 0.5} 1100 | border: {x: 0, y: 0, z: 0, w: 0} 1101 | outline: [] 1102 | physicsShape: [] 1103 | tessellationDetail: -1 1104 | bones: [] 1105 | spriteID: 2318588463f43c443bf22cc8722260d4 1106 | vertices: [] 1107 | indices: 1108 | edges: [] 1109 | weights: [] 1110 | - serializedVersion: 2 1111 | name: pic_juntuan_paimingfenge_di 1112 | rect: 1113 | serializedVersion: 2 1114 | x: 249 1115 | y: 226 1116 | width: 10 1117 | height: 10 1118 | alignment: 0 1119 | pivot: {x: 0.5, y: 0.5} 1120 | border: {x: 2, y: 2, z: 2, w: 2} 1121 | outline: [] 1122 | physicsShape: [] 1123 | tessellationDetail: -1 1124 | bones: [] 1125 | spriteID: 76dd604b0d1c3e643bed3f4ae563dd80 1126 | vertices: [] 1127 | indices: 1128 | edges: [] 1129 | weights: [] 1130 | - serializedVersion: 2 1131 | name: pic_juntuan_paimingzong_di 1132 | rect: 1133 | serializedVersion: 2 1134 | x: 391 1135 | y: 301 1136 | width: 12 1137 | height: 15 1138 | alignment: 0 1139 | pivot: {x: 0.5, y: 0.5} 1140 | border: {x: 2, y: 4, z: 2, w: 2} 1141 | outline: [] 1142 | physicsShape: [] 1143 | tessellationDetail: -1 1144 | bones: [] 1145 | spriteID: 0ef5e130493cf8e43a6b8699fff83c58 1146 | vertices: [] 1147 | indices: 1148 | edges: [] 1149 | weights: [] 1150 | - serializedVersion: 2 1151 | name: pic_juntuan_zuixiamianxian 1152 | rect: 1153 | serializedVersion: 2 1154 | x: 442 1155 | y: 309 1156 | width: 20 1157 | height: 4 1158 | alignment: 0 1159 | pivot: {x: 0.5, y: 0.5} 1160 | border: {x: 1, y: 1, z: 1, w: 1} 1161 | outline: [] 1162 | physicsShape: [] 1163 | tessellationDetail: -1 1164 | bones: [] 1165 | spriteID: 26338d1f5b61c7e4eade93582f75f9fb 1166 | vertices: [] 1167 | indices: 1168 | edges: [] 1169 | weights: [] 1170 | - serializedVersion: 2 1171 | name: pic_sf_EA_Narrow_buildA_03 1172 | rect: 1173 | serializedVersion: 2 1174 | x: 1 1175 | y: 108 1176 | width: 34 1177 | height: 40 1178 | alignment: 0 1179 | pivot: {x: 0.5, y: 0.5} 1180 | border: {x: 0, y: 0, z: 0, w: 0} 1181 | outline: [] 1182 | physicsShape: [] 1183 | tessellationDetail: -1 1184 | bones: [] 1185 | spriteID: eac2262a82c4b314ca7594fdca4fb88d 1186 | vertices: [] 1187 | indices: 1188 | edges: [] 1189 | weights: [] 1190 | - serializedVersion: 2 1191 | name: pic_sf_yingxiongweizhi 1192 | rect: 1193 | serializedVersion: 2 1194 | x: 260 1195 | y: 97 1196 | width: 90 1197 | height: 102 1198 | alignment: 0 1199 | pivot: {x: 0.5, y: 0.5} 1200 | border: {x: 0, y: 0, z: 0, w: 0} 1201 | outline: [] 1202 | physicsShape: [] 1203 | tessellationDetail: -1 1204 | bones: [] 1205 | spriteID: 734a2ed0f10814e478a0a17770413f33 1206 | vertices: [] 1207 | indices: 1208 | edges: [] 1209 | weights: [] 1210 | - serializedVersion: 2 1211 | name: pic_sf_yuandi 1212 | rect: 1213 | serializedVersion: 2 1214 | x: 133 1215 | y: 108 1216 | width: 51 1217 | height: 51 1218 | alignment: 0 1219 | pivot: {x: 0.5, y: 0.5} 1220 | border: {x: 0, y: 0, z: 0, w: 0} 1221 | outline: [] 1222 | physicsShape: [] 1223 | tessellationDetail: -1 1224 | bones: [] 1225 | spriteID: d385ca3fa5ad08741a8f4fa981016e03 1226 | vertices: [] 1227 | indices: 1228 | edges: [] 1229 | weights: [] 1230 | - serializedVersion: 2 1231 | name: pic_yy_heilong_tk_juntuandi 1232 | rect: 1233 | serializedVersion: 2 1234 | x: 133 1235 | y: 216 1236 | width: 96 1237 | height: 26 1238 | alignment: 0 1239 | pivot: {x: 0.5, y: 0.5} 1240 | border: {x: 0, y: 0, z: 0, w: 0} 1241 | outline: [] 1242 | physicsShape: [] 1243 | tessellationDetail: -1 1244 | bones: [] 1245 | spriteID: eae7dc6ce11cc6d47b13de3ef085bfe4 1246 | vertices: [] 1247 | indices: 1248 | edges: [] 1249 | weights: [] 1250 | - serializedVersion: 2 1251 | name: qianwang 1252 | rect: 1253 | serializedVersion: 2 1254 | x: 186 1255 | y: 94 1256 | width: 42 1257 | height: 43 1258 | alignment: 0 1259 | pivot: {x: 0.5, y: 0.5} 1260 | border: {x: 0, y: 0, z: 0, w: 0} 1261 | outline: [] 1262 | physicsShape: [] 1263 | tessellationDetail: -1 1264 | bones: [] 1265 | spriteID: e100b898356d2334b93e962fa2446533 1266 | vertices: [] 1267 | indices: 1268 | edges: [] 1269 | weights: [] 1270 | - serializedVersion: 2 1271 | name: shanxing_di 1272 | rect: 1273 | serializedVersion: 2 1274 | x: 1 1275 | y: 382 1276 | width: 259 1277 | height: 123 1278 | alignment: 0 1279 | pivot: {x: 0.5, y: 0.5} 1280 | border: {x: 0, y: 0, z: 0, w: 0} 1281 | outline: [] 1282 | physicsShape: [] 1283 | tessellationDetail: -1 1284 | bones: [] 1285 | spriteID: 6cd0c328c47f8c941baf347d29c7aa3c 1286 | vertices: [] 1287 | indices: 1288 | edges: [] 1289 | weights: [] 1290 | - serializedVersion: 2 1291 | name: shixiao 1292 | rect: 1293 | serializedVersion: 2 1294 | x: 133 1295 | y: 161 1296 | width: 69 1297 | height: 28 1298 | alignment: 0 1299 | pivot: {x: 0.5, y: 0.5} 1300 | border: {x: 0, y: 0, z: 0, w: 0} 1301 | outline: [] 1302 | physicsShape: [] 1303 | tessellationDetail: -1 1304 | bones: [] 1305 | spriteID: 929f355a7772cf44fb0d05d09bff7bad 1306 | vertices: [] 1307 | indices: 1308 | edges: [] 1309 | weights: [] 1310 | - serializedVersion: 2 1311 | name: shixiaodi 1312 | rect: 1313 | serializedVersion: 2 1314 | x: 1 1315 | y: 76 1316 | width: 49 1317 | height: 30 1318 | alignment: 0 1319 | pivot: {x: 0.5, y: 0.5} 1320 | border: {x: 0, y: 0, z: 0, w: 0} 1321 | outline: [] 1322 | physicsShape: [] 1323 | tessellationDetail: -1 1324 | bones: [] 1325 | spriteID: 85185ea2d729d0a4a898b59a555c1f83 1326 | vertices: [] 1327 | indices: 1328 | edges: [] 1329 | weights: [] 1330 | - serializedVersion: 2 1331 | name: shoucang 1332 | rect: 1333 | serializedVersion: 2 1334 | x: 129 1335 | y: 64 1336 | width: 41 1337 | height: 42 1338 | alignment: 0 1339 | pivot: {x: 0.5, y: 0.5} 1340 | border: {x: 0, y: 0, z: 0, w: 0} 1341 | outline: [] 1342 | physicsShape: [] 1343 | tessellationDetail: -1 1344 | bones: [] 1345 | spriteID: 2de5cdc685cd3144ca34221e45c47221 1346 | vertices: [] 1347 | indices: 1348 | edges: [] 1349 | weights: [] 1350 | - serializedVersion: 2 1351 | name: state1 1352 | rect: 1353 | serializedVersion: 2 1354 | x: 93 1355 | y: 87 1356 | width: 34 1357 | height: 39 1358 | alignment: 0 1359 | pivot: {x: 0.5, y: 0.5} 1360 | border: {x: 0, y: 0, z: 0, w: 0} 1361 | outline: [] 1362 | physicsShape: [] 1363 | tessellationDetail: -1 1364 | bones: [] 1365 | spriteID: 87d50248ab5ece24db5f4a7799d5b79e 1366 | vertices: [] 1367 | indices: 1368 | edges: [] 1369 | weights: [] 1370 | - serializedVersion: 2 1371 | name: state2 1372 | rect: 1373 | serializedVersion: 2 1374 | x: 87 1375 | y: 7 1376 | width: 32 1377 | height: 40 1378 | alignment: 0 1379 | pivot: {x: 0.5, y: 0.5} 1380 | border: {x: 0, y: 0, z: 0, w: 0} 1381 | outline: [] 1382 | physicsShape: [] 1383 | tessellationDetail: -1 1384 | bones: [] 1385 | spriteID: 83c050678fc9657439efcc44df9463a8 1386 | vertices: [] 1387 | indices: 1388 | edges: [] 1389 | weights: [] 1390 | - serializedVersion: 2 1391 | name: state3 1392 | rect: 1393 | serializedVersion: 2 1394 | x: 37 1395 | y: 108 1396 | width: 34 1397 | height: 40 1398 | alignment: 0 1399 | pivot: {x: 0.5, y: 0.5} 1400 | border: {x: 0, y: 0, z: 0, w: 0} 1401 | outline: [] 1402 | physicsShape: [] 1403 | tessellationDetail: -1 1404 | bones: [] 1405 | spriteID: 8debab1f821a36041ad65a5f95cc7a09 1406 | vertices: [] 1407 | indices: 1408 | edges: [] 1409 | weights: [] 1410 | - serializedVersion: 2 1411 | name: tansuo 1412 | rect: 1413 | serializedVersion: 2 1414 | x: 231 1415 | y: 135 1416 | width: 25 1417 | height: 24 1418 | alignment: 0 1419 | pivot: {x: 0.5, y: 0.5} 1420 | border: {x: 0, y: 0, z: 0, w: 0} 1421 | outline: [] 1422 | physicsShape: [] 1423 | tessellationDetail: -1 1424 | bones: [] 1425 | spriteID: 509274a826ed74347ac69a8ceaa25e59 1426 | vertices: [] 1427 | indices: 1428 | edges: [] 1429 | weights: [] 1430 | - serializedVersion: 2 1431 | name: tiao_quanxian 1432 | rect: 1433 | serializedVersion: 2 1434 | x: 101 1435 | y: 201 1436 | width: 30 1437 | height: 47 1438 | alignment: 0 1439 | pivot: {x: 0.5, y: 0.5} 1440 | border: {x: 0, y: 0, z: 0, w: 0} 1441 | outline: [] 1442 | physicsShape: [] 1443 | tessellationDetail: -1 1444 | bones: [] 1445 | spriteID: 3213327498d8c8c46aec1d1fa5b72878 1446 | vertices: [] 1447 | indices: 1448 | edges: [] 1449 | weights: [] 1450 | - serializedVersion: 2 1451 | name: xingjun 1452 | rect: 1453 | serializedVersion: 2 1454 | x: 230 1455 | y: 109 1456 | width: 25 1457 | height: 24 1458 | alignment: 0 1459 | pivot: {x: 0.5, y: 0.5} 1460 | border: {x: 0, y: 0, z: 0, w: 0} 1461 | outline: [] 1462 | physicsShape: [] 1463 | tessellationDetail: -1 1464 | bones: [] 1465 | spriteID: c90d3799bb552344da76099bbe72d8f7 1466 | vertices: [] 1467 | indices: 1468 | edges: [] 1469 | weights: [] 1470 | - serializedVersion: 2 1471 | name: yidong 1472 | rect: 1473 | serializedVersion: 2 1474 | x: 44 1475 | y: 24 1476 | width: 41 1477 | height: 42 1478 | alignment: 0 1479 | pivot: {x: 0.5, y: 0.5} 1480 | border: {x: 0, y: 0, z: 0, w: 0} 1481 | outline: [] 1482 | physicsShape: [] 1483 | tessellationDetail: -1 1484 | bones: [] 1485 | spriteID: 418204597415fcb48a66b6d0f9df41c1 1486 | vertices: [] 1487 | indices: 1488 | edges: [] 1489 | weights: [] 1490 | - serializedVersion: 2 1491 | name: yishixiao 1492 | rect: 1493 | serializedVersion: 2 1494 | x: 261 1495 | y: 201 1496 | width: 91 1497 | height: 30 1498 | alignment: 0 1499 | pivot: {x: 0.5, y: 0.5} 1500 | border: {x: 0, y: 0, z: 0, w: 0} 1501 | outline: [] 1502 | physicsShape: [] 1503 | tessellationDetail: -1 1504 | bones: [] 1505 | spriteID: 28438f004a562744ea7ef5d59fd64cb9 1506 | vertices: [] 1507 | indices: 1508 | edges: [] 1509 | weights: [] 1510 | outline: [] 1511 | physicsShape: [] 1512 | bones: [] 1513 | spriteID: cf55559ec44aa964db91607c9a1c6818 1514 | vertices: [] 1515 | indices: 1516 | edges: [] 1517 | weights: [] 1518 | spritePackingTag: 1519 | pSDRemoveMatte: 0 1520 | pSDShowRemoveMatteOption: 0 1521 | userData: 1522 | assetBundleName: 1523 | assetBundleVariant: 1524 | --------------------------------------------------------------------------------