using UnityEngine; using System.Collections.Generic; public class Logo3DCarver : MonoBehaviour { [Header("目标对象设置")] [SerializeField] private GameObject targetObject; [SerializeField] private string targetObjectName = "Object001"; [Header("Plane设置")] [SerializeField] private Vector3 planePosition = Vector3.zero; [SerializeField] private Vector3 planeRotation = Vector3.zero; [SerializeField] private Vector3 planeScale = Vector3.one; [SerializeField] private Material planeMaterial; [Header("3D文字雕刻设置")] [SerializeField] private string logoText = "LOGO"; [SerializeField] private Font logoFont; [SerializeField] private int fontSize = 48; [SerializeField] private float carveDepth = 0.1f; // 雕刻深度 [SerializeField] private Color textColor = Color.white; [SerializeField] private Vector3 textOffset = Vector3.zero; [SerializeField] private bool emboss = false; // 浮雕效果(凸起) [SerializeField] private bool carve = true; // 雕刻效果(凹陷) [Header("材质设置")] [SerializeField] private Material textMaterial; // 文字材质 [SerializeField] private bool useEmission = false; // 是否使用发光效果 [SerializeField] private Color emissionColor = Color.yellow; // 发光颜色 [SerializeField] private float emissionIntensity = 1.0f; // 发光强度 private GameObject createdPlane; private GameObject carvedText; private Mesh originalMesh; [ContextMenu("创建3D雕刻Logo")] public void Create3DCarvedLogo() { // 查找目标对象 GameObject target = targetObject; if (target == null) { target = GameObject.Find(targetObjectName); if (target == null) { Debug.LogError($"未找到名为 {targetObjectName} 的对象"); return; } } // 创建Plane CreatePlane(target); // 创建3D雕刻文字 Create3DText(); Debug.Log($"已在 {target.name} 上成功创建3D雕刻Logo"); } private void CreatePlane(GameObject parent) { // 创建Plane GameObject createdPlane = GameObject.CreatePrimitive(PrimitiveType.Plane); createdPlane.name = "LogoPlane_3D"; // 设置Transform Transform planeTransform = createdPlane.transform; planeTransform.SetParent(parent.transform); planeTransform.localPosition = planePosition; planeTransform.localRotation = Quaternion.Euler(planeRotation); planeTransform.localScale = planeScale; // 设置材质 if (planeMaterial != null) { MeshRenderer renderer = createdPlane.GetComponent(); renderer.material = planeMaterial; } // 保存原始Mesh MeshFilter meshFilter = createdPlane.GetComponent(); originalMesh = meshFilter.mesh; } private void Create3DText() { if (string.IsNullOrEmpty(logoText)) { Debug.LogWarning("Logo文字为空,跳过文字创建"); return; } // 创建3D文字对象 carvedText = new GameObject("3DLogoText"); carvedText.transform.SetParent(createdPlane.transform); carvedText.transform.localPosition = textOffset; carvedText.transform.localRotation = Quaternion.identity; // 生成3D文字Mesh Mesh textMesh = Generate3DTextMesh(); // 添加MeshFilter和MeshRenderer MeshFilter meshFilter = carvedText.AddComponent(); meshFilter.mesh = textMesh; MeshRenderer meshRenderer = carvedText.AddComponent(); // 设置材质 if (textMaterial != null) { meshRenderer.material = textMaterial; } else { // 创建默认材质 Material defaultMaterial = new Material(Shader.Find("Standard")); defaultMaterial.color = textColor; if (useEmission) { defaultMaterial.EnableKeyword("_EMISSION"); defaultMaterial.SetColor("_EmissionColor", emissionColor * emissionIntensity); } meshRenderer.material = defaultMaterial; } // 调整位置,让文字面向摄像机 carvedText.transform.LookAt(Camera.main.transform); carvedText.transform.Rotate(0, 180, 0); } private Mesh Generate3DTextMesh() { // 创建临时GameObject来生成文字 GameObject tempText = new GameObject("TempText"); TextMesh textMesh = tempText.AddComponent(); textMesh.text = logoText; textMesh.font = logoFont; textMesh.fontSize = fontSize; textMesh.color = textColor; textMesh.alignment = TextAlignment.Center; textMesh.anchor = TextAnchor.MiddleCenter; // 获取文字Mesh MeshFilter tempMeshFilter = tempText.GetComponent(); Mesh textMeshData = tempMeshFilter.sharedMesh; // 创建3D文字Mesh Mesh finalMesh = new Mesh(); if (textMeshData != null) { // 复制原始顶点和UV Vector3[] originalVertices = textMeshData.vertices; Vector2[] originalUVs = textMeshData.uv; int[] originalTriangles = textMeshData.triangles; // 创建3D顶点(前面和后面) List vertices = new List(); List uvs = new List(); List triangles = new List(); // 前面顶点 for (int i = 0; i < originalVertices.Length; i++) { vertices.Add(originalVertices[i]); uvs.Add(originalUVs[i]); } // 后面顶点 for (int i = 0; i < originalVertices.Length; i++) { Vector3 backVertex = originalVertices[i]; if (carve) { backVertex.z -= carveDepth; // 凹陷 } else if (emboss) { backVertex.z += carveDepth; // 凸起 } vertices.Add(backVertex); uvs.Add(originalUVs[i]); } // 前面三角形 for (int i = 0; i < originalTriangles.Length; i += 3) { triangles.Add(originalTriangles[i]); triangles.Add(originalTriangles[i + 1]); triangles.Add(originalTriangles[i + 2]); } // 后面三角形(反向) for (int i = 0; i < originalTriangles.Length; i += 3) { triangles.Add(originalTriangles[i + 2] + originalVertices.Length); triangles.Add(originalTriangles[i + 1] + originalVertices.Length); triangles.Add(originalTriangles[i] + originalVertices.Length); } // 侧面三角形 for (int i = 0; i < originalTriangles.Length; i += 3) { int v1 = originalTriangles[i]; int v2 = originalTriangles[i + 1]; int v3 = originalTriangles[i + 2]; int v1Back = v1 + originalVertices.Length; int v2Back = v2 + originalVertices.Length; int v3Back = v3 + originalVertices.Length; // 侧面1 triangles.Add(v1); triangles.Add(v1Back); triangles.Add(v2); triangles.Add(v2); triangles.Add(v1Back); triangles.Add(v2Back); // 侧面2 triangles.Add(v2); triangles.Add(v2Back); triangles.Add(v3); triangles.Add(v3); triangles.Add(v2Back); triangles.Add(v3Back); // 侧面3 triangles.Add(v3); triangles.Add(v3Back); triangles.Add(v1); triangles.Add(v1); triangles.Add(v3Back); triangles.Add(v1Back); } // 设置Mesh数据 finalMesh.vertices = vertices.ToArray(); finalMesh.uv = uvs.ToArray(); finalMesh.triangles = triangles.ToArray(); finalMesh.RecalculateNormals(); finalMesh.RecalculateBounds(); } // 清理临时对象 DestroyImmediate(tempText); return finalMesh; } [ContextMenu("删除3D雕刻Logo")] public void Delete3DCarvedLogo() { if (createdPlane != null) { DestroyImmediate(createdPlane); createdPlane = null; carvedText = null; Debug.Log("已删除3D雕刻Logo"); } } [ContextMenu("更新3D文字")] public void Update3DText() { if (carvedText != null) { MeshFilter meshFilter = carvedText.GetComponent(); if (meshFilter != null) { meshFilter.mesh = Generate3DTextMesh(); Debug.Log("已更新3D文字"); } } } [ContextMenu("查找目标对象")] public void FindTargetObject() { GameObject found = GameObject.Find(targetObjectName); if (found != null) { targetObject = found; Debug.Log($"已找到目标对象: {found.name}"); } else { Debug.LogWarning($"未找到名为 {targetObjectName} 的对象"); } } // 在Inspector中实时预览 private void OnValidate() { if (Application.isPlaying && carvedText != null) { Update3DText(); } } }