From dc58b2e7194d43ea130c7f52c8b45c58007011da Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 17 Nov 2025 16:23:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=AD=97=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Localization-Assets-Shared.asset | 5 + Assets/RawResources/Art/对话框/签字底图.png | 3 + .../RawResources/Art/对话框/签字底图.png.meta | 153 +++++ Assets/Render/Renderer2Dtest.asset | 22 +- Assets/Resources/Art/Tools/plug/插头.png | Bin 10471 -> 130 bytes Assets/Resources/Art/Tools/plug/插孔.png | Bin 24679 -> 130 bytes Assets/Scenes/Persistence.unity | 231 ++++++- Assets/Scenes/SignTest.unity | 606 ++++++++++++++++++ Assets/Scenes/SignTest.unity.meta | 7 + Assets/Scripts/UI/Panel/SignBoard.cs | 280 ++++++++ Assets/Scripts/UI/Panel/SignBoard.cs.meta | 11 + Assets/Scripts/UI/UIManager.cs | 11 +- 12 files changed, 1312 insertions(+), 17 deletions(-) create mode 100644 Assets/RawResources/Art/对话框/签字底图.png create mode 100644 Assets/RawResources/Art/对话框/签字底图.png.meta create mode 100644 Assets/Scenes/SignTest.unity create mode 100644 Assets/Scenes/SignTest.unity.meta create mode 100644 Assets/Scripts/UI/Panel/SignBoard.cs create mode 100644 Assets/Scripts/UI/Panel/SignBoard.cs.meta diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset index cf3d61f15..869811d61 100644 --- a/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset @@ -171,6 +171,11 @@ MonoBehaviour: m_ReadOnly: 1 m_SerializedLabels: [] FlaggedDuringContentUpdateRestriction: 0 + - m_GUID: c3bb987a03bd4284687e2e4bd17ef561 + m_Address: Assets/Language/Config/Config Shared Data.asset + m_ReadOnly: 1 + m_SerializedLabels: [] + FlaggedDuringContentUpdateRestriction: 0 m_ReadOnly: 1 m_Settings: {fileID: 11400000, guid: 77169ce22e430f64fb36c771815a4a7b, type: 2} m_SchemaSet: diff --git a/Assets/RawResources/Art/对话框/签字底图.png b/Assets/RawResources/Art/对话框/签字底图.png new file mode 100644 index 000000000..e9dee64b7 --- /dev/null +++ b/Assets/RawResources/Art/对话框/签字底图.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80e53bf6a9f6a68310dc8fc2f132aeed50c7ac2e0e67d29303b638ff99e0b98d +size 7649 diff --git a/Assets/RawResources/Art/对话框/签字底图.png.meta b/Assets/RawResources/Art/对话框/签字底图.png.meta new file mode 100644 index 000000000..8095ed132 --- /dev/null +++ b/Assets/RawResources/Art/对话框/签字底图.png.meta @@ -0,0 +1,153 @@ +fileFormatVersion: 2 +guid: be6a10b0bf0d80a4c9f544a1acd002d3 +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 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 21.5 + 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 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 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 + ignorePlatformSupport: 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 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Render/Renderer2Dtest.asset b/Assets/Render/Renderer2Dtest.asset index 197d64d62..fdae0d5da 100644 --- a/Assets/Render/Renderer2Dtest.asset +++ b/Assets/Render/Renderer2Dtest.asset @@ -463,19 +463,15 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 _filter: - - 0.0048309183 - - 0.016401261 - - 0.04532712 - - 0.08293076 - - 0.12053438 - - 0.14946026 - - 0.1610306 - - 0.14946026 - - 0.12053438 - - 0.08293076 - - 0.04532712 - - 0.016401261 - - 0.0048309183 + - 0.007228916 + - 0.043749984 + - 0.12409639 + - 0.20444278 + - 0.24096388 + - 0.20444278 + - 0.12409639 + - 0.043749984 + - 0.007228916 --- !u!114 &-6086986437317696584 MonoBehaviour: m_ObjectHideFlags: 3 diff --git a/Assets/Resources/Art/Tools/plug/插头.png b/Assets/Resources/Art/Tools/plug/插头.png index a5c29c938cbf1b74096df8f367acb12ce7d4c1d0..1df58d5d8bfdc0917477c3e7c1964e5759a9adcf 100644 GIT binary patch literal 130 zcmWN@K@!3s3;@78uiyighLB+U8wjZ|qqZa1gRi%z-BUlk?QdJhIQr_`qmA2h>(gcZ z=1KOK>xYUv!R)QrUXv$Ykuefs2^w{#1^wnjjsi#-yw}7MI2Opll2oqnf_El>Qb@^@ M>FuW$<`BXB0mqvr_W%F@ literal 10471 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 + /// 画板组件,支持鼠标拖动绘制(UI Space) + /// 需要挂载在带有RectTransform和RawImage的GameObject上 + /// + [RequireComponent(typeof(RectTransform))] + [RequireComponent(typeof(RawImage))] + public class SignBoard : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler + { + [Header("画板设置")] + [SerializeField] private int textureWidth = 512; + [SerializeField] private int textureHeight = 512; + [SerializeField] private Color backgroundColor = Color.white; + + [Header("画笔设置")] + [SerializeField] private Color drawColor = Color.black; + [SerializeField] private int brushSize = 5; + [SerializeField] private bool smoothDrawing = true; // 是否平滑绘制(连接两点之间的所有点) + + private Texture2D drawTexture; + private RawImage drawImage; + private RectTransform rectTransform; + + private Vector2 lastDrawPoint; + private bool isDrawing = false; + + private void Awake() + { + drawImage = GetComponent(); + rectTransform = GetComponent(); + } + + private void Start() + { + InitializeTexture(); + } + + /// + /// 初始化画布纹理 + /// + private void InitializeTexture() + { + // 创建可读写的纹理 + drawTexture = new Texture2D(textureWidth, textureHeight, TextureFormat.RGBA32, false); + drawTexture.filterMode = FilterMode.Bilinear; + + // 填充背景色 + Color[] pixels = new Color[textureWidth * textureHeight]; + for (int i = 0; i < pixels.Length; i++) + { + pixels[i] = backgroundColor; + } + drawTexture.SetPixels(pixels); + drawTexture.Apply(); + + // 设置到RawImage + drawImage.texture = drawTexture; + } + + /// + /// 将屏幕坐标转换为纹理坐标 + /// + private bool ScreenToTextureCoord(Vector2 screenPos, out Vector2 textureCoord) + { + textureCoord = Vector2.zero; + + // 将屏幕坐标转换为UI本地坐标 + if (UIManager.Instance.ScreenPointToLocalPointInRectangle(rectTransform, screenPos, out Vector2 localPoint)) + { + // 检查是否在RectTransform范围内 + Rect rect = rectTransform.rect; + if (!rect.Contains(localPoint)) + { + return false; + } + + // 转换为纹理坐标 (0,0) 到 (textureWidth, textureHeight) + // localPoint的范围是 (-rect.width/2, -rect.height/2) 到 (rect.width/2, rect.height/2) + float normalizedX = (localPoint.x + rect.width / 2) / rect.width; + float normalizedY = (localPoint.y + rect.height / 2) / rect.height; + + textureCoord.x = normalizedX * textureWidth; + textureCoord.y = normalizedY * textureHeight; + + return true; + } + + return false; + } + + /// + /// 在指定位置绘制 + /// + private void DrawAtPoint(Vector2 point) + { + int centerX = Mathf.RoundToInt(point.x); + int centerY = Mathf.RoundToInt(point.y); + + // 绘制圆形笔刷 + for (int x = -brushSize; x <= brushSize; x++) + { + for (int y = -brushSize; y <= brushSize; y++) + { + // 检查是否在圆形范围内 + float distance = Mathf.Sqrt(x * x + y * y); + if (distance <= brushSize) + { + int px = centerX + x; + int py = centerY + y; + + // 检查边界 + if (px >= 0 && px < textureWidth && py >= 0 && py < textureHeight) + { + // 根据距离计算透明度,实现柔和的笔刷效果 + float alpha = 1f - (distance / brushSize); + Color finalColor = drawColor; + finalColor.a *= alpha; + + // 混合颜色 + Color existingColor = drawTexture.GetPixel(px, py); + Color blendedColor = Color.Lerp(existingColor, finalColor, finalColor.a); + drawTexture.SetPixel(px, py, blendedColor); + } + } + } + } + } + + /// + /// 在两点之间绘制线条(平滑绘制) + /// + private void DrawLine(Vector2 start, Vector2 end) + { + float distance = Vector2.Distance(start, end); + int steps = Mathf.CeilToInt(distance); + + for (int i = 0; i <= steps; i++) + { + float t = steps > 0 ? (float)i / steps : 0; + Vector2 point = Vector2.Lerp(start, end, t); + DrawAtPoint(point); + } + } + + /// + /// 应用绘制更改到纹理 + /// + private void ApplyDrawing() + { + if (drawTexture != null) + { + drawTexture.Apply(); + // 确保RawImage显示更新 + if (drawImage != null && drawImage.texture != drawTexture) + { + drawImage.texture = drawTexture; + } + } + } + + /// + /// 清除画布 + /// + public void Clear() + { + Color[] pixels = new Color[textureWidth * textureHeight]; + for (int i = 0; i < pixels.Length; i++) + { + pixels[i] = backgroundColor; + } + drawTexture.SetPixels(pixels); + drawTexture.Apply(); + } + + /// + /// 设置画笔颜色 + /// + public void SetDrawColor(Color color) + { + drawColor = color; + } + + /// + /// 设置画笔大小 + /// + public void SetBrushSize(int size) + { + brushSize = Mathf.Max(1, size); + } + + /// + /// 设置背景颜色 + /// + public void SetBackgroundColor(Color color) + { + backgroundColor = color; + } + + /// + /// 保存画布为PNG图片 + /// + public byte[] SaveToPNG() + { + return drawTexture.EncodeToPNG(); + } + + // EventSystem接口实现 + public void OnPointerDown(PointerEventData eventData) + { + if (eventData.button != PointerEventData.InputButton.Left) + return; + + if (ScreenToTextureCoord(eventData.position, out Vector2 textureCoord)) + { + isDrawing = true; + // 确保第一次点击也能绘制 + lastDrawPoint = textureCoord; + DrawAtPoint(textureCoord); + ApplyDrawing(); + + // 强制更新RawImage显示 + if (drawImage != null && drawTexture != null) + { + drawImage.texture = drawTexture; + } + } + } + + public void OnDrag(PointerEventData eventData) + { + if (!isDrawing) + return; + + if (ScreenToTextureCoord(eventData.position, out Vector2 textureCoord)) + { + if (smoothDrawing) + { + // 平滑绘制:连接两点之间的所有点 + // 如果两点距离太近,直接绘制当前点(避免DrawLine计算出错) + float distance = Vector2.Distance(lastDrawPoint, textureCoord); + if (distance < 0.1f) + { + DrawAtPoint(textureCoord); + } + else + { + DrawLine(lastDrawPoint, textureCoord); + } + } + else + { + // 直接绘制当前点 + DrawAtPoint(textureCoord); + } + + ApplyDrawing(); + lastDrawPoint = textureCoord; + } + } + + public void OnPointerUp(PointerEventData eventData) + { + isDrawing = false; + } + + private void OnDestroy() + { + // 清理纹理资源 + if (drawTexture != null) + { + Destroy(drawTexture); + } + } + } +} diff --git a/Assets/Scripts/UI/Panel/SignBoard.cs.meta b/Assets/Scripts/UI/Panel/SignBoard.cs.meta new file mode 100644 index 000000000..3d50936e3 --- /dev/null +++ b/Assets/Scripts/UI/Panel/SignBoard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e420f55b5f62d494bb382d9693528bef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/UIManager.cs b/Assets/Scripts/UI/UIManager.cs index 0d518ed8d..01fc4b00a 100644 --- a/Assets/Scripts/UI/UIManager.cs +++ b/Assets/Scripts/UI/UIManager.cs @@ -160,13 +160,18 @@ namespace AibisDream { // 转换为UI坐标 RectTransformUtility.ScreenPointToLocalPointInRectangle( - Instance.DialogCanvas, - screenPos, - Instance.UICamera, + Instance.DialogCanvas, + screenPos, + Instance.UICamera, out Vector2 localPoint); return localPoint; } + + public bool ScreenPointToLocalPointInRectangle(RectTransform rectTransform, Vector2 screenPos, out Vector2 localPoint) + { + return RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPos, UICamera, out localPoint); + } } public interface IUIManager