使用3D物体做GUI界面

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

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


 1     void Update ()
2 {
3 if(Input.GetMouseButtonDown(0))
4 {
5 RaycastHit hit;
6 Vector2 t_pos = Input.mousePosition;
7 t_pos = camera2d.ScreenToWorldPoint(t_pos);
8 if(Physics.Raycast(t_pos, Vector3.forward, out hit) && hit.collider.tag == "Button")
9 {
10 PlaySoundOneShot(ds_pressbutton);
11 holding_button = hit.collider.gameObject;
12 holding_button.SendMessage("ButtonDown");
13 }
14 }
15 else if (Input.GetMouseButtonUp(0))
16 {
17 RaycastHit hit;
18 Vector2 t_pos = Input.mousePosition;
19 t_pos = camera2d.ScreenToWorldPoint(t_pos);
20 if (Physics.Raycast(t_pos, Vector3.forward, out hit))
21 {
22 if (hit.collider.gameObject == holding_button)
23 {
24 holding_button.SendMessage("ButtonUp");
25 }
26 }
27
28 if (holding_button)
29 {
30 holding_button.SendMessage("ButtonReset");
31 holding_button = null;
32 }
33 }
34 }

下面是按钮上挂的代码


    public Texture2D tex_pressed_button;
public Texture2D tex_released_button;

private float delay_time;

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

// Update is called once per frame
void Update ()
{
if (delay_time > 0)
{
delay_time -= Time.deltaTime;
if (delay_time <= 0)
{
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‘比较好。

时间: 2025-01-04 15:25:45

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

cocos&#160;射线检测 3D物体 (Sprite3D点击)

看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个point 转化为 一条射线, 然后从一个3D物体拿到碰撞盒后调用intersects 就可以了. : void HelloWorld::onEnter(){ Scene::onEnter(); //添加一只3D的乌龟在场景, 作为一个按钮 auto orc = cocos2d::Sprite3D::cr

python基础-简单的GUI界面

采用tkinter实现了几个简单的GUI界面 调用tkinter的方式非常简单,只需要如下几行代码 1 import Tkinter 2 top = Tkinter.Tk() 3 # Code to add widgets will go here... 4 top.mainloop() 使用Button import Tkinter import tkMessageBox top = Tkinter.Tk() #add a function def hello(): tkMessageBox.

GUI界面资源

30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音 创造力是指任何一种演示设计i的能力.无论是一个标志,旗帜,广告或一个完整的设计,能够注入的创造力不仅看出设计者表达的信息,也对观众留下坚实的印象.良好的设计是不容易的事情,创造,它往往是一个非常具有挑战性的工作,发现创意设计.不过,也有一些方法,通过它可以提高你的设计技能.其中之一是分析其他设计的每一个细节背后的灵感.,今天就给大家推荐这些具有创意的免费设计模板PSD的模板,载体,模具或图标,

Matlab GUI界面

做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序.一:创建GUI1.在 .m文件中动态添加 例如 h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,… 'numbertitle','of

GJM:Unity开发HTC vive 三、远处拖动3D物体 【转载】

腾讯GAD 窗间风月 原文URL : http://gad.qq.com/article/detail/7192223 版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 在项目中会需要拖动远处的物体,这种要如何去实现,下面就给大家介绍下在Unity HTC vive开发中远处拖动3D物体的教程. 效果如下,手柄射线照射到3D物体的时候,可以通过Trigger按钮抓住物体并拖动 1.导入SDK:SteamVR Plugin和Vive Input Utility 2.删除场景中的默认摄像机,将C

matlab GUI界面编程总结

去年做了一些关于Matlab GUI的程序,现在又要做相关的东西,回想起来,当时很多经验没有记录下来,现在回顾起来始终觉得不爽,所以从现在开始,一定要勤写记录. 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序.一:创建GUI1.在 .m文件中动态添加 例如 h_main=figure(‘name’,‘a demo of gui design

Qt多线程和GUI界面假死

QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事件队列(每一个线程都有一个属于自己的事件队列)中的事件.简单用代码描述如下: 1 int QThread::exec() 2 { 3 //... 4 QEventLoop eventLoop; 5 int returnCode = eventLoop.exec(); 6 //... 7 return

转:Python 简单串口收发GUI界面

https://blog.csdn.net/freedom098/article/details/48211567 忙活了三个多小时,连学带做,总算是搞出来了一个具有基本功能的串口通信PC机的GUI界面,Tkinter在python中确实很好用,而且代码量确实也很少,不足的是Tkinter不自带combox,但是幸运的是我下载的2.7版本自带了包含有combox的ttk模块,于是乎问题就顺利解决了.下面是源代码,一些错误提示功能还没有做,目前只是简单地实现了下位机与PC的通信界面,下位机还是用的

第一次做winform界面问题总结

1.winform窗体 a. 最大,最小按钮:this.maxizebox,this.minizebox b.不允许用户修改窗口大小: this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; c.修改标题: this.text d.窗口居中: this.SetBounds((Screen.GetBounds(this).Width / 2) - (this.Width / 2), (Screen.GetBo