主頁 >  其他 > Unity3D OpenVR 虛擬現實 保齡球打磚塊游戲開發

Unity3D OpenVR 虛擬現實 保齡球打磚塊游戲開發

2021-06-09 17:48:23 其他

據說水哥買了 Valve Index 設備,既然這個設備這么貴,不開發點有(zhi)趣(zhang)游戲就感覺對不起這個設備,本文將來開始著手開發一個可玩性不大,觀賞性極強的保齡球打磚塊游戲,這僅僅只是一個入門級的游戲,代碼量和制作步驟都超級少,適合入門

在開始之前,請參閱水哥提供的環境搭建以及部分必備知識博客

  • Unity OpenVR 虛擬現實入門一:安裝配置 Unity + OpenVR 環境
  • Unity OpenVR 虛擬現實入門二:一個最簡單的虛擬現實游戲/程式

在閱讀本文之前,我期望你有部分 Unity3D 開發的知識,本文不會提及多少 Unity3D 入門的知識,如果有看不懂的地方,還請自行翻 Unity3D 入門知識

此游戲的玩法就是用雙手拿起保齡球,將一堵墻砸掉,將磚塊推下地板,效果視頻如下

寫代碼就和搬磚一樣,一開始咱先使用 Unity OpenVR 虛擬現實入門二:一個最簡單的虛擬現實游戲/程式 的方法搭建出來一個放在 SteamVR SDK 里面的 Sample 的內容,開始進行砌墻

以上墻里面的各個磚塊記得加上剛體(Rigidbody)同時設定質量為 0.2 不然咱可打不掉磚塊

接下來咱來創建保齡球子彈,按照約定創建 Prefabs 檔案夾,在里面創建一個叫 Bullet 的圓球

如上圖,同樣給此子彈加上剛體,設定比較大的質量,如上圖給了質量是 10 這樣才好將磚塊打到地板下,請不要將地板加上剛體哦,默認的剛體是加上重力的,剛進入除錯發現地板掉了,這可不是在做恐怖游戲哈

下面咱來寫一點代碼,用來在扣扳機的時候,創建保齡球子彈

如何在 SteamVR 游戲中,獲取當前扳機的狀態?其實按照 Unity3D OpenVR SteamVR Input Action 動作 博客的建議,咱是不開發獲取當前扳機狀態的代碼,咱需要開發的是定義某個動作,如 InteracetUI 這個動作,獲取此動作的值來決定邏輯,這樣做的好處是方便用戶進行配置,以及支持其他不同的互動設備,如某個設備沒有扳機,但是此設備有另一個按鈕,這個按鈕也可以實作此效果,那么就可以讓用戶系結新的按鍵

咱現在還在 VR 應用或游戲開發的蠻荒時代,很多互動都在摸索階段,為了更好適配未來的新硬體和互動,通過定義動作名而不是系結具體的硬體設備上的做法的適配性更強

咱來創建一個叫 ShootWithRotation 的 C# 腳本檔案,按照國際慣例,放在 Scripts 檔案夾里面

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;

public class PlayerDemoScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

咱添加一個欄位,按照 Unity3D OpenVR SteamVR Input Action 動作 博客的內容,咱需要一個 bool 值獲取當前的扳機是否按下,在 SteamVR 里面,布爾使用 SteamVR_Action_Boolean 型別表示,通過 state 屬性獲取值,代碼如下

public SteamVR_Action_Boolean Shooting;

獲取扳機是否按下的代碼如下

            if (Shooting.state)
            {
                Shoot();
            }

通過 state 即可獲取當前的扳機是否按下,以上代碼的 Shoot 方法就是實際的射擊代碼,這部分代碼咱在下文才寫,回到 Shooting 欄位的定義,因為我主業是 WPF 開發,按照我的編碼習慣,欄位是不會公開的,而且使用下劃線開頭,但這和 Unity3D 這邊的編碼規范沖突,于是我就將欄位當成屬性好了,第一個字符大寫

咱上面代碼定義的 Shooting 欄位,想要獲取互動的本身就需要在 Unity3D 里面進行系結互動,此系結互動的方法可參閱 Unity OpenVR 虛擬現實入門六:通過搖桿控制玩家移動 這一篇的內容,大概的做法就是先將腳本附加到某個游戲物件里面,如咱將這個腳本附加到 Player 物件上面,接下來點擊 Shooting 的下拉,選擇互動

咱選擇 InteracetUI 這個動作,默認在 SteamVR 里面就是扣扳機這個互動,當然,用戶也可以自己設定到其他按鍵里面

此時我推薦大家如果之前沒有做過 SteamVR 的互動,那請嘗試在 VisualStudio 里面附加 Unity3D 除錯,在 Update 方法里面獲取 Shooting 欄位的值了解這部分的互動

如上圖,此時咱將 Shooting 欄位和 InteracetUI 這個動作系結

上圖里面的 Bullet 欄位以及 Shoot Speed 欄位等,咱將進行定義,代碼如下

    public GameObject Bullet;
    public SteamVR_Action_Boolean Shooting;

    public float Speed = 5;

    public float ShootSpeed = 2;

以上代碼的 Bullet 就是保齡球子彈的模版,用來創建保齡球子彈,而 ShootSpeed 是射擊頻率,在 VR 應用中,如果在 Update 里面不通過判斷頻率,就進行創建子彈,那么將會因為超級高的重繪而讓子彈創建速度超級快,本文這里的代碼判斷頻率只是用了直觀快速的方法

通過下面代碼可以用來限制發送子彈的速度

    public GameObject Bullet;
    public SteamVR_Action_Boolean Shooting;

    public float Speed = 5;

    public float ShootSpeed = 2;

    private float _shootTime = 0;
    private float _shootTimerInterval = 0;

    void Start()
    {
        _shootTimerInterval = 1 / ShootSpeed;
    }

    void Update()
    {
        _shootTime += Time.deltaTime;
        if(_shootTime> _shootTimerInterval)
        {
            _shootTime -= _shootTimerInterval;
            if (Shooting.state)
            {
                Shoot();
            }
        }
    }

下面就是 Shoot 代碼的撰寫了,我撰寫了幾個版本,經過了水哥的測驗,也就是本文如下沒有注釋掉代碼的版本的互動是最好的(雖然可玩性也特別渣)因此咱下面將來寫這個版本的邏輯

通過 GameObject.Instantiate 方法創建子彈,接著將子彈放在旁邊即可

    private void Shoot()
    {
        var sphere = GameObject.Instantiate(Bullet);

        sphere.transform.Translate(new Vector3(0, 0.25f, 0.1f));
    }

因為咱的 Player 和地板沒有添加傳送的功能,因此在設定 Player 在原點時,剛好將子彈放在 (0,0.25,0.1) 的地方即可,為什么 y 是 0.25 是因為剛好球大小就是 0.5 而坐標中點是球心,通過球的一半即可剛好放在地板上,而 z 方向設定 0.1 是可以讓球剛好在前面

此時在 Unity 系結 Bullet 欄位到咱上文設定的 Prefbabs 里面的 Bullet 即可,跑起來,通過剛體的邏輯,可以使用雙手拿起球,開始玩起來

接下來是一個被干掉的互動方式,此互動方式是扣扳機進行射擊,射擊方向就是前方

實作方式是在創建子彈時,將子彈的旋轉設定和當前 HMD (頭戴式顯示幕 Head-mounted display)的方向相同,然后設定速度方向為物體前方,代碼如下

    private void Shoot()
    {
        var sphere = GameObject.Instantiate(Bullet);

        sphere.transform.Translate(new Vector3(0, 0.25f, 0.1f));

        // 向著用戶看到方向
        sphere.transform.rotation = Player.instance.hmdTransform.transform.rotation;

        var rigidbody = sphere.GetComponent<rigidbody>();

        rigidbody.velocity = sphere.transform.forward * Speed;
    }

以下是 ShootWithRotation 的全部代碼

using System;
using System.Collections;
using System.Collections.Generic;

using UnityEngine;

using Valve.VR;
using Valve.VR.InteractionSystem;

public class ShootWithRotation : MonoBehaviour
{
    public GameObject Bullet;
    public SteamVR_Action_Boolean Shooting;

    public float Speed = 5;

    public float ShootSpeed = 2;

    private float _shootTime = 0;
    private float _shootTimerInterval = 0;

    // Start is called before the first frame update
    void Start()
    {
        _shootTimerInterval = 1 / ShootSpeed;
    }

    // Update is called once per frame
    void Update()
    {
        _shootTime += Time.deltaTime;
        if(_shootTime&gt; _shootTimerInterval)
        {
            _shootTime -= _shootTimerInterval;
            if (Shooting.state)
            {
                Shoot();
            }
        }
    }

    private void Shoot()
    {
        var sphere = GameObject.Instantiate(Bullet);

        //sphere.transform.Translate(Player.instance.hmdTransform.position);
        sphere.transform.Translate(new Vector3(0, 0.25f, 0.1f));

        // 向著用戶看到方向
        sphere.transform.rotation = Player.instance.hmdTransform.transform.rotation;

        var rigidbody = sphere.GetComponent<rigidbody>();

        //rigidbody.velocity = sphere.transform.forward * Speed;

        //// 旋轉發射
        //var rotation = Player.transform.eulerAngles.y;
        //var vx = 1 * Mathf.Cos(rotation);
        //var vy = -1 * Mathf.Sin(rotation);
        //rigidbody.velocity = new Vector3(vx, 0, vy) * Speed;
        //Destroy(sphere, 5);
    }
}

當前后續水哥還開發出通過抓握的互動方式,這個互動方式看起來更好玩,實作方法是給子彈加上一個叫 Interactable 的腳本,這個腳本是帶在 SteamVR SDK 里面的,添加這個腳本時需要給定他的 activateActionSetOnAttach 欄位 \actions\default 互動

再給子彈添加一個 Throwable 腳本,讓這個球可以被扔掉

當前的游戲就可以抓起來球然后扔出去

這個游戲開發難度不高,只是有很多知識需要了解,而且有點費德熙,我在除錯了幾個小時,看著螢屏上工具人水哥測驗的畫面,特別想吐

系列博客請看

  • Unity OpenVR 虛擬現實入門一:安裝配置 Unity + OpenVR 環境
  • Unity OpenVR 虛擬現實入門二:一個最簡單的虛擬現實游戲/程式
  • Unity OpenVR 虛擬現實入門三:最簡單的五指互動
  • Unity OpenVR 虛擬現實入門四:通過腳本控制手與控制器
  • Unity OpenVR 虛擬現實入門五:通過傳送控制玩家移動
  • Unity OpenVR 虛擬現實入門六:通過搖桿控制玩家移動

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285776.html

標籤:其他

上一篇:提高Unity編譯dll的速度

下一篇:[Unity編輯器擴展基礎總結] 第3章 編輯器下的資料保存

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more