School StartsFirstProject~UnityVR(HTCVive设备开发)_htc vive unity开发

@作者 : SYFStrive

@博客首页 : HomePage

🥧: ****Unity版本2019💪

📜: VR虚拟现实

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

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

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

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

👉
VR开发专栏(🔥)

目录

个人介绍

我叫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];
      //播放该图的Audio
      itemObj.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_ControllerEvents
    GameObject.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>
  /// 初始化视屏名字


![img](https://img-blog.csdnimg.cn/img_convert/e459475f468dd3457d5d402802bc6373.png)
![img](https://img-blog.csdnimg.cn/img_convert/163b840d851015fed8092e2e0d9b80a4.png)
![img](https://img-blog.csdnimg.cn/img_convert/01b6e8a21e833d3f16098779606d0307.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

触发当前的页面
    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>
  /// 初始化视屏名字


[外链图片转存中...(img-PjPsYGgn-4701990216556)]
[外链图片转存中...(img-D986oR3Z-4701990216556)]
[外链图片转存中...(img-hS70DSHJ-4701990216557)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值