虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建

1. 使用VRTK实现射线交互

  • 修改VR相机中手柄的缩放程度使我们能够看到手柄
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第1张图片
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第2张图片
  • 对VRTK SDK 下 Simulator中的[VRSimulator_CameraRig]进行配置
  1. 勾选掉Reset Hands At Switch选项防止按下Alt键控制手柄的时候手柄位置重置;
  2. 因为整个场景都是放大了数千倍的,手柄也放大了,所以相机和手柄的移动幅度也要相应放大,以免无法正常进行移动。
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第3张图片
  • 在场景中创建一个空物体,修改名称为VRTK_Scripts,再在该物体下创建两个空物体,分别命名为ControllerRight、ControllerLeft,以下以右手为例
    在这里插入图片描述
  • 在ControllerRight上添加VRTK_Pointer、VRTK_StraightPointerRebderer组件,并将VRTK_StraightPointerRebderer拖拽到VRTK_Pointer组件的Pointer Renderer属性
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第4张图片
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第5张图片
  • 设置射线
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第6张图片
  • 将ControllerRight赋值到VRTK SDK中Script Aliases中的Right Controller上
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第7张图片
  • 运行游戏,一次测试手柄及射线情况有无异常

按键功能如下
虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第8张图片

  • 左手的实现是一样的

2. 实现UI交互

  • ControllerRight添加VRTK_UIPointer组件并进行设置
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第9张图片
  • 回到Canvas,添加VRTK_UICanvas组件,运行查看UI交互情况,即射线悬停在按钮上时有无变色

3. 解决射线中UI颜色错误的问题

当射线在Canvas上时,射线颜色是绿色的,但我们需要的效果是当射线在按钮上时才显示绿色,所以要进行纠正

  • 打开Canvas中VRTK_UICanvas的脚本文件
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第10张图片
  • 找到如图所示的几行语句,ctrl+k+c注释掉
    在这里插入图片描述
  • 在btn_Forward身上添加Box Collider组件,设置Size属性即碰撞检测的范围(自行设定)
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第11张图片
  • 其余按钮也是一样的操作
  • 运行一下看看效果(射线悬停在按钮上时是否变为绿色)

4. 游乐项目的切换

切换有了项目其实就是让GameItemSpawn旋转相应度数就可以了

通过下标来操作,默认开始下标为0,当点击btn_Forward,下标加一,下标乘以角度增量即可

  • 为了避免旋转切换太过僵硬,这里使用DOTween插件,将资料里的DOTween+Pro+v0.9.290.unitypackage文件拖拽到项目中取消示勾选例场景并导入即可
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第12张图片
  • 打开GameItemSpawn脚本编辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class GameItemSpawn : MonoBehaviour
{

    public static GameItemSpawn Instance;
    public Material[] m_GameItemMatArr;  // 材质球
    public GameObject go_GameItem;
    public int Index = 0;
    private float m_Angle;  // 角度

    // 初始化生成GameItem,有多少个取决于有多少个游乐项目,就是看材质球数量
    private void Awake()
    {
        Instance = this;
        m_Angle = 360.0f / m_GameItemMatArr.Length;
        for (int i = 0; i < m_GameItemMatArr.Length; i++)
        {
            // 调整角度
            GameObject go = Instantiate(go_GameItem, transform);
            go.transform.localEulerAngles = new Vector3(0, i * m_Angle, 0);
            // 给指定材质球
            go.GetComponentInChildren().material = m_GameItemMatArr[i];

        }
    }

    // 向前转
    public void RotateForward()
    {
        Index++;
        if (Index >= m_GameItemMatArr.Length)
        {
            Index = 0;
        }
        transform.DORotate(new Vector3(0, -Index * m_Angle, 0), 0.3f);
    }


    // 向后转
    public void RotateBack()
    {
        Index--;
        if (Index < 0)
        {
            Index = m_GameItemMatArr.Length - 1;
        }
        transform.DORotate(new Vector3(0, -Index * m_Angle, 0), 0.3f);
    }
}
  • 在Canvas下创建一个空物体,把它缩放得跟Canvas一样大,再把之前Canvas下的子物体都放进入,修改名称为GameItemSelectPanel
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第13张图片
  • 在Scripts文件夹下的UI文件夹中创建同名脚本GameItemSelectPanel.cs并挂载到GameItemSelectPanel上
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第14张图片
  • 打开GameItemSelectPanel.cs进行编辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameItemSelectPanel : MonoBehaviour
{
    private Button btn_Forward;
    private Button btn_Back;
    private Button btn_Select;

    private void Awake()
    {
        Init();
    }

    private void Init()
    {
        btn_Forward = transform.Find("btn_Forward").GetComponent
  • 运行测试一下是否能正常切换

5. 游乐项目名字的显示

  • 将资料中的游乐项目名字.txt文件拖拽到项目中,修改其编码格式为utf-8
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第15张图片
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第16张图片
  • 将该文件放入Resources文件夹中
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第17张图片
  • 打开GameItemSelectPanel脚本进行修改
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameItemSelectPanel : MonoBehaviour
{
    private Button btn_Forward;
    private Button btn_Back;
    private Button btn_Select;
    private string[] m_GameItemNameArr;
    private Text txt_Title;

    private void Awake()
    {
        ReadGameItemNameText();
        Init();
    }

    private void Update()
    {
        txt_Title.text = m_GameItemNameArr[GameItemSpawn.Instance.Index];
    }

    private void ReadGameItemNameText()
    {
        TextAsset textAsset = Resources.Load("游乐项目名字");
        m_GameItemNameArr = textAsset.text.Split('\n');
    }

    private void Init()
    {
        txt_Title = transform.Find("txt_Title").GetComponent();
        btn_Forward = transform.Find("btn_Forward").GetComponent

6. 添加游乐项目视频

实现当射线在游乐项目图片上时,播放该项目视频

  • 将之前创建的GameItem预制体拖拽到GameItemSpawn下
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第18张图片
  • 给GameItem下的Quad添加Video Player组件并进行设置
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第19张图片
    +在Scripts文件夹下 创建GameItem脚本,并挂载到Quad上
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第20张图片
  • 打开该脚本进行编辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class GameItem : MonoBehaviour
{
    private VideoPlayer m_VideoPlayer;

    private void Awake()
    {
        m_VideoPlayer = GetComponent();
    }
    
    //设置视频名称
    public void SetVideoName(string videoName)
    {
        m_VideoPlayer.url = GetVideoPath(videoName);
    }

    //获取视频路径
    private string GetVideoPath(string videoName)
    {
        return Application.dataPath + "/StreamingAssets/" + videoName + ".mp4";
    }

}
  • 修改GameItemSpawn 的Awake部分内容
private void Awake()
{
    Instance = this;
    m_Angle = 360.0f / m_GameItemMatArr.Length;
    for (int i = 0; i < m_GameItemMatArr.Length; i++)
    {
        GameObject go = Instantiate(go_GameItem, transform);
        go.transform.localEulerAngles = new Vector3(0, i * m_Angle, 0);
        go.GetComponentInChildren().SetVideoName(m_GameItemMatArr[i].name);
    }
}
  • 将GameItem重新Apply All
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第21张图片
  • 将预制体设置为唤醒时循环播放用于测试,测试结束后还原
    虚拟现实大作业——VR游乐园(无设备开发)之3.2.游乐设备选择场景搭建_第22张图片
  • 运行看看视频能否正常播放

你可能感兴趣的:(虚拟现实大作业)