commit 263bb68686394654cdfba1d1520ba3ad1bef86eb Author: LiRuoChen <571244399@qq.com> Date: Fri Jun 5 14:35:42 2026 +0800 åˆ�始化å�Žå¤„ç�†é˜¶æ®µå±�幕处ç�†å™¨ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b78670b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +## [Unreleased] + +* built-in ½×¶ÎµÄ¼òÒ×´¦ÀíÆ÷ +* URP ½×¶ÎµÄ´¦ÀíÆ÷ + diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 0000000..189ec46 --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8c252a65d20865247a6d3cc2ba1f0075 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..542131f --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d673101928967242bf6cdfa9cb0ccc2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..a535c67 --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6760f91188a394147b91452bfe315216 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef new file mode 100644 index 0000000..e22d85c --- /dev/null +++ b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Lrss3.ScreendetectiongrolayerpickerUrp.Editor", + "rootNamespace": "", + "references": [ + "Lrss3.ScreendetectiongrolayerpickerUrp", + "Unity.RenderPipelines.Universal.Runtime", + "Unity.RenderPipelines.Universal.Editor", + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.Core.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta new file mode 100644 index 0000000..fccf10a --- /dev/null +++ b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 655ba29a1fbde0447bf386c055e931eb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..23dd411 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Unity å±�幕空间å�Žå¤„ç�†é˜¶æ®µæ£€æŸ¥å™¨-模型数æ�®æ��å�–器 + diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..6d97bfa --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: abe80e4311f5be343adfcf420b846c0a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..c7292da --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a825232565e66c0469f297525ad1e8cb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef new file mode 100644 index 0000000..a2ab97a --- /dev/null +++ b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Lrss3.ScreendetectiongrolayerpickerUrp", + "rootNamespace": "", + "references": [ + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.Universal.Runtime" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta new file mode 100644 index 0000000..b35c441 --- /dev/null +++ b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bbdbb3efc0f815a488c85c3dcb7a6151 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin.meta b/Runtime/MeshDetection_Builtin.meta new file mode 100644 index 0000000..8ccbd86 --- /dev/null +++ b/Runtime/MeshDetection_Builtin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1ea6370245890746869db987244b160 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs new file mode 100644 index 0000000..50e72f9 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using XericLibrary.Runtime.Type; + +namespace Deconstruction.ScreenDetection.MeshDetection +{ + /// + /// 在å±�幕上截å�–模型的表é�¢å±žæ€§ + /// + /// + public class GeoLayerPicker : MonoBehaviour + { + public Camera targetCamera; + public Material pickMaterial; + public MeshFilter[] geoMeshes; // 外部å�ªéœ€æ‹–入地质层网格 + + public Vector2Int pickRTSize = new Vector2Int(64, 64); + public Bool2 pickRTAdapt = new Bool2(false, true); + + private RenderTexture pickRT; + private Texture2D readTex; + private CommandBuffer cmd; + private float nextCheckTime; + + private static readonly int MatID = Shader.PropertyToID("_MatID"); + + // ã€�核心】缓存展平å�Žçš„绘制数æ�® + private struct SubMeshDrawData + { + public Mesh mesh; + public Matrix4x4 matrix; + public int subMeshIndex; + public int uniqueMatID; // 分é…�给这个æ�’槽的唯一ID + } + + private List drawList = new List(); + + void Start() + { + // 1. 展平所有网格的 SubMesh + if (geoMeshes != null) + { + int globalIDCounter = 1; // ID从1开始,0留给背景 + foreach (var mf in geoMeshes) + { + if (mf == null || mf.sharedMesh == null) continue; + + Mesh mesh = mf.sharedMesh; + Matrix4x4 matrix = mf.transform.localToWorldMatrix; + + // é��历这个网格上的æ¯�一个æ��è´¨æ�’æ§½ + for (int sub = 0; sub < mesh.subMeshCount; sub++) + { + drawList.Add(new SubMeshDrawData + { + mesh = mesh, + matrix = matrix, + subMeshIndex = sub, + uniqueMatID = globalIDCounter++ + }); + } + } + } + + // 2. åˆ�始化 RT å’Œ CommandBuffer + pickRT = new RenderTexture(pickRTSize.x, pickRTSize.y, 0, RenderTextureFormat.ARGB32); + pickRT.Create(); + readTex = new Texture2D(pickRTSize.x, pickRTSize.y, TextureFormat.RGBA32, false); + + cmd = new CommandBuffer(); + cmd.name = "GeoLayerPickBuffer"; + targetCamera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cmd); + } + + void Update() + { + // if (Time.time < nextCheckTime) return; + // nextCheckTime = Time.time + 0.2f; + + cmd.Clear(); + + // 视å�£è®¾ç½® + var screenSize = new Vector2(Screen.width, Screen.height); + var screenStart = (screenSize - pickRTSize) / 2; + Rect pickRect = new Rect(pickRTAdapt.X * screenStart.x, pickRTAdapt.Y * screenStart.y, pickRTAdapt.x ? Screen.width : pickRTSize.x, + pickRTAdapt.x ? Screen.height : pickRTSize.y); + cmd.SetViewport(pickRect); + cmd.SetRenderTarget(pickRT); + cmd.ClearRenderTarget(true, true, Color.clear); + + // ã€�核心】é��历展平å�Žçš„ SubMesh 列表进行绘制 + for (int i = 0; i < drawList.Count; i++) + { + var data = drawList[i]; + pickMaterial.SetInt(MatID, data.uniqueMatID); + + // 使用带 submeshIndex å�‚æ•°çš„ DrawMesh é‡�è½½ + cmd.DrawMesh(data.mesh, data.matrix, pickMaterial, data.subMeshIndex); + } + + // 读å�–åƒ�ç´  + RenderTexture.active = pickRT; + readTex.ReadPixels(new Rect(0, 0, pickRTSize.x, pickRTSize.y), 0, 0); + readTex.Apply(); + RenderTexture.active = null; + + ProcessPickedData(); + } + + void ProcessPickedData() + { + Color32[] pixels = readTex.GetPixels32(); + // è§£ç � pixels 中的 uniqueMatID å’Œ WorldPos + // æ ¹æ�® uniqueMatID å��查地质层信æ�¯å¹¶æ›´æ–° UI... + } + } +} \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta new file mode 100644 index 0000000..7bc6af7 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 04e13623766d409e9c979b15693bb2dd +timeCreated: 1780626411 \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader new file mode 100644 index 0000000..86abbcc --- /dev/null +++ b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader @@ -0,0 +1,62 @@ +Shader "XericLibrary/ScreenDectection/MeshPicking" +{ + Properties + { + // ´«Èë²ÄÖÊID + _MatID ("Material ID", Int) = 0 + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + // ¹Ø±Õ¹âÕÕºÍÎíЧ£¬´¿Êý¾ÝÊä³ö + Lighting Off + Fog { Mode Off } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float3 worldPos : TEXCOORD0; // ´«µÝÊÀ½ç×ø±ê¸øÆ¬¶Î×ÅÉ«Æ÷ + }; + + int _MatID; // ½ÓÊÕ²ÄÖÊID + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + // ¼ÆËãÊÀ½ç×ø±ê²¢´«µÝ + o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // 1. ½«ÊÀ½ç×ø±ê±àÂëµ½ RGB ͨµÀ + // ¼ÙÉèÄãµÄµØÖÊÄ£ÐÍÊÀ½ç×ø±ê·¶Î§ÔÚ -1000 µ½ 1000 Ö®¼ä + // ¼ÓÉÏ 1000 ±ä³É 0~2000£¬ÔÙ³ýÒÔ 2000 ±ä³É 0~1 + float3 encodedPos = (i.worldPos + 1000.0) / 2000.0; + + // 2. ½«²ÄÖÊID±àÂëµ½ Alpha ͨµÀ (¼ÙÉèID²»³¬¹ý255) + float encodedID = _MatID / 255.0; + + // Êä³ö RGBA = (PosX, PosY, PosZ, MatID) + return fixed4(encodedPos.x, encodedPos.y, encodedPos.z, encodedID); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta new file mode 100644 index 0000000..3b20cd5 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 624bb1fb3e89c5342ba64aec70bfd6af +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin/XMeshPicking.mat b/Runtime/MeshDetection_Builtin/XMeshPicking.mat new file mode 100644 index 0000000..dc5eb48 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/XMeshPicking.mat @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: XMeshPicking + m_Shader: {fileID: 4800000, guid: 624bb1fb3e89c5342ba64aec70bfd6af, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _MatID: 73 + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta b/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta new file mode 100644 index 0000000..bef56e2 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed648077cd0dc06418a72fd06e15af7b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_URP.meta b/Runtime/MeshDetection_URP.meta new file mode 100644 index 0000000..dc2b6c2 --- /dev/null +++ b/Runtime/MeshDetection_URP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ca912e2c263eab47b131fc429db0a39 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs new file mode 100644 index 0000000..f1d8638 --- /dev/null +++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs @@ -0,0 +1,143 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +#if UNITY_2022_1_OR_NEWER // urp 13 +namespace XericLibrary.PostProcess +{ + // ¶¨ÒåÊý¾Ý½á¹¹£¬ÓÃÀ´´æ´¢Õ¹Æ½ºóµÄ SubMesh ÐÅÏ¢ + [System.Serializable] + public struct SubMeshDrawData + { + public Mesh mesh; + public Matrix4x4 matrix; + public int subMeshIndex; + public int uniqueMatID; + } + + public class GeoLayerPickerRenderPassFeature : ScriptableRendererFeature + { + + // ÔÚ Feature ÍⲿÀàÖУ¬Ìí¼Ó Inspector Ãæ°åÐèÒªµÄÅäÖòÎÊý + [Header("ʰȡÉèÖÃ")] + public Material pickMaterial; + public MeshFilter[] geoMeshes; + public Vector2Int pickRTSize = new Vector2Int(64, 64); + + // ÄÚ²¿³ÖÓеÄ×ÊÔ´ + private RenderTexture m_PickRT; + private List m_DrawList = new List(); + + class GeoLayerPickerRenderPass : ScriptableRenderPass + { + public Material passMaterial; + public RenderTexture passRT; + public List passDrawList; + + private int m_MatIDProperty = Shader.PropertyToID("_MatID"); + + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + // ÔÚ URP ÖУ¬±ØÐëÔÚÕâÀï¸æËß¹ÜÏßÎÒÃÇÒªäÖȾµ½ÄÄÕÅ RT ÉÏ + if (passRT != null) + { + ConfigureTarget(new RenderTargetIdentifier(passRT)); + ConfigureClear(ClearFlag.All, Color.clear); + } + } + + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + // °²È«¼ì²é + if (passMaterial == null || passRT == null || passDrawList == null || passDrawList.Count == 0) + return; + + // ´Ó¶ÔÏ󳨻ñÈ¡ CommandBuffer (ÐÔÄܸüºÃ) + CommandBuffer cmd = CommandBufferPool.Get("GeoLayerPickBuffer"); + + // ÔÚ URP 13 ÖУ¬¾ø¶Ô²»ÄÜÔÚ Execute ÀïÓà cmd.SetRenderTarget()¡£±ØÐëÖØÐ´ OnCameraSetup£¬Ê¹Óà ConfigureTarget() ¸æËß URP Õâ¸ö Pass µÄÊä³öÄ¿±êÊÇÄã´´½¨µÄ m_PickRT¡£ + // ÉèÖÃÊÓ¿ÚΪ RT µÄ³ß´ç (64x64) + cmd.SetViewport(new Rect(0, 0, passRT.width, passRT.height)); + + // ¡¾ºËÐÄ¡¿±éÀú»æÖÆÃ¿Ò»¸ö SubMesh + for (int i = 0; i < passDrawList.Count; i++) + { + var data = passDrawList[i]; + cmd.SetGlobalInt(m_MatIDProperty, data.uniqueMatID); + // ×¢ÒâµÚËĸö²ÎÊý submeshIndex£¬ÕâÊǶà²ÄÖʲå²ÛµÄ¹Ø¼ü + cmd.DrawMesh(data.mesh, data.matrix, passMaterial, data.subMeshIndex); + } + + // Ìá½»ÃüÁî¸ø GPU Ö´ÐÐ + context.ExecuteCommandBuffer(cmd); + CommandBufferPool.Release(cmd); + } + + public override void OnCameraCleanup(CommandBuffer cmd) + { + } + } + + GeoLayerPickerRenderPass m_ScriptablePass; + + public override void Create() + { + m_ScriptablePass = new GeoLayerPickerRenderPass(); + + m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + + // ¡¾²½Öè 4¡¿ÔÚ Create Öгõʼ»¯ RT£¬²¢Õ¹Æ½ SubMesh Êý¾Ý + if (m_PickRT != null) m_PickRT.Release(); + m_PickRT = new RenderTexture(pickRTSize.x, pickRTSize.y, 0, RenderTextureFormat.ARGB32); + m_PickRT.Create(); + + RebuildDrawList(); + } + + + // Ìṩһ¸ö¹«¿ª·½·¨£¬·½±ãÔËÐÐʱ¶¯Ì¬Ë¢ÐÂÍø¸ñÁбí + public void RebuildDrawList() + { + m_DrawList.Clear(); + if (geoMeshes == null) + return; + + int globalIDCounter = 1; // ID ´Ó 1 ¿ªÊ¼£¬0 Áô¸ø±³¾° + foreach (var mf in geoMeshes) + { + if (mf == null || mf.sharedMesh == null) continue; + + // ±éÀúÍø¸ñµÄÿһ¸ö²ÄÖʲå²Û (SubMesh) + for (int sub = 0; sub < mf.sharedMesh.subMeshCount; sub++) + { + m_DrawList.Add(new SubMeshDrawData + { + mesh = mf.sharedMesh, + matrix = mf.transform.localToWorldMatrix, + subMeshIndex = sub, + uniqueMatID = globalIDCounter++ + }); + } + } + } + + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + // ½«ÍⲿÊý¾Ý´«µÝ¸øÄÚ²¿µÄ Pass£¬²¢×¢Èë¹ÜÏß + if (m_ScriptablePass != null) + { + m_ScriptablePass.passMaterial = pickMaterial; + m_ScriptablePass.passRT = m_PickRT; + m_ScriptablePass.passDrawList = m_DrawList; + + renderer.EnqueuePass(m_ScriptablePass); + } + } + + + // ±©Â¶ RT ¸øÍⲿ¶ÁÈ¡ÏñËØÓà + public RenderTexture GetPickRT() => m_PickRT; + } +} +#endif \ No newline at end of file diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta new file mode 100644 index 0000000..d31e1a9 --- /dev/null +++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 743401b70b599714a91857602199159a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..798fb3a --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "name": "com.lrss3.screendetectiongrolayerpicker-urp", + "displayName": "ScreenDetectionGroLayerPicker-URP", + "version": "0.1.0", + "unity": "2022.1", + "description": "\u6293\u53d6\u5c4f\u5e55\u4e2d\u770b\u5230\u7684\u6a21\u578b\u4fe1\u606f" +} \ No newline at end of file diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..446dc5f --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b4f64761718f61141ba89ea791fe26e0 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: