首页 > 其他分享 >Unity实现3D模型子物体伸出折线并显示各自名称的功能

Unity实现3D模型子物体伸出折线并显示各自名称的功能

时间:2024-10-11 15:19:45浏览次数:10  
标签:物体 Vector3 transform Unity 折线 lineRenderers public 3D

一、灵感

        在unity项目中我们经常会遇到很多介绍产品的场景需求,所以咱干脆写一个脚本来简单介绍把!话不多说,直接开干!

二、场景搭建

1、搭建一个简单的场景,创建一个cube作为最大的父物体,接着再创建一个球和一个圆柱作为cube的子物体。具体场景结构如下图:

三、实现过程

先说一些废话和思路:

1、首先我们设想的是设计一个脚本1.0版本,这个脚本会在场景启动时,从每个子物体发射一条折线,并在折线末端显示子物体的名称。后面发现有很多需要解决的问题,比如:

1、在实际场景中我们发射射线是很容易使射线重合或者错乱的,后面我就想直接生成一个三点式折线,哪三个点呢?分别是:子物体质心、外部转折点、折线尾端3个转折点。

2、Textmesh组件这东西显示文本是会丢失文本精度的!!!真可恶啊!

3、文本总是不能正常显示在折线尾部中间位置,后面想了一想,是由于没有水平居中和垂直居中的原因,小问题。

4、功能实现了折线不可控?全部数据变量写死了?这不可能,不是我的风格,好,直接把变量集成到脚本公开变量上去,把子物体信息也给我私有数组遍历展示出来,确保每一个子物体折线都可控。嘿嘿嘿。

5、再来几个小小的动态效果!

动态的射线发射是必要的吧!

动态的模型旋转是必要的吧!

动态的文本凝视摄像机是必要的吧!

好滴!终于哔哔完了!

四、功能讲解及演示

1、将脚本挂载在cube父物体上

2、启动场景,脚本会遍历cube的所有子物体形成私有数组,在数组中,可以单独设置每一个物体发射的折线的径向长度和高度这2个数值,折线的发射速度也是可调节的图中为0.5,还有一个是否进行自旋转的勾选框,最后还有一个旋转速度调节。

上视频,等会儿。。。。。。看看官方什么时候给我审核完视频吧。留个空。

五、代码

using UnityEngine;
using TMPro;
using System;

public class LineDrawer : MonoBehaviour
{
    [System.Serializable]
    public struct LineData
    {
        public string name;
        public float radialLength;
        public float lineHeight;
    }

    public LineData[] lineDataArray;
    public float lineSpeed = 1.0f; // 线条发射速度
    public bool enableRotation = false; // 控制旋转
    public float rotationSpeed = 10.0f; // 旋转速度
    private Transform[] children;
    private LineRenderer[] lineRenderers;
    private GameObject[] textObjects;

    void Start()
    {
        // 获取所有子物体
        children = new Transform[transform.childCount];
        lineRenderers = new LineRenderer[transform.childCount];
        textObjects = new GameObject[transform.childCount];

        for (int i = 0; i < transform.childCount; i++)
        {
            children[i] = transform.GetChild(i);

            // 初始化LineData
            if (i >= lineDataArray.Length)
            {
                Array.Resize(ref lineDataArray, i + 1);
            }
            lineDataArray[i].name = children[i].name;

            // 创建LineRenderer
            GameObject lineObj = new GameObject("Line");
            lineObj.transform.SetParent(transform);
            LineRenderer lr = lineObj.AddComponent<LineRenderer>();
            lr.startWidth = 0.05f;
            lr.endWidth = 0.05f;
            lr.positionCount = 3; // 三个点形成折线
            lineRenderers[i] = lr;

            // 创建TextMeshPro
            GameObject textObj = new GameObject("Text");
            textObj.transform.SetParent(transform);
            TextMeshPro textMesh = textObj.AddComponent<TextMeshPro>();
            textMesh.text = children[i].name;
            textMesh.fontSize = 6;
            textMesh.color = Color.black;
            textMesh.alignment = TextAlignmentOptions.Center; // 水平和垂直居中
            textObjects[i] = textObj;
        }
    }

    void Update()
    {
        for (int i = 0; i < children.Length; i++)
        {
            // 获取当前子物体的折线数据
            float radialLength = lineDataArray[i].radialLength;
            float lineHeight = lineDataArray[i].lineHeight;

            // 更新线条位置
            Vector3 startPosition = children[i].position;
            Vector3 bendPosition = startPosition + Vector3.right * radialLength; // 折线中间点
            Vector3 endPosition = bendPosition + Vector3.up * lineHeight; // 线条末端
            lineRenderers[i].SetPosition(0, startPosition);
            lineRenderers[i].SetPosition(1, Vector3.Lerp(lineRenderers[i].GetPosition(1), bendPosition, Time.deltaTime * lineSpeed));
            lineRenderers[i].SetPosition(2, Vector3.Lerp(lineRenderers[i].GetPosition(2), endPosition, Time.deltaTime * lineSpeed));

            // 更新文本位置
            Vector3 textPosition = lineRenderers[i].GetPosition(2);
            textObjects[i].transform.position = textPosition + new Vector3(0, 0.1f, 0); // 调整文本位置

            // 使文本面向摄像机
            textObjects[i].transform.rotation = Quaternion.LookRotation(textObjects[i].transform.position - Camera.main.transform.position);
        }

        // 旋转功能
        if (enableRotation)
        {
            transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime, Space.World);
        }
    }
}

标签:物体,Vector3,transform,Unity,折线,lineRenderers,public,3D
From: https://blog.csdn.net/lcwpillow/article/details/142853737

相关文章

  • 【unity】内置鼠标监听方法(小白版)--当鼠标放置到技能按钮处显示该技能的描述
    为了实现鼠标放置到技能按钮处显示该技能描述的效果,参考了许多资料,由于我是初学者,研究了许久才看明白,现在分享一下学习心得。效果展示图代码如下usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassSkillDataDisplay:MonoBehaviou......
  • Unity游戏通用框架——事件的订阅和发布(观察者模式)
    在游戏开发的基本思想中,逻辑与表现的分离极为重要,相互之间并不关心具体实现,只注册对应的事件,有事件发生时才调用相应的函数事件管理器usingSystem.Collections;usingSystem.Collections.Generic;publicclassevent_manager:Singletom<event_manager>{public......
  • SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上
    Mac分享吧文章目录SketchUpPro3D建模草图设计大师软件安装完成,软件打开效果一、Mac中安装SketchUpPro3D建模草图设计大师软件——v241️⃣:下载软件2️⃣:安装软件,将安装包从左侧拖入右侧文件夹中3️⃣:应用程序,打开安装的应用软件文件夹,运行SketchUp.app4️⃣:任选示例模型,......
  • 比CesiumLab还好用的工具:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台
    GIS数据处理工具在现代技术与应用中扮演着至关重要的角色,它们不仅是连接原始地理信息与可分析、可视化数据的桥梁,更是推动地理信息系统(GIS)在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据处理、分析和展示的效率和精度,本文将对比GISBox、Ce......
  • 大贤3D家谱-保存、删除与重建
    保存:对于创建的节点、内容进行本地存储。重建:清除没有保存的数据,重现保存过的历史节点。删除:删除包括该节点的所有子节点信息。灵活的使用模式​为了保证软件的持续健康发展,我们采用了试用+付费的模式。用户可以先免费体验大贤3D家谱2025的基本功能,感受其强大的家谱构建和......
  • SIGGRAPH Asia 2024 | 网易伏羲研究成果入选,3D面部动画技术再获新突破
    近日,国际计算机图形与交互技术顶会SIGGRAPHAsia2024公布论文接收结果:网易伏羲最新研究成果《FreeAvatar:Robust3DFacialAnimationTransferbyLearninganExpressionFoundationModel》成功入选。今年12月,SIGGRAPHAsia2024大会将在日本东京举行,届时网易伏羲实验室视觉......
  • 汽车3d动效的作用!云渲染实现3d动效
    在汽车营销领域,3D动效技术以其独特的视觉冲击力和交互体验,正成为吸引消费者注意力的新利器。而云渲染技术的应用,更是让这些动效如虎添翼,实现了高效、低成本的3D视觉内容制作与分享。本文将探讨汽车3D动效的作用,并分析云渲染如何助力实现这些令人惊叹的视觉效果。一、汽车3d动效......
  • 怎么修复d3dx9_40.dll缺失?运行程序时d3dx9_40.dll缺失问题的原因与解决方案
    当您在运行某些程序或游戏时,可能会遇到“d3dx9_40.dll缺失”的错误提示。这一错误通常表明DirectX9.0c组件中的d3dx9_40.dll文件未能正确安装或已被损坏。以下是对该问题的深入剖析及一系列解决方案:一、问题成因DirectX安装不完整:若DirectX9.0c的安装过程存在问题,可能会导......
  • Unity 之如何开发 VisionPro 应用
    文章目录介绍关于先决条件已确认可运行的Unity版本和软件包Unity项目版本项目中默认安装的包(模板为Universal3D)自己安装的包作为依赖项自动安装的软件包(仅摘录与开发相关的软件包)项目设置将所需组件添加到示例应用程序构建Unity项目运行应用程序时的......
  • 【Unity】数据持久化PlayerPrefs
    PlayerPrefs存储数据,数据为[key-value]形式可以用保存用户的设置、偏好;历史得分数据等;保存的数据位置不同的系统数据将被保存在不同的位置。Windows系统保存的数据将会被存储在系统注册表中,位置如下:(编辑器运行模式)\HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\DefaultCom......