diff --git a/base/ImageLoader.cs b/base/ImageLoader.cs index a2dcfe3..1819794 100644 --- a/base/ImageLoader.cs +++ b/base/ImageLoader.cs @@ -2,31 +2,30 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using System.Threading.Tasks; +using System; public class ImageLoader : MonoBehaviour { // 缓存字典 private Dictionary imageCache = new Dictionary(); - //private async void Start() - //{ - // GetComponent().sprite = await LoadImageAsync("https://fantasymonster-app.oss-cn-hangzhou.aliyuncs.com/goods/mall/c7860d8909194d479b6f27ccb922e863.png"); - //} + public Sprite sprite; // 异步加载图片 public async Task LoadImageAsync(string url) { + if (!IsValidUrl(url)) + { + return sprite; + } // 如果缓存中已经有图片,则直接返回缓存的图片 if (imageCache.ContainsKey(url)) { - Debug.Log("Image found in cache."); return imageCache[url]; } // 如果缓存中没有图片,则异步加载 using (UnityWebRequest webRequest = UnityWebRequestTexture.GetTexture(url)) { - // 等待请求完成 - //await webRequest.SendWebRequest().ToTask(); // 发送请求并等待响应 var operation = webRequest.SendWebRequest(); while (!operation.isDone) @@ -43,8 +42,8 @@ public class ImageLoader : MonoBehaviour } else { - Debug.LogError("Failed to load image: " + webRequest.error); - return null; + //Debug.LogError("Failed to load image: " + webRequest.error); + return sprite; } } } @@ -54,13 +53,10 @@ public class ImageLoader : MonoBehaviour // 使用纹理的尺寸创建一个Sprite return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); } - // 加载并显示图片 - //public async void LoadAndDisplayImage(string url, Renderer renderer) - //{ - // Texture2D texture = await LoadImageAsync(url); - // if (texture != null) - // { - // renderer.material.mainTexture = texture; - // } - //} + + public static bool IsValidUrl(string url) + { + Uri uriResult; + return Uri.TryCreate(url, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); + } } diff --git a/base/ImageLoader.cs.meta b/base/ImageLoader.cs.meta index 8a3d470..90b1ff0 100644 --- a/base/ImageLoader.cs.meta +++ b/base/ImageLoader.cs.meta @@ -3,7 +3,8 @@ guid: 1a6867b83e3950542877ec6fb010c5d8 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - sprite: {fileID: 21300000, guid: a9888f3a212da7c49aefef81a2194eca, type: 3} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/base/res.meta b/base/res.meta new file mode 100644 index 0000000..0d891dd --- /dev/null +++ b/base/res.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4cbb00bc014a6c444872f516e350291b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/res/icon.jpg b/base/res/icon.jpg new file mode 100644 index 0000000..68677a7 Binary files /dev/null and b/base/res/icon.jpg differ diff --git a/base/res/icon.jpg.meta b/base/res/icon.jpg.meta new file mode 100644 index 0000000..d96c774 --- /dev/null +++ b/base/res/icon.jpg.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 687da5e613e0f564abe65073acbd99a8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/res/icon.png b/base/res/icon.png new file mode 100644 index 0000000..40b8940 Binary files /dev/null and b/base/res/icon.png differ diff --git a/base/res/icon.png.meta b/base/res/icon.png.meta new file mode 100644 index 0000000..c09dbe4 --- /dev/null +++ b/base/res/icon.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: a9888f3a212da7c49aefef81a2194eca +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/richText.meta b/base/richText.meta new file mode 100644 index 0000000..2d1fa41 --- /dev/null +++ b/base/richText.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fba6e13ad2b616044927b5998553365b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/richText/RichText.cs b/base/richText/RichText.cs new file mode 100644 index 0000000..1831d7c --- /dev/null +++ b/base/richText/RichText.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using UnityEngine; +using Debug = UnityEngine.Debug; + +public class RichText : MonoBehaviour +{ + [Header("文本预制体")] public GameObject textItem; + private string text = ""; + + public string Text + { + [DebuggerStepThrough] get => text; + [DebuggerStepThrough] + set + { + text = value; + Debug.Log("===------"); + Debug.Log("

" + text + "

"); + foreach (string item in SplitStringByTags("

" + text + "

", 23)) + { + + GameObject gameObject = Instantiate(textItem, GameObject.Find(name).transform); + gameObject.GetComponent().updateText(item); + } + + } + } + + public static string[] SplitStringByTags(string input, int maxLength) + { + // 使用正则表达式匹配

标签以及其中的内容 + var regex = new System.Text.RegularExpressions.Regex(@"

(.*?)

"); + var matches = regex.Matches(input); + + // 用于存储结果 + var resultList = new System.Collections.Generic.List(); + + foreach (System.Text.RegularExpressions.Match match in matches) + { + string line = match.Groups[1].Value; // 获取

之间的内容 + + if (line.Length > maxLength) + { + // 如果行的长度大于maxLength,则拆分成多个子字符串 + for (int i = 0; i < line.Length; i += maxLength) + { + int length = Math.Min(maxLength, line.Length - i); + resultList.Add(line.Substring(i, length)); + } + } + else + { + resultList.Add(line); + } + } + + return resultList.ToArray(); + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/base/richText/RichText.cs.meta b/base/richText/RichText.cs.meta new file mode 100644 index 0000000..6d19ec7 --- /dev/null +++ b/base/richText/RichText.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8f7862dad4a20e41b1cba0caced8a02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/richText/TextItem.cs b/base/richText/TextItem.cs new file mode 100644 index 0000000..73ced0f --- /dev/null +++ b/base/richText/TextItem.cs @@ -0,0 +1,17 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class TextItem : MonoBehaviour +{ + // Start is called before the first frame update + string text = ""; + public Text textObj; + + public void updateText(string text) + { + textObj.text = text; + this.text = text; + } +} diff --git a/base/richText/TextItem.cs.meta b/base/richText/TextItem.cs.meta new file mode 100644 index 0000000..de7ddd3 --- /dev/null +++ b/base/richText/TextItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5090ecb3a8ac1844e97d10585aeee7f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/richText/richText.prefab b/base/richText/richText.prefab new file mode 100644 index 0000000..1d551c6 --- /dev/null +++ b/base/richText/richText.prefab @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &9045295390659229329 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9045295390659229328} + - component: {fileID: 9045295390659229335} + - component: {fileID: 9045295390659229334} + - component: {fileID: 9045295390659229332} + - component: {fileID: 9045295390659229333} + m_Layer: 5 + m_Name: richText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9045295390659229328 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9045295390659229329} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 472.68884, y: -409} + m_SizeDelta: {x: 945.3777, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &9045295390659229335 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9045295390659229329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 61 + m_Right: 50 + m_Top: 38 + m_Bottom: 15 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &9045295390659229334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9045295390659229329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e8f7862dad4a20e41b1cba0caced8a02, type: 3} + m_Name: + m_EditorClassIdentifier: + textItem: {fileID: 558835775278395819, guid: 6efb80a40cba2eb419a3e3b04ef41d95, type: 3} +--- !u!114 &9045295390659229332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9045295390659229329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &9045295390659229333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9045295390659229329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 818 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/base/richText/richText.prefab.meta b/base/richText/richText.prefab.meta new file mode 100644 index 0000000..2e9b7fb --- /dev/null +++ b/base/richText/richText.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 34e251aed5d6a704d8b5e557ebd3f2ce +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/base/richText/textItem.prefab b/base/richText/textItem.prefab new file mode 100644 index 0000000..6dc1ec0 --- /dev/null +++ b/base/richText/textItem.prefab @@ -0,0 +1,282 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &558835774724421752 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 558835774724421753} + - component: {fileID: 558835774724421732} + - component: {fileID: 558835774724421735} + - component: {fileID: 558835774724421734} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &558835774724421753 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835774724421752} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 558835775278395816} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 417.18884, y: -41} + m_SizeDelta: {x: 834.3777, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &558835774724421732 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835774724421752} + m_CullTransparentMesh: 1 +--- !u!114 &558835774724421735 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835774724421752} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.43529412, g: 0.4, b: 0.39215687, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 36 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u5F00\u670D\u671F\u95F4\u9080\u8BF7\u597D\u53CB\u53EF\u8D60\u9001\u798F\u5229\uFF01\n" +--- !u!114 &558835774724421734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835774724421752} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &558835775278395819 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 558835775278395816} + - component: {fileID: 558835775278395798} + - component: {fileID: 558835775278395817} + - component: {fileID: 5233847271531102684} + m_Layer: 5 + m_Name: textItem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &558835775278395816 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775278395819} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 558835774724421753} + - {fileID: 558835775750597766} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 478.18884, y: -73.6582} + m_SizeDelta: {x: 834.3777, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &558835775278395798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775278395819} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &558835775278395817 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775278395819} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 12 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &5233847271531102684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775278395819} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5090ecb3a8ac1844e97d10585aeee7f8, type: 3} + m_Name: + m_EditorClassIdentifier: + textObj: {fileID: 558835774724421735} +--- !u!1 &558835775750597785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 558835775750597766} + - component: {fileID: 558835775750597764} + - component: {fileID: 558835775750597767} + - component: {fileID: 4730459335855531252} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &558835775750597766 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775750597785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 558835775278395816} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 417.18884, y: -94} + m_SizeDelta: {x: 834.3777, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &558835775750597764 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775750597785} + m_CullTransparentMesh: 1 +--- !u!114 &558835775750597767 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775750597785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: dafe24c3322b8674e83db659604ec4b1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4730459335855531252 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 558835775750597785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 diff --git a/base/richText/textItem.prefab.meta b/base/richText/textItem.prefab.meta new file mode 100644 index 0000000..db9d5f5 --- /dev/null +++ b/base/richText/textItem.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6efb80a40cba2eb419a3e3b04ef41d95 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/web.meta b/web.meta new file mode 100644 index 0000000..aff641a --- /dev/null +++ b/web.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0e973f1486b2c54595499d72e11c276 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/web/web.cs b/web/web.cs new file mode 100644 index 0000000..6a58cbf --- /dev/null +++ b/web/web.cs @@ -0,0 +1,109 @@ + +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Unity.VisualScripting.Antlr3.Runtime; +using UnityEngine; +using UnityEngine.Networking; + + + + +public class web : MonoBehaviour +{ + public const string URL = "http://192.168.3.103:8089"; // 被注释掉的服务器地址(常量) + //public const string URL = "ws://124.221.149.22:38445/safety/cloud"; // 被注释掉的服务器地址(常量) + + // 存储服务器返回的Cookie + private static Dictionary cookieJar = new Dictionary(); + + // 发送HTTP请求的方法,支持GET和POST等不同的请求方式 + public static async Task SendRequest(string url, string method = "GET", string jsonData = "{}", Dictionary head = null) + { + Debug.Log(url + "启动web"); // 调试输出,启动网络请求 + // 使用UnityWebRequest类进行HTTP请求,支持自定义请求方法 + using (UnityWebRequest request = new UnityWebRequest(url, method)) + { + // 设置下载处理器,用于处理服务器响应的数据 + request.downloadHandler = new DownloadHandlerBuffer(); + + // 如果是POST请求,设置请求体 + if (method == "POST" && jsonData != null) + { + // 将JSON字符串转换为字节数组 + byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData); + // 设置上传处理器,用于发送请求体数据 + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + // 设置请求头,指定请求体内容类型为JSON + request.SetRequestHeader("Content-Type", "application/json"); + } + + // 如果请求头部存在,添加请求头部信息 + if (head != null) + foreach (string key in head.Keys) + { + // 遍历传入的头部字典,逐项设置请求头部 + request.SetRequestHeader(key, head[key]); + } + + // 设置已存储的 Cookie + if (cookieJar.Count > 0) + { + // 用于存储多个cookie值的字符串 + string cookieHeader = ""; + foreach (var cookie in cookieJar) + { + // 格式化每个cookie为“键=值”的形式,并附加到字符串中,以分号分隔 + cookieHeader += $"{cookie.Key}={cookie.Value}; "; + } + // 设置请求头中的Cookie字段 + request.SetRequestHeader("Cookie", cookieHeader); + } + + // 发送请求并等待响应 + var operation = request.SendWebRequest(); + while (!operation.isDone) + await Task.Yield(); // 等待请求完成,使用await以非阻塞的方式处理 + + // 检查是否存在网络错误或协议错误 + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + // 如果有错误,输出错误信息并返回null + Debug.LogError($"Error: {request.error}" + url); + // 可以自定义弹窗提示用户错误信息,代码被注释掉了 + // Promptmgr.Instance.PromptBubble(request.error, Color.black,Color.red); + return null; + } + else + { + // 处理返回的Cookie + string setCookieHeader; + string str = request.downloadHandler.text; // 获取服务器返回的文本内容 + //Debug.Log(str); // 输出返回内容到控制台 + + // 尝试获取响应头中的“Set-Cookie”字段 + if (request.GetResponseHeaders().TryGetValue("Set-Cookie", out setCookieHeader)) + { + // 将“Set-Cookie”字段的内容按分号分隔为多个部分 + string[] cookies = setCookieHeader.Split(';'); + foreach (var cookie in cookies) + { + // 将每个cookie分为“键=值”的形式 + var cookieParts = cookie.Split('='); + if (cookieParts.Length == 2) + { + string key = cookieParts[0].Trim(); // 去掉键的空格 + string value = cookieParts[1].Trim(); // 去掉值的空格 + // 存储到cookieJar中,以备后续请求使用 + cookieJar[key] = value; + } + } + } + + // 返回响应内容(文本形式) + return request.downloadHandler.text; + } + } + } +} diff --git a/web/web.cs.meta b/web/web.cs.meta new file mode 100644 index 0000000..cb69021 --- /dev/null +++ b/web/web.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab6f4faf90aaa5443949b17cbb824e75 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: