首页 > 代码库 > 使用3D物体做GUI界面
使用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‘比较好。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。