DYCreateUtils类

using System;
using System.Collections;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;

namespace DY.Utils
{
    /// <summary>
    /// 工具类:创建各种组件
    /// 后续会不断的增加各种方法
    /// 1.  创建世界textmeshpro文本组件
    /// </summary>
    public static class DYCreateUtils
    {

        /// <summary>
        /// 创建一个倒计时
        /// </summary>
        /// <param name="remainTime">倒计时多久</param>
        /// <param name="localPos">文本位置在世界的哪个点</param>
        /// <returns></returns>
        public static IEnumerator CreateCountDown(int remainTime,Action eventAction, Vector3? localPos = null)
        {
            if (localPos == null) localPos = Vector3.zero;
            string textTimer = "00:30";
            TextMeshPro textMeshPro = CreateWroldTextPro(textTimer, "CountDown", null, (Vector3)localPos);

            WaitForSeconds waitForSeconds = new WaitForSeconds(1);
            while (remainTime > 0)
            {
                remainTime--;
                int min = (int)remainTime / 60;
                int second = (int)remainTime % 60;
                // int fragment = (int)(remainTime * 100 % 100);
                textMeshPro.text = string.Format("{0:00}:{1:00}", min, second);
                yield return waitForSeconds;
            }
            eventAction?.Invoke();
            MonoBehaviour.Destroy(textMeshPro.gameObject);
             yield return null;
        }




        /// <summary>
        /// 创建世界textmeshpro文本组件
        /// </summary>
        /// <param name="textContent">文本内容</param>
        /// <param name="textName">组件名</param>
        /// <param name="parent">挂载到哪个父节点</param>
        /// <param name="localPos">相对于父节点的位置</param>
        /// <param name="fontSize">文本大小</param>
        /// <param name="color">文本颜色</param>
        /// <param name="textAlignment">文本对齐方式</param>
        /// <returns></returns>
        public static TextMeshPro CreateWroldTextPro(string textContent, string textName, Transform parent = null,
       Vector3 localPos = default(Vector3), int fontSize = 40, Color? color = null,
       TextAlignmentOptions textAlignment = TextAlignmentOptions.Center)
        {
            if (color == null) color = Color.white;
            return CreateWroldTextPro(parent, localPos, textName, textContent,
                fontSize, (Color)color, textAlignment);
        }

        private static TextMeshPro CreateWroldTextPro(Transform parent, Vector3 localPos,
            string textName, string textContent, int fontSize, Color color, TextAlignmentOptions textAlignment)
        {
            GameObject go = new GameObject(textName);
            Transform transform = go.transform;
            transform.localPosition = localPos;
            transform.SetParent(parent);
            TextMeshPro textMeshPro = go.AddComponent<TextMeshPro>();
            textMeshPro.text = textContent;
            textMeshPro.fontSize = fontSize;
            textMeshPro.color = color;
            textMeshPro.alignment = textAlignment;
            return textMeshPro;
        }



        public static void CreateMesh(Vector3 localPosition, Vector3[] vertices)
        {
            GameObject go = new GameObject("Mesh");
            Transform transform = go.transform;
            transform.localPosition = localPosition;

            MeshFilter meshfilter = go.AddComponent<MeshFilter>();
            go.AddComponent<MeshRenderer>();
            meshfilter.mesh = new Mesh();
            meshfilter.mesh.name = "Mesh";
            meshfilter.mesh.vertices = vertices;

            int[] triangles = new int[3];
            triangles[0] = 0;
            triangles[1] = 1;
            triangles[2] = 6;
            meshfilter.mesh.triangles = triangles;

        }

        /*   mesh相关   */


        /// <summary>
        /// 绘制一个正方形
        /// </summary>
        /// <param name="triangles">mesh对应的三角形数组</param>
        /// <param name="i">当前正方形索引位置</param>
        /// <param name="v00">正方形左下角的顶点</param>
        /// <param name="v01">正方形左上角的顶点</param>
        /// <param name="v11">正方形右上角的顶点</param>
        /// <param name="v10">正方形右下角的顶点</param>
        /// <returns>下一个正方形的索引位置</returns>
        public static int SetQuad(int[] triangles, int i, int v00, int v01, int v11, int v10)
        {
            triangles[i] = v00;
            triangles[i + 1] = triangles[i + 4] = v01;
            triangles[i + 2] = triangles[i + 3] = v10;
            triangles[i + 5] = v11;
            return i + 6;
        }


        /// <summary>
        /// 通过设置切线,去绘制凹凸感
        /// </summary>
        /// <param name="tangents">切线数组</param>
        public static void SetTangents(Mesh mesh, Vector4[] tangents)
        {
            Vector4 tangent = new Vector4(1,0,0,-1);
            for(int i = 0; i < tangents.Length; i++)
            {
                tangents[i] = tangent;
            }
            mesh.tangents = tangents;
        }

    }
}