1.效果图

2.生成标注

标注生成要求:
1.指定元件生成标注。
2.生成标注出现位置可以设置。

根据标注生成的要求,可以在元件添加脚本时将这些信息读取并进行实现。控制标注生成在元件的位置,生成标注的距离。

  • 创建标注预制体,分别在标注预制体中设置8个连接点

  • 在MSwitchParts增加属性来保存标注出现位置信息,并提供方法进行信息的设置。

    MSwitchParts中的代码片段

    public MSwitchParts(int id, string partName, string objName, string details, string inFopostion = "Bottom0", float infoDis = 1, float infoAngle = 45, int pId = 0, List<int> pIds = null){this.Id = id;this.PartName = partName;this.ObjName = objName;this.Details = details;this.PId = pId;this.InFopostion = inFopostion;this.InfoDis = infoDis;this.InfoAngle = infoAngle;this.pIds = pIds;}

在SwitchOperation初始化数据,参数为连接点、距离、角度。

  • 这里根据设置距离、角度,需要进行生成点位置的计算
    public Vector3 GetEndPointByTrigonometric(float angle, Vector3 StartPoint, float distance){Vector3 EndPoint = Vector3.zero;//角度转弧度var radian = (angle * Math.PI) / 180;Debug.Log(Math.Cos(radian));//计算新坐标 r 就是两者的距离EndPoint.x = StartPoint.x + float.Parse((distance * Math.Cos(radian)).ToString());EndPoint.y = StartPoint.y + float.Parse((distance * Math.Sin(radian)).ToString());EndPoint.z = StartPoint.z;return EndPoint;}
  • 已知起始坐标(元件的坐标)与计算出的终点坐标,需要画上一根线连接起来。新建MyLine脚本。
using UnityEngine;[RequireComponent(typeof(LineRenderer))]
public class MyLine : MonoBehaviour
{[SerializeField]private Transform TransformA;[SerializeField]public Transform TransformB;public LineRenderer LineRender;[System.Obsolete]void Start(){TransformA = this.transform;LineRender = this.GetComponent<LineRenderer>();if (LineRender != null){LineRender.sharedMaterial = SwitchOperation.Instance.lineColormaterial;LineRender.generateLightingData = true;LineRender.SetWidth(0.008f, 0.008f);//LineRender.enabled = false;}}void Update(){if (LineRender && TransformB){LineRender.SetPosition(0, TransformA.position);LineRender.SetPosition(1, TransformB.position);}}
}
  • 修改SwitchOperation脚本实现功能。主要代码。
 //获取终点坐标var objPointPostion = GetEndPointByTrigonometric(tempModel.InfoAngle, t.position, tempModel.InfoDis);var infoRotation = t.rotation;//生成标注GameObject infoTemp = Instantiate(infoPrefabs, objPointPostion, infoRotation);//生成标注 命名infoTemp.name = "info" + t.name;//infoTemp.tag = "Info";var tempText = infoTemp.transform.Find("info").transform.Find("btnInfo").transform.Find("Text").GetComponent<Text>();tempText.text = tempModel.PartName;MyLine line = t.gameObject.AddComponent<MyLine>();if (tempModel.InFopostion != ""){line.TransformB = infoTemp.transform.Find(tempModel.InFopostion).transform;}else{line.TransformB = infoTemp.transform;}
  • SwitchOperation完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;public class SwitchOperation : MonoBehaviour
{public static SwitchOperation Instance;private List<MSwitchParts> list = new List<MSwitchParts>();[FormerlySerializedAs("infoPrefabs")][Tooltip("Prefab of the  object. Prefab must have a infoPrefabs component. May be an empty game object or a full avatar.")]public GameObject infoPrefabs;public int currentIndex = 0;public Material lineColormaterial;private void Awake(){Instance = this;}// Start is called before the first frame updatevoid Start(){InitData();}public List<MSwitchParts> GetSwitchParts(){return list;}/// <summary>/// 初始化数据/// </summary>private void InitData(){var dd = new MSwitchParts(1, "真空交流接触器", "zuoduanzhenkongjiaoliuqi2_N", "详细信息比萨饼爸爸", "Bottom1", 1.414f, 90);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(2, "电流互感器", "zuoduandianliuhuganqi1_N", "详细信息222323232", "Right", 0.8f, 180);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(3, "变压器TC", "zuoduanjiaoliuqi1_N", "详细信息222323232", "Top1", 1f, 235);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(4, "千伏级熔断器FU1", "qianfurongduanqi_N", "详细信息222323232", "Top1", 1f, -50);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(5, "中间继电器", "jidianqi2_N", "详细信息222323232", "Left", 1f, 0);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(6, "保护器", "baohuqi1_N", "详细信息222323232", "Right", 1.5f, 180);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(7, "隔离开关QS", "gelizhuanxiangkaiguan003_N", "详细信息222323232", "Bottom1", 1f, 90);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(8, "急停按钮", "jitinganniudizuo2_N", "详细信息222323232", "Right", 1.5f, 135);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);dd = new MSwitchParts(9, "阻容吸收装置", "zhurongxishouqi3_N", "详细信息222323232", "Left", 1f, 35);dd.setTask(1, "选择卸载" + dd.PartName, 7, "1");dd.setTask(2, "卸载" + dd.PartName + "的接线柱", 7, "2");dd.setTask(3, "卸载" + dd.PartName + "的固定螺丝", 7, "3");dd.setTask(4, "取出" + dd.PartName, 7, "4");list.Add(dd);Transform[] allTr = transform.GetComponentsInChildren<Transform>();int m = 0;foreach (Transform t in allTr){var tempModel = list.Find(p => p.ObjName == t.name);if (tempModel != null){Debug.Log(t.name);SwitchPart part = t.gameObject.AddComponent<SwitchPart>();part.ownerIndex = m;m++;part.mSwitchParts = tempModel;//获取终点坐标var objPointPostion = GetEndPointByTrigonometric(tempModel.InfoAngle, t.position, tempModel.InfoDis);var infoRotation = t.rotation;//生成标注GameObject infoTemp = Instantiate(infoPrefabs, objPointPostion, infoRotation);//生成标注 命名infoTemp.name = "info" + t.name;var tempText = infoTemp.transform.Find("info").transform.Find("btnInfo").transform.Find("Text").GetComponent<Text>();tempText.text = tempModel.PartName;MyLine line = t.gameObject.AddComponent<MyLine>();if (tempModel.InFopostion != ""){line.TransformB = infoTemp.transform.Find(tempModel.InFopostion).transform;}else{line.TransformB = infoTemp.transform;}}}}public Vector3 GetEndPointByTrigonometric(float angle, Vector3 StartPoint, float distance){Vector3 EndPoint = Vector3.zero;//角度转弧度var radian = (angle * Math.PI) / 180;Debug.Log(Math.Cos(radian));//计算新坐标 r 就是两者的距离EndPoint.x = StartPoint.x + float.Parse((distance * Math.Cos(radian)).ToString());EndPoint.y = StartPoint.y + float.Parse((distance * Math.Sin(radian)).ToString());EndPoint.z = StartPoint.z;return EndPoint;}public void SetCurrentIndex(int opeIndex){if (opeIndex > list.Count){currentIndex = list.Count;}else{currentIndex = opeIndex;}}public void SetCurrentInfo(){list[currentIndex].OperaStatus = "N";}public void SetCurrentFinishInfo(){list[currentIndex].OperaStatus = "T";}public GameObject GetCurrentSwitchObj(){print("GetCurrentSwitchObj:" + currentIndex);var name = list[currentIndex].ObjName;print("GetCurrentSwitchObj:" + name);var obj = UHelper.FindTheChild(this.gameObject, name).gameObject;return obj;}public MSwitchParts GetCurrentSwitchInfo(){return list[currentIndex];}
}

3.效果展示

标注显示效果不理想。这时我们在添加一个脚本使得标注总是看向主摄像机。


添加脚本LookCamera。


using UnityEngine;public class LookCamera : MonoBehaviour
{Transform m_Camera;public Camera myCamera;void Start(){if (myCamera != null){m_Camera = myCamera.transform;}else{m_Camera = Camera.main.transform;}}// Update is called once per framevoid LateUpdate(){// 这里我的角色朝向和UI朝向是相反的,如果直接用LookAt()还需要把每个UI元素旋转过来。// 为了简单,用了下面这个方法。它实际上是一个反向旋转,可以简单理解为“负负得正”吧transform.rotation = Quaternion.LookRotation(transform.position - m_Camera.position);}}

最终效果

Unity 3D模型展示之生成标注相关推荐

  1. Unity 3D模型展示之控制标注

    效果展示 标注隐藏显示 脚本SwitchOperation中增加控制隐藏显示的方法.在初始化数据时需要给用到的switchPart.info进行赋值. public void hideInfo(boo ...

  2. Unity 3D模型展示框架篇之框架运用

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 效果 ...

  3. Unity 3D模型展示框架篇之ILRuntime快速入门

    系列文章目录 Unity 3D模型展示框架篇之项目整理 Unity 3D模型展示框架篇之框架运用 Unity 3D模型展示框架篇之自由观察(Cinemachine) Unity 3D模型展示框架篇之资 ...

  4. Unity 3D模型展示框架篇之项目整理

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...

  5. Unity 3D模型展示框架篇之自由观察(Cinemachine)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...

  6. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  7. Unity 3D模型展示之UI布局

    整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...

  8. unity 3D模型展示旋转缩放

    目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...

  9. Unity 3D模型展示之模型透明效果

    效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...

最新文章

  1. SpringMVC注解整理
  2. 技术总监需要会些什么?
  3. antd Drawer 如何实现自动刷新
  4. 弯曲传传感器 WWW.TE.COM
  5. SQLite的事务和锁
  6. mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比
  7. Windows 7操作系统使用移动硬盘快速安装
  8. MSSQL-最佳实践-Always Encrypted
  9. matlab画图小记tickdir\YTick\YTick
  10. elasticsearch如何使用?
  11. Unity中使用Protobuf3.0
  12. 关于我小孩的教育意见
  13. mysql读写分离代码层实现_Mysql主从配置,实现读写分离
  14. Ubuntu配置及美化篇
  15. Android 文字转语音之TextToSpeech
  16. python 进化树_Python ete3有没有一种方法来扩展系统进化树的分支?
  17. 修改360浏览器主页
  18. webpack 打包错误
  19. 紫色店铺商家信息后台管理模板
  20. 使用shell让其在系统空闲一段时间后自动结束指定进程

热门文章

  1. ImageView图片圆形显示
  2. 第五课 工厂方法模式
  3. 滑盖全面屏对决!荣耀 Magic 2 发布,正面刚小米 MIX 3
  4. 爬取twitter数据--使用twint
  5. macos bigsur PD版本 15.1.2 (47123)虚拟机不能运行不能联网USB解决办法
  6. C++笔记 静态库和动态库详解
  7. 下列选项中能够实现python循环结构的是_模拟试卷B
  8. CF51C Three Base Stations
  9. 浅谈js宏观任务、微观任务
  10. 电脑屏幕拓展——SpaceDesk