通常来说,Unity自带的OnGUI不太好用,靠代码完成,在场景中无法直接编辑。所以,一般项目使用NGUI插件来做界面,但我这次要修改一个游戏,它没用NGUI,也没用OnGUI,而是使用类似NGUI的原理,采用Plane这种3D物体来做界面。

其实很简单,比如你需要一个按钮,就创建一个Plane,然后用对应的图片创建一个材质,给它贴上去就行了。这样只是显示了一张图片,要实现点击效果,还要在Update函数中捕获用户输入。我这里检测到输入时,先使用ScreenToWorldPoint函数来转换输入,然后使用了Raycast射线检测方法,给碰撞到的物体发ButtonDown消息。对应的,还要发送其它需要的消息。

     void Update ()
     {
         ))
         {
             RaycastHit hit;
             Vector2 t_pos = Input.mousePosition;
             t_pos = camera2d.ScreenToWorldPoint(t_pos);
             if(Physics.Raycast(t_pos, Vector3.forward, out hit) && hit.collider.tag == "Button")
             {
                 PlaySoundOneShot(ds_pressbutton);
                 holding_button = hit.collider.gameObject;
                 holding_button.SendMessage("ButtonDown");
             }
         }
         ))
         {
             RaycastHit hit;
             Vector2 t_pos = Input.mousePosition;
             t_pos = camera2d.ScreenToWorldPoint(t_pos);
             if (Physics.Raycast(t_pos, Vector3.forward, out hit))
             {
                 if (hit.collider.gameObject == holding_button)
                 {
                     holding_button.SendMessage("ButtonUp");
                 }
             }

             if (holding_button)
             {
                 holding_button.SendMessage("ButtonReset");
                 holding_button = null;
             }
         }
     }

下面是按钮上挂的代码

    public Texture2D tex_pressed_button;
    public Texture2D tex_released_button;

    private float delay_time;

    // Use this for initialization
    void Start ()
    {
        delay_time = ;
    }

    // Update is called once per frame
    void Update ()
    {
        )
        {
            delay_time -= Time.deltaTime;
            )
            {
                ButtonActive();
            }
        }
    }

    public void ButtonDown()
    {
        renderer.material.mainTexture = tex_pressed_button;
    }

    public void ButtonUp ()
    {
        delay_time = 0.2f;
    }

    public void ButtonReset()
    {
        renderer.material.mainTexture = tex_released_button;
    }

    public void ButtonActive()
    {

    }

这样做后,基本可以实现普通的按钮、图片显示等,但还是没有NGUI好用。如果你要程序文字,不要使用GUI Text 和 GUI Texture,它们都是靠OnGUI来实现的,所以会始终置于顶层,即便你使用两个Camera来隐藏其中一个,也不能实现覆盖遮挡效果。但可以使用3D Text,把scale调小,font size调大可以使文字清晰。那怎么实现血条了?一种可行的方法是,还是用Plane,同时添加脚本,根据数值变化来调整plane宽度,然后移动plane到合适的位置。不过这个方法太麻烦了,对于血条这种,仍然可以使用3D Text来实现,只需要改变材质、调整anchor和aligment,在Text中输入文字即可,这里用'w'比较好。

使用3D物体做GUI界面的更多相关文章

  1. cocos 射线检测 3D物体 (Sprite3D点击)

    看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...

  2. 用PYTHON首选的GUI库WXPYTHON做程序界面

    大家好,我是A8U神经网络,今天又要跟大家分享一下wxWidgets开发神经网络程序界面的一些经验,希望对开发有兴趣的朋友有所帮助.跨平台的GUI工具库以GTK +,Qt和wxWidgets闻名. G ...

  3. 菜鸟试做GUI简单数据库查询界面 python+tkinter+mysql

    一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: ...

  4. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  5. matlab GUI界面编程总结

    去年做了一些关于Matlab GUI的程序,现在又要做相关的东西,回想起来,当时很多经验没有记录下来,现在回顾起来始终觉得不爽,所以从现在开始,一定要勤写记录. 从简单的例子说起吧. 创建Matlab ...

  6. Matlab GUI界面

    做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     ...

  7. Unity 3D物体的点击事件响应以及NGUI坐标和世界坐标的互相转换

    Unity 版本:4.5 NGUI版本:3.6.5 参考链接:http://game.ceeger.com/Script/Camera/Camera.ScreenPointToRay.html,Uni ...

  8. Python又把GUI界面攻下了,今天就告诉你怎么玩

    0.引言 学Python这么久了,一直想做个界面出来,最近发现Python有个内置库tkinter,利用它可以很轻松做出一些简易的UI界面,首先来看Python官方对Tkinter的说明: The t ...

  9. 【PyQt5-Qt Designer】PyQt5+pyecharts 实现GUI界面的数据可视化展示

    先用纯Python代码写一个简单的小案例: from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QApplication,QWidget ...

随机推荐

  1. ubuntu创建用户

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号 一方面可以帮助系统管理员对使用系统的用户进 ...

  2. hadoop-0.23.9安装以及第一个mapreduce测试程序

    hadoop是一个能够对大量数据进行分布式处理的软件框架.它实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计 ...

  3. 加密解密(11)HMAC-在sha1,md5基础上加密

    HMAC: Hash-based Message Authentication Code http://baike.sogou.com/v10977193.htm http://www.baike.c ...

  4. 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。

    无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败. 在Asp.Net项目中使用WebClient或HttpWebRequest时出现以上错误 解决方案:把以下代码放在 ...

  5. UVA 821 Page Hopping 网页跳跃(BFS,简单)

    题意: 给一个无权有向图,可认为边的长度为1,求两点间的平均长度(即所有点对的长度取平均),保留3位小数.保证任意点对都可达. 思路: 简单题.直接穷举每个点,进行BFS求该点到其他点的距离.累加后除 ...

  6. VS2008+ffmpeg SDK3.2调试tutorial01

    最近研究ffmpeg,在ubuntu下感觉不太好调试,老是找不到函数的声明.所以我就把他移到windows下用vs2008分析 关于环境的搭建,我参考了 http://hi.baidu.com/for ...

  7. PHP最佳实践(译)

    原文: PHP Best Practices-A short, practical guide for common and confusing PHP tasks 译者:youngsterxyf 最 ...

  8. Android 下压缩图片—微弱失真

    Android下压缩图片的方法: 大概能将3M左右的图片压缩到100K左右, 几乎不失真. 代码如下: import java.io.FileNotFoundException; import jav ...

  9. 面试题 IQ

    现在有一大块金条,它可以分为七小块金条.是这样子的,工人为你工作7天,每天都将获得一小块金条,你要做的就是发工资,切割大块金条的次数最多两次,你有什么方法让工人每天都获得一小块金条呢?

  10. 云计算服务模型,第 2 部分: 平台即服务(PaaS)

    英文原文:Cloud computing service models, Part 2: Platform as a Service 平台即服务 (PaaS) 常常是最容易让人迷惑的云计算类别,因为很 ...