使用3D物体做GUI界面

通常来说,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'比较好。

上一篇:Windows7下PHP5.6.19+Apache2.4.18+MySql5.7环境配置


下一篇:mysql 采样查询 / 间隔查询 / 跳跃查询的两种实现思路