关闭

教你如何开发VR游戏系列教程五:UI 交互

标签: 虚拟现实
2733人阅读 评论(0) 收藏 举报
分类:

原文链接:欢迎关注AR学院


上一篇介绍了ugui/NGUI/以及普通3D模型的UI设计。这一讲主要介绍怎么样利用这些UI做交互。 


大家在VR游戏看到的UI以及UI交互,主要有哪几种? 

1、头控悬停(视选) 
2、蓝牙手柄 
3、利用AR技术 

 


1、触摸控制
在UGUI中,按钮的的事件容易处理,直接这里设置对应的方法。

那么有时候有的同学需要使用Image怎么办?这里就以Image的选择为例。
首先创建Canvas和Image,并选择一个Sprite。

 
然后给Image添加脚本Event Trigger.

再添加新的Event Type。这里我选择使用鼠标的Pointer Click.

 
 
 
最后新建一个脚本,Control.cs,如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
using System.Collections;
    
public class Control : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
           
       }
           
        // Update is called once per frame
        void Update () {
           
       }
    
    public void PointClicked() {
        Debug.Log( "---> PointClicked");
    }
}

将脚本绑在VRCameras下,再设置Image的Event Type.

 
测试结果:

完成。



2、视选控制 
3D模型,主要就是射线+碰撞。主要代码如下,将该代码绑定到VRCameras下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using UnityEngine;
using System.Collections;
      
public class UIControl3D : MonoBehaviour {
    public Camera myCamera;
    private float time = 0;
      
    public MeshRenderer target_on;
    public MeshRenderer target_off;
    public ParticleSystem myExplosion;
      
    // Use this for initialization
    void Start () {
             
       }
             
        // Update is called once per frame
        void Update () {
        CheckTargeted();
       }
    
    
    void CheckTargeted()
    {
        // 分屏,宽度在1/2屏幕居中
        Ray ray = myCamera.ScreenPointToRay( new Vector3( Screen.width / 4, Screen.height / 2));
        RaycastHit hits;
        // 发出射线
        if ( Physics.Raycast(ray, out hits, 5000))
        {
            Debug.Log(hits.collider.name);
     
            if (hits.collider.name == "Cube")
            {
                time += 1 * Time.deltaTime;
     
                target_on.enabled = true;
                target_off.enabled = false;
     
                if (time >= 1.5f)
                {
                    this.myExplosion.Play();
                    time += Time.deltaTime;
                }
                if (time >= 2)
                {
                    time = 0;
                    this.myExplosion.Stop();
                }
            }
        }
        else
        // 重置场景
            time = 0;
            target_on.enabled = false;
            target_off.enabled = true;
        }
    }
}
最后效果如下:
 
 

OK,那么今天就讲到这里,欢迎大家一起加入交流讨论,咱们官方技术交流群是: 

AR/VR学院技术交流群 129340649
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:226392次
    • 积分:3151
    • 等级:
    • 排名:第11313名
    • 原创:83篇
    • 转载:0篇
    • 译文:1篇
    • 评论:148条
    AR技术交流群
    AR技术交流群:129340649 欢迎加入!
    博客专栏
    最新评论