通常来说,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. C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用

    5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...

  2. HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)

    Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players tak ...

  3. java--面向抽象编程

    所谓面向抽象编程是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,及所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象.就是利用abstract来设计实现用户需求. 比如:我 ...

  4. ubuntu install rpm package

    Using command 'alien' instead of 'rpm'. sudo apt-get install alien alien -i tst.rpm 'man alien' for ...

  5. Eclipse中查看JDK源码设置

    设置方法如下: 1.路径 window-> Preferences -> Java -> Installed JRES 2.此时"Installed JRES"右 ...

  6. textbox不支持Ctrl+A

    http://stackoverflow.com/questions/5885739/why-are-some-textboxes-not-accepting-control-a-shortcut-t ...

  7. C++ STL之排序算法

    排序算法和查找算法差不多,也涉及到迭代器区间问题,关于该问题的注意事项就不在啰嗦了 一.全部排序sort.stable_sort sort是一种不稳定排序,使用时需要包含头文件algorithm 默认 ...

  8. 第六届华为创新杯编程大赛-进阶1第1轮 洞穴逃生 (bfs + 优先队列)

    这个题容易出错想了挺长时间,然后代码不长,1Y.. 做完题,看了一下别人的博客,也可以优先用 闪烁法术, 在闪烁法术不不如跑步的阶段(即魔法恢复的时候)用跑步. 洞穴逃生 描述: 精灵王子爱好冒险,在 ...

  9. class ha_innobase: public handler

    /** The class defining a handle to an Innodb table */ class ha_innobase: public handler { row_prebui ...

  10. 设置mysql的interactive_timeout和wait_timeout的值

    1,为什么要重新设置这两个变量的值? 因为如果数据库默认这两个变量的值是8小时(即28800秒)如果在8小时之内没有连接到数据库,等下次再连的时候就会抛连接超时,或连接关闭这样的异 常,但是多连接几次 ...