查看: 790|回复: 0
打印 上一主题 下一主题

[其他] Unity3D教程:自定义mesh做指向信息面板效果

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-9-30 00:57:53 |只看该作者 |倒序浏览

运用unity中Mesh,做一个信息指向的效果。先说下此功能的主要部分就是屏幕坐标与三维坐标的转换。也是一个比较难理解的地方。信息面板用的NGUI做的。因为获取的是显示器的分辨率,所以在全屏下运行才可看到效果。


代码如下:

using UnityEngine;   
using System.Collections;  

  
             public class DrawMesh : MonoBehaviour {  

  
                  GameObject gameobj; //绘制mesh的物体,如果是多个可以动态的生成      

  
                  public Camera cameraObj;   //NGUI中的摄像机      

  
                  public GameObject lookObject;//被指向的物体   

  
                  // Use this for initialization      

  
                  float x = 0;//屏幕的宽      

  
                  float y = 0;//屏蔽的高      

  
                  Color color;   

  
                  void Start () {           

  
                        color = Color.white;         

  
                        x = Screen.currentResolution.width;  //屏幕分辨率           

  
                        y = Screen.currentResolution.height;           

  
                       //这个地方我是动态获得的一个空的物体对象。用来创建三角形指示面片的。           

  
                       gameobj = (GameObject)Instantiate(Resources.Load("GameObject"));   

  
                }      

  
               // Update is called once per frame   

  
               void Update () {           

  
                      GetPositon();   

  
               }  

  
               //绘制三角面片      

  
               void DrawTrianglesEX(GameObject triangles, Vector3 port1, Vector3 port2, Vector3 port3, Color color)      

  
              {           

  
                    color.a = 0.8f;//面片的透明度           

  
                    if (triangles.GetComponent<MeshFilter>() == null)           

  
                   {              

  
                            triangles.AddComponent<MeshFilter>();  //添加MeshFilter              

  
                            triangles.AddComponent<MeshRenderer>();//添加MeshRenderer               

  
                           //获得着色器               

  
                          triangles.renderer.material.shader = Shader.Find("Transparent/Diffuse");           

  
                   }  //unity3d教程手册www.unitymanual.com         

  
                  //实时改变颜色           

  
                  triangles.renderer.material.color = color;           

  
                  Mesh mesh = triangles.GetComponent<MeshFilter>().mesh;           

  
                  mesh.Clear();  

  
                  //这个是主要的点的转换,在视窗位置转换成时间坐标位置。           

  
                  Vector3 v1 = triangles.transform.InverseTransformPoint(port1);           

  
                 Vector3 v2 = triangles.transform.InverseTransformPoint(Camera.main.ViewportToWorldPoint(port2));           

  
                 Vector3 v3 = triangles.transform.InverseTransformPoint(Camera.main.ViewportToWorldPoint(port3));           

  
                 mesh.vertices = new Vector3[] { v1, v2, v3 };           

  
                 mesh.triangles = new int[] { 0, 1, 2 };      

  
                }  

  
               //获得三个点的位置,并且转化为屏幕坐标      

  
              void GetPositon()     {           

  
                    Vector3 po = cameraObj.WorldToScreenPoint(transform.position);      

  
          //在这个地方是生算的,这边完全可以算出面板的宽与高。注意的是2D摄相机与主摄像机的关系。建议不要去生算。      

  
                    Vector3 po1 = new Vector3(po.x / x+0.075f, po.y / y, 1f);           

  
                    Vector3 po2 = po1 - new Vector3(0, 0.1f, 0);         

  
                    Vector3 v = lookObject.renderer.bounds.size;           

  
                    Vector3 equPosScreen = lookObject.transform.position+ new Vector3(0, v.y, 0);           

  
                    Vector3 po3 = equPosScreen;     

  
                    DrawTrianglesEX(gameobj, po3, po2, po1, color);      

  
               }   

  
            }  


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-13 19:38 , Processed in 0.060990 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部