U3D 代码生成简单的Mesh

本文介绍如何在Unity3D中通过创建不同形状的网格来实现技能指示器效果,包括扇形、圆形和矩形等,并探讨了纹理UV坐标系、三角面方向及其在视觉呈现上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图

这里写图片描述

辅助理解代码的图解

u3d 2d纹理 uv坐标系

这里写图片描述

u3d Mathf.cos,sin三角函数的角度关系

这里写图片描述

u3d 三角面正反

这里写图片描述
总结为:三角面在投影坐标下的顶点连接顺序顺时针为正面逆时针为反面
当然指定顺时针、或逆时针为正,在底层是可以设置的。

材质中使用到的纹理(自己用PS画就OK了)

这里写图片描述

代码

    /// <summary>
    /// author  :   Jave.Lin
    /// date    :   2018-05-03
    /// </summary>

    // sector
    public float sector_direction_degree = 90f;
    public float sector_theta_degree = 160;
    public int sector_segment = 15;
    public float sector_radius = 2;
    // circle
    public float circle_radius = 2;
    public int circle_segment = 30;
    // rect
    public float rect_side_len = 2;
    public void OnCreateSectorBtnClick()
    {
        _CreatSector(sector_direction_degree, sector_theta_degree, sector_radius, sector_segment);
    }
    public void OnCreateCircileBtnClick()
    {
        _CreatSector(0, 360, circle_radius, circle_segment);
    }
    public void OnCreateRectBtnClick()
    {
        _CreatSector(0, 360, rect_side_len, 4);
    }
    private void _CreatSector(float dir_degree, float theta_degree, float radius, int segment)
    {
        var go = new GameObject("TestMesh");
        var mf = go.AddComponent<MeshFilter>();
        var mr = go.AddComponent<MeshRenderer>();
        var m = new Mesh();

        const float oneRadian = (Mathf.PI / 180);
        var angle = oneRadian * dir_degree + oneRadian * (theta_degree * 0.5f);
        var stepAngle = oneRadian * (theta_degree / segment);
        var firstX = 0; var firstY = 0;

        Vector3[] vertices = new Vector3[3 + segment - 1];
        vertices[0] = new Vector3(firstX, firstY, 0);
        for (int i = 1; i < vertices.Length; i++)
        {
            vertices[i] = new Vector3(
                firstX + Mathf.Cos(angle) * radius,
                firstY + Mathf.Sin(angle) * radius, 0);
            angle -= stepAngle;
        }

        var triangles = new int[3 * segment];
        for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++)
        {
            triangles[i] = 0;
            triangles[i + 1] = vi;
            triangles[i + 2] = vi + 1;
        }

        var uvs = new Vector2[vertices.Length];
        uvs[0] = new Vector2(0.5f, 0);
        var count = uvs.Length - 1;
        for (int i = 1; i < uvs.Length; i++)
        {
            uvs[i] = new Vector2(i / count, 1);
        }
        m.vertices = vertices;
        m.triangles = triangles;
        m.uv = uvs;
        m.name = "MyMesh";

        mf.mesh = m;
        mr.material = Resources.Load<Material>("Materials/TestMesh1");

        go.transform.position = new Vector3(4, 4);
    }
    // 上面的顶点vertices,与三角索引组合triangles都会影响生成的三角面对于镜头来说,是正,还是反面
    // 如果开启了背面剔除,导致网格看不见,大家需要注意这点就OK了
    // 目前这种材质、与UV的设置,是控制不了类似王者荣耀的技能提示边缘的
    // 下次有时间,才实现两种方式来达效果:shader 以一个固定长度,直接设置颜色(RGBA),或是采样纹理(RGBA)

参考

Unity3D+moba+技能指示器(二)

<think>嗯,用户这次询问的是Unity2023中升级TextMeshPro版本的具体方法。从对话历史看,用户之前关注过EasySave与TextMeshPro的兼容性问题,现在可能正在实际开发中遇到了版本升级需求。用户提供的引用材料很有价值,特别是[1][2]提到的TexttoTextMeshPro升级工具和[3]指出的中文字体问题。看来用户需要的不仅是一般的升级步骤,更需要考虑中文支持等实际开发细节。结合Unity2023的特性,我需要重点说明三个层面:首先是标准升级流程,其次是中文等特殊字体的处理方案,最后还要注意向后兼容性——因为用户之前使用过EasySave,存档兼容性问题很可能会在实际升级后暴露。值得补充的是,Unity2023.1开始将TextMeshPro设为默认UI系统[^3],这个改变使得升级过程比旧版本更简单。不过测试环节反而更重要,特别是用户提到过中文显示需求,必须单独验证动态字体加载是否正常。用户应该是有Unity开发经验的,但可能没处理过字体资源升级这类细节问题。所以操作步骤要拆解得足够细致,比如AssetBundle字体重建这种高阶内容可以放在进阶处理环节说明。</think> 在Unity 2023中升级TextMesh Pro版本,需按以下流程操作(以升级至最新稳定版为例): --- ### **升级操作步骤** #### **1. 备份项目** ```bash # 建议备份以下目录: Assets/TextMesh Pro/ Assets/Plugins/ Assets/Resources/Fonts/ ``` #### **2. 卸载旧版本** 1. **通过Package Manager卸载** `Window > Package Manager` → 搜索"TextMesh Pro" → 点击右下角"Remove" 2. **手动删除残留文件** 删除`Assets/TextMesh Pro/`文件夹(若存在) #### **3. 安装新版本** 1. **Package Manager安装** `Package Manager` → `+` → `Add package by name` → 输入: ```bash com.unity.textmeshpro ``` 2. **指定版本(可选)** 在`Packages/manifest.json`中添加版本号: ```json "dependencies": { "com.unity.textmeshpro": "3.0.6" // 替换为目标版本 } ``` #### **4. 字体配置(关键)** 1. **重建字体资源** 对需要中文支持的项目: - `Window > TextMeshPro > Font Asset Creator` - 选择中文字体文件(如.ttf) - **字符集设置**: ![](https://via.placeholder.com/400x200?text=字符集选择SIPO+GB2312+覆盖中文) - 生成后保存到`Assets/Resources/Fonts/` 2. **应用新字体** 在TMP组件中替换字体引用: ```csharp TMP_Text textComponent = GetComponent<TMP_Text>(); textComponent.font = Resources.Load<TMP_FontAsset>("Fonts/MyChineseFont"); ``` --- ### **兼容性处理** #### **场景文本迁移** 1. 使用 **Text to TextMeshPro Upgrade Tool**[^1] `Tools > Upgrade Project to TextMeshPro` → 勾选"Replace in scene objects" 2. 手动修复缺失引用: ![](https://via.placeholder.com/400x150?text=TMP组件黄色警告需重链字体) #### **代码适配** 需调整旧版API: ```diff - textMesh.fontStyle = FontStyle.Bold; + textMesh.fontStyle = FontStyles.Bold; ``` #### **存档兼容** 若使用Easy Save等工具: ```csharp // 加载旧存档时的转换逻辑 string oldText = ES3.Load<string>("saveKey"); TMP_Text newText = GetComponent<TMP_Text>(); newText.text = ConvertLegacyFormat(oldText); // 自定义格式转换方法 ``` --- ### **验证清单** 1. 检查所有UI场景是否显示正常(特别关注中文) 2. 测试动态生成的文本(如日志、数值变化) 3. 验证AssetBundle中的字体加载 4. 确认控制台无TMP相关报错 > 📌 **重要提示**:若从低于**3.0.0**的版本升级,建议在测试环境先行验证!部分旧版材质参数需手动迁移[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值