Unity 3D模型展示之生成标注
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模型展示之生成标注相关推荐
- Unity 3D模型展示之控制标注
效果展示 标注隐藏显示 脚本SwitchOperation中增加控制隐藏显示的方法.在初始化数据时需要给用到的switchPart.info进行赋值. public void hideInfo(boo ...
- Unity 3D模型展示框架篇之框架运用
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 效果 ...
- Unity 3D模型展示框架篇之ILRuntime快速入门
系列文章目录 Unity 3D模型展示框架篇之项目整理 Unity 3D模型展示框架篇之框架运用 Unity 3D模型展示框架篇之自由观察(Cinemachine) Unity 3D模型展示框架篇之资 ...
- Unity 3D模型展示框架篇之项目整理
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...
- Unity 3D模型展示框架篇之自由观察(Cinemachine)
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...
- Unity 3D模型展示之webGL平台展现
在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...
- Unity 3D模型展示之UI布局
整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...
- unity 3D模型展示旋转缩放
目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...
- Unity 3D模型展示之模型透明效果
效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...
最新文章
- SpringMVC注解整理
- 技术总监需要会些什么?
- antd Drawer 如何实现自动刷新
- 弯曲传传感器 WWW.TE.COM
- SQLite的事务和锁
- mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比
- Windows 7操作系统使用移动硬盘快速安装
- MSSQL-最佳实践-Always Encrypted
- matlab画图小记tickdir\YTick\YTick
- elasticsearch如何使用?
- Unity中使用Protobuf3.0
- 关于我小孩的教育意见
- mysql读写分离代码层实现_Mysql主从配置,实现读写分离
- Ubuntu配置及美化篇
- Android 文字转语音之TextToSpeech
- python 进化树_Python ete3有没有一种方法来扩展系统进化树的分支?
- 修改360浏览器主页
- webpack 打包错误
- 紫色店铺商家信息后台管理模板
- 使用shell让其在系统空闲一段时间后自动结束指定进程