School StartsFirstProject~UnityVR(HTCVive设备开发)

article/2025/8/17 22:29:17

请添加图片描述

@作者 : SYFStrive

 
请添加图片描述
 
质量达到99的文章分享给大家💪

在这里插入图片描述

@作者 : SYFStrive

@博客首页 : HomePage

🥧: Unity版本2019💪

📜: VR虚拟现实

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

📌:觉得文章不错可以点点关注 👉:VR开发专栏🔗

💃:程序员每天坚持锻炼💪

🔗:点击直接阅读文章
请添加图片描述
在这里插入图片描述
相关专栏

👉 VR开发专栏(🔥)

目录

  • 个人介绍
  • 新学期目标
  • 项目准备与介绍
  • 设备模样
  • 实现效果如下
  • 导入素材
  • 开始页UI简单搭建
  • 开发步骤
    • 1、使用预制体 Galaxy:
    • 2、调整 Galaxy 和 SteamVR摄像机
    • 3、使用SteamVR摄像机
    • 4、VR模拟UI界面搭建效果图如下:
    • 5、VRTK 3.2.1v的相关使用
    • 6、手臂发射射线
    • 7、UI交互
    • 8、射线触发UI播放对于的视频
    • 9、创建LodingPageUI
    • 10、完成过山车场景
    • 10.1、车到达终点播放声音
    • 11、托马斯场景泪水过山车
  • 开发相关脚本
    • StartPage 脚本
    • ItemManager、EventManager 脚本
    • AudioManager脚本
    • Loading 脚本
    • AntorController 脚本
  • 最后

个人介绍

    我叫XXX,今年上大二,主学游戏开发虚幻引擎、Unity引擎,在校期间开发了很多小Demo我严格要求自己,自觉、遵纪、守时。本人坦诚且有责任心,有独立进取的品性,勤于动手、善于动脑,适应新环境能力很强。能够在最短时间内完成从学生到职业工作人员的转型,尽自己最大的努力融入新的工作生活。

新学期目标

①:学好新学期课程,好好学习天天向上💪
②:参加VR虚拟现实比赛
③:继续提升学历~争取考公务员💪
④:程序员坚持每天锻炼💪

在这里插入图片描述

⑤:在这里插入图片描述

项目准备与介绍

  • 前期准备如下:
    ①:SteamVR下载步骤 : 下载Steam链接 → 下载SteamVR1.2.2
    ②:VRTK3.2.1下载 :下载链接

  • 项目介绍
    ☺:课程使用HTC Vive设备开发,使用 SteamVR1.2.2 和 VRTK3.2.1 版本开发。
    ☺:将游乐项目在VR里体验,使用新版VRTK实现了射线与UI的交互、新版VRTK的使用。

设备模样

在这里插入图片描述
设备图:

在这里插入图片描述

实现效果如下

在这里插入图片描述

导入素材

资源:在这里插入图片描述

SteamVR:在这里插入图片描述

VRTK:在这里插入图片描述

夸克网盘下载 ☑:下载链接

提取码:PCks

导入+ 创建相关文件夹如下图:

在这里插入图片描述

在这里插入图片描述

开始页UI简单搭建

在这里插入图片描述
效果如下:

在这里插入图片描述

开发步骤

1、使用预制体 Galaxy:

在这里插入图片描述

2、调整 Galaxy 和 SteamVR摄像机

如下图所示:

在这里插入图片描述

3、使用SteamVR摄像机

在这里插入图片描述

在这里插入图片描述

4、VR模拟UI界面搭建效果图如下:

  1. 摄像机使用世界坐标:

在这里插入图片描述

  1. 创建UI调整

请添加图片描述

在这里插入图片描述

5、VRTK 3.2.1v的相关使用

  1. 创建VRTK(添加VRTK_SDK Manager) 👉 创建空GameObject (添加VRTK_SDK Setup组件)

如👇:

在这里插入图片描述

6、手臂发射射线

要与UI交互需要添加 3个组件:

在这里插入图片描述

把renderer添加到PointerRenderer如下:

在这里插入图片描述

添加右手炳到RightController

在这里插入图片描述

效果如下:

在这里插入图片描述

7、UI交互

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

效果如 👇:

在这里插入图片描述

bug(射线移进Canvas就会碰撞检测)

在这里插入图片描述

解决如下:

在这里插入图片描述
在这里插入图片描述

射线与UI碰撞的原理如下:

在这里插入图片描述

检测自带的碰撞体与刚体如下:

在这里插入图片描述
效果如下:

在这里插入图片描述

8、射线触发UI播放对于的视频

在这里插入图片描述

9、创建LodingPageUI

效果如下:

在这里插入图片描述

10、完成过山车场景

在这里插入图片描述

在这里插入图片描述

VR设画面如下:

在这里插入图片描述

10.1、车到达终点播放声音

如下图:
在这里插入图片描述

11、托马斯场景泪水过山车

在这里插入图片描述

VR场景如下:

在这里插入图片描述

开发相关脚本

StartPage 脚本

实现的功能:开始结束按钮的相关逻辑

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class StartPage : MonoBehaviour {//结束按钮private Button startBut;//退出按钮private Button exitBut;private void Awake(){//获取相关组件startBut = transform.Find("StartBut").GetComponent<Button>();exitBut = transform.Find("EquitBut").GetComponent<Button>();}private void Start(){//开始按钮绑定相关事件startBut.onClick.AddListener(() =>{SceneManager.LoadScene("Scene2");});//结束按钮绑定相关事件exitBut.onClick.AddListener(() =>{Application.Quit();});}
}

ItemManager、EventManager 脚本

实现的功能:创建动态图片、左右点击按钮相关代码

ItemManager

using UnityEngine;
using DG.Tweening;
public class ItemManager : MonoBehaviour {//单例public static ItemManager instance;//获取图片材质球public Material[] materials;//图片预制体public GameObject prefabe;//旋转的角度private float angle;//旋转方向public int risitionDirection;private void Awake () {//单例instance = this;//旋转的方向risitionDirection = 0;//计算图片与图片的角度angle = 360f / materials.Length;for (int i = 0; i < materials.Length; i++){//创建图片预制体GameObject itemObj=Instantiate(prefabe, transform);//设置角度itemObj.transform.localEulerAngles=new Vector3(0, i*angle, 0);//设置其图片itemObj.GetComponentInChildren<MeshRenderer>().material = materials[i];//播放该图的AudioitemObj.GetComponentInChildren<AudioManager>().SetVideoName(materials[i].name);//判断射线只能触发当前的页面itemObj.GetComponentInChildren<AudioManager>().Index = i;}}//右旋转public void RightRisition(){risitionDirection++;if (risitionDirection>= materials.Length){risitionDirection = 0;}transform.DORotate(new Vector3(0, -risitionDirection * angle, 0), 0.3f);}//左旋转public void LeftRisition(){risitionDirection--;if (risitionDirection < 0){risitionDirection = materials.Length;}transform.DORotate(new Vector3(0, -risitionDirection * angle, 0), 0.3f);}}

EventManager

using UnityEngine;
using UnityEngine.UI;public class EventManager : MonoBehaviour {//场景名字private string[] sceneNameSText;//名字文本public Text sceneNameStext;private void Start(){//右按钮transform.Find("Right").GetComponent<Button>().onClick.AddListener(() =>{ItemManager.instance.RightRisition();});//左按钮transform.Find("Left").GetComponent<Button>().onClick.AddListener(() =>{ItemManager.instance.LeftRisition();});//中间事件transform.Find("Center").GetComponent<Button>().onClick.AddListener(() =>{Loading.Instance.LoadScene();});//获取Resources文件夹里面的Text文本ReadSceneName();}private void Update(){//同步文本sceneNameStext.text = sceneNameSText[ItemManager.instance.risitionDirection];}/// <summary>/// 获取resourcesText/// </summary>private void ReadSceneName(){TextAsset textAsset = Resources.Load<TextAsset>("unityVR");sceneNameSText=textAsset.text.Split('\n');}
}

效果如下:

在这里插入图片描述

AudioManager脚本

实现的功能:实现射线碰撞到UI触发相关视频

using UnityEngine;
using UnityEngine.Video;
using VRTK;
using System.IO;public class AudioManager : MonoBehaviour {//获取VideoPlayer组件private VideoPlayer video;public int Index;private void Awake(){//获取VideoPlayer组件video = GetComponent<VideoPlayer>();//获取VRTK_ControllerEventsGameObject.Find("Right").GetComponent<VRTK_ControllerEvents>();}private void Update(){//判断射线只能触发当前的页面if (Index == ItemManager.instance.risitionDirection){GetComponent<MeshCollider>().enabled = true;GetComponent<MeshRenderer>().material.color = Color.white;}else{GetComponent<MeshCollider>().enabled = false;GetComponent<MeshRenderer>().material.color = Color.gray;}}/// <summary>/// 初始化视屏名字/// </summary>public void SetVideoName(string videoName){video.url = GetVideoPath(videoName);}/// <summary>/// 获取视频路径、播放路径/// </summary>private string GetVideoPath(string videoName){return Application.dataPath+"/StreamingAssets/"+ videoName+".mp4";}//满足触发条件执行private void OnTriggerEnter(Collider other){//代表文件不存在 if (File.Exists(video.url) == false) return;video.Play();}private void OnTriggerExit(Collider other){video.Pause();}}

效果如下:

在这里插入图片描述

Loading 脚本

实现的功能:实现加载相关逻辑

using System.Collections;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class Loading : MonoBehaviour
{//单例public static Loading Instance;//加载页UIprivate Image loading;//异步加载场景AsyncOperationprivate AsyncOperation asyncOn;//是否加载完成private bool isLoad = false;private void Awake(){//单例Instance = this;//找到对应的组件loading = transform.Find("Loading").GetComponent<Image>();transform.localScale = Vector3.zero;}//加载场景public void LoadScene(){//DOTween相关使用transform.DOScale(Vector3.one, 0.3f).OnComplete(() =>{//开启携程StartCoroutine("LoadingS");});}IEnumerator LoadingS(){//startValueint displayProgress = -1;//endValueint toProgress = 100;while (displayProgress < toProgress){displayProgress++;//同步UI进度条ShowProgress(displayProgress);if (isLoad == false){//场景中有两个初始场景所以从第二个开始算asyncOn = SceneManager.LoadSceneAsync(2 + ItemManager.instance.risitionDirection);//加载完成不让跳转asyncOn.allowSceneActivation = false;isLoad = true;}yield return new WaitForEndOfFrame();}if (displayProgress == 100){//跳转asyncOn.allowSceneActivation = true;StopCoroutine("LoadingS");}}private void ShowProgress(int progress){loading.fillAmount = progress * 0.01f;}
}

效果如下:

在这里插入图片描述

AntorController 脚本

实现的功能:实现火车到达终点播放声音

using UnityEngine;
using UnityEngine.SceneManagement;public class AntorController : MonoBehaviour
{public AudioSource audioS;private Animation anim;/// <summary>/// 动画片段的时间/// </summary>private float clipTime;/// <summary>/// 是否播放欢呼音效/// </summary>private bool isPlay = false;/// <summary>/// 动画是否播放完/// </summary>private bool isEnd = false;/// <summary>/// 计时器/// </summary>private float timer = 0f;private void Awake(){//获取相关组件anim = GetComponent<Animation>();clipTime = anim.clip.length;}private void Update(){clipTime -= Time.deltaTime;if (clipTime <= 10 && isPlay == false){//到达终点播放声音audioS.Play();isPlay = true;}if (clipTime <= 0 && isEnd == false){UnityEngine.XR.InputTracking.disablePositionalTracking = false;//调整场景SceneManager.LoadScene("StartScene");//结束游戏isEnd = true;}}
}

最后

在这里插入图片描述
本文到这里就结束了,大佬们的支持是我持续更新的最大动力,希望这篇文章能帮到大家💪

 

                 相关专栏连接🔗

在这里插入图片描述

下篇文章再见ヾ( ̄▽ ̄)ByeBye

在这里插入图片描述


http://chatgpt.dhexx.cn/article/A5l74N87.shtml

相关文章

2022年全球及中国VR交互设备市场规模研究

2021年全球VR交互设备市场规模大约为 亿元&#xff08;人民币&#xff09;&#xff0c;预计2028年将达到 亿元&#xff0c;2022-2028期间年复合增长率&#xff08;CAGR&#xff09;为 %。未来几年&#xff0c;本行业具有很大不确定性&#xff0c;本文的2022-2028年的预测数据是…

vr直播是什么意思?vr直播需要什么设备?

提起直播&#xff0c;相信大家都不会陌生&#xff0c;近两年国内直播带货异常火爆&#xff0c;一个个傲人的数据无不在吸引着大众的眼光。随着技术的不断发展&#xff0c;如今我们的直播形式也得到了进一步的升级&#xff0c;越来越多的平台开始逐渐支持vr直播。那么vr直播是什…

VR+文旅景区结合VR主题乐园VR设备厂家

主题乐园介绍&#xff1a;VR主题公园主要具备三大特点&#xff1a;大空间自由行走、没有物理线材束缚、多人同场互动。主题公园不仅拥有无线空间定位&#xff0c;还有精度更加高的光学空间定位系统。【普乐蛙】VR根据市场的发展&#xff0c;设计出VR主题乐园项目。【普乐蛙】VR…

Cesium集成WebXR_连接VR设备

Cesium集成WebXR 文章目录 Cesium集成WebXR1. 需求2. 技术基础2.1 WebGL2.2 WebXR2.3 其他 3. 示例代码4. 效果图5. 参考链接 1. 需求 通过WebXR接口&#xff0c;将浏览器端连接到VR头盔&#xff0c;实现在VR头盔中浏览Cesium场景&#xff0c;并可将头盔旋转的操作同步映射为场…

一些有意思的VR设备介绍

1.计算机&#xff08;Computers&#xff09; 不久以前&#xff0c;一个VR系统需要百万美元的超级计算机&#xff1b;而如今顶级的VR系统正在使用桌面便携式计算机簇&#xff0c;极大的降低了价格和维护成本。 2.跟踪器&#xff08;Tracking&#xff09; 数据手套的使用不是太多…

Ajax简介与用法

Ajax简介 AJAX 指异步 JavaScript 及 XML&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff0c;Ajax可以实现异步请求。AJAX 是一种在 2005 年由 Google 推广开来的编程模式。 Ajax语法介绍 学习使用Ajax主要就是学习XMLHttpRequest对象的方法和属性 第一个A…

ajax写法和json的知识点

1. JQuery方式来实现AJAX 1.1 $.ajax()方式来实现AJAX 语法&#xff1a;$.ajax(url,[settings]);但是我们一般这么写$.ajax({键值对});。 $.ajax()来实现ajax的案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…

AJAX请求常用的几种写法

1.什么是 AJAX&#xff1f; AJAX 异步 JavaScript 和 XML&#xff08;Asynchronous JavaScript and XML&#xff09;。 简短地说&#xff0c;在不重载整个网页的情况下&#xff0c;AJAX 通过后台加载数据&#xff0c;并在网页上进行显示。 异步加载&#xff0c;局部刷新&am…

ajax的两种写法

一、原生ajax的实现 1.什么是ajax&#xff1f; ajax是异步的javas和xml&#xff08; Asynchronous JavaScript And XML&#xff09;。 通过在后台与服务器进行小量的数据交换&#xff0c;ajax可以使网页实现异步更新。就是说可以在不刷新页面的情况下&#xff0c;对页面的某…

【ajax】ajax详解,ajax是什么?

思路&#xff1a; ajax&#xff1a;&#xff08;asynchronous javascript and xml&#xff09; asynchronous 异步的 ajax是什么&#xff1f; ajax是一种用来改善用户体验的技术&#xff0c;其本质是利用浏览器提供的一个特殊的对象&#xff08;XMLHttpRequest,也可称之为ajax…

Ajax的请求写法详解

简介 是什么 Ajax全称Asynchronous JavaScript and XML&#xff0c;直译过来就是异步的javascript 和 XML。为什么是叫XML还得由于最开始用ajax实现客户端和服务器端数据通信的时候&#xff0c;传输的数据格式一般都是xml格式的数据&#xff0c;所以把它称之为异步js和xml&am…

$.ajax的标准写法

$.ajax({2 url:"http://www.microsoft.com", //请求的url地址3 dataType:"json", //返回格式为json4 async:true,//请求是否异步&#xff0c;默认为异步&#xff0c;这也是ajax重要特性5 data:{"id":"value"}, …

ajax详细用法

一、基础知识 1、首先让我们了解ajax---------------- 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。 2、ajax的核心步骤&#xff1a; 创建XMLHttpReq…

ajax的常见几种写法以及用法

一、服务端数据格式 1.自定义po类 package com.hbut.ssm.po;/*** pojo类**/ public class Children {private String name;private Integer age;private String gender;public Children(String name, Integer age, String gender) {super();this.name name;this.age age;thi…

Ajax的三种写法(最原始的写法+最常用的写法+最简便的写法)

AJAX&#xff1a;Asynchronous JavaScript AND XML 定义&#xff1a;浏览器向服务器发送的异步请求&#xff08;不改变页面的情况下&#xff0c;发送的变化&#xff09; 核心&#xff1a;浏览器向服务器发送异步请求&#xff0c;javascript中提供xmlHttpRequest对象&#xf…

利用油管语音转文字

https://www.tunestotube.com/ 音频上传油管https://zhuwei.me/y2b/ 获取油管字幕文章转载自 https://www.jianshu.com/p/762ae8461243

怎样能把文字变成语音

文字转语音目前在人们的生活和工作中发挥着很大的作用&#xff1b;没事的时候人们总是喜欢看看手机新闻或者玩玩电脑游戏&#xff0c;我们在看新闻的内容时&#xff0c;长时间的盯着屏幕看文字&#xff0c;很快会让眼睛变的疲劳&#xff0c;如果想要让眼睛得到休息又能够获取新…

Java文字转语音功能实现

也许&#xff0c;有些时候&#xff0c;你需要这个需求呢&#xff0c;来上代码 我会写出两种不同方式的文字转语音demo&#xff0c;直接copy走用&#xff0c;节省开发时间 git项目下载地址 1.直接使用jdk的 jacob&#xff0c;效果还不错&#xff0c;特点&#xff1a;免费的 2…

电脑文字转语音怎么弄?这些方法值得一试

有时我们需要在上网搜索一些文献作为参考&#xff0c;但有些资料文字太多&#xff0c;内容枯燥&#xff0c;不是很想阅读。这时我们可以将网页文字转成语音&#xff0c;就不用一直盯着屏幕上的文字&#xff0c;通过“听”的方式&#xff0c;还可以让我们放松下来。那么你知道网…

视频语音识别文字

广告关闭 9.9元享100G流量包&#xff0c;1年有效&#xff0c;低至1元/天&#xff0c;具备美颜动效视频处理等功能&#xff0c;支持定制开发&#xff0c;最快1天接入。 腾讯云语音识别服务开放实时语音识别、一句话识别和录音文件识别三种服务形式&#xff0c;满足不同类型开发…