Meta Quest2用のUnityのVRゲームを開発できる環境を作るまでにつまづいた点

基本的に、以下の環境を構築すると開発できるようになった。
①まずは以下のURLを参考にQuest2へapkファイルを転送できるようにする。
https://www.code-mogu.com/2020/12/11/oculus-quest2-unity/ ②次に、以下のURLを参考にUnityのVRテンプレートのプロジェクトをビルドしてapkファイルをQuest2へ転送して動くことを確認する。
https://sheltie-garage.xyz/tech/2022/05/unity-vr%E3%81%A7htc-vive%E3%80%81oculus-quest2%E4%B8%A1%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

手順通りにやればできたのだが、色々分かりにくいところがあってつまづいたので、以下にメモしておいた。
■コマンドプロンプトでADBコマンドを使えるようにできなかった
 この原因として、私の凡ミスだったのだが、環境変数をWindowsのシステム設定で変更するのだが、Pathのところに追加したはずが、なぜか消えていた。(おそらく確定できていなかったのだろう。)ちゃんとPathに入っていたら、ADBコマンドが使えるようになった。

■Oculus Quest2を開発者モードにする
 Oculusアプリをインストールして、左上の「設定」タブ→「一般」タブを選択して、「開発元不明」をONにする必要がある。ここがなかなか見つけられなかった。
開発元不明のON
■ヘッドセット側も開発者モードの設定をしなくてはいけない
 この設定は、スマホで「Meta Quest」アプリをインストールして、このアプリ内でQuest2を認識させてから、その「デバイスの管理」→「ヘッドセットの設定」→「開発者モード」を選択することでONできる。つまり、スマホで設定しないといけない。

■SideQuestは「Advanced Installer」を選択
 Easy InstallerとAdvanced Installerがあるようだが、Advanced Installerのほうがわかりやすかった。多分Easyのほうでもいいのかもしれないが、よく使い方が分からなかった。
ダウンロードページ
■Quest2用のVRのプロジェクトにはどのテンプレートやSDKを使えばいいのかわからなかった。
 以下の3種類がぱっと思いつく。
 ①SteamVR Plugin
 
SteamVR Plugin
 ②Oculus Integration
 

 ③UnityのVR テンプレート 
 
UnityのVRテンプレート
全て試したわけではないが、開発していくのであれば、③のUnityのVRテンプレートがいいのではないかと思った。
①のSteamVR PluginはWindowsPC内でVRゲームを作るのであればいいと思うが、apkファイルにしてQuest2に入れてもVRとして動かなかったので、Quest2のスタンドアロン型VRゲームができないのではないかと思う。
②は試していないのでわからない。(何となくVIVEとQuest2の両対応できそうな気がする)
③は両対応ができることを確認した。

■Window用であればプラットフォームをPCでビルド、Quest用であればAndroidでビルド
 これは当然だが念のため。

■SteamVR Pluginで開発する場合は、SteamVRを起動させないといけない。
 Unityプロジェクトを再生すると勝手に起動するかもしれないが念のため。
 
SteamVR 起動中
■UnityのVRテンプレートで開発する場合は、SteamVRは不要なようだ。
 UnityのVRテンプレートを動かしたときはSteamVRは起動していなかったので、SteamVRを経由していないようだった。

■開発中にQuest2を使って動作確認する場合
 まず、Quest2とPCをUSBケーブルで接続する。(同一LAN内ならOculus Air Linkでもいけるのかも)
 Quest2内で「Oculus Link」(もしくはOculus Air Link)を起動して、PCとQuest2をリンクしておかないといけない。

とりあえず、開発の準備はできた感じ!!
 

Unity Asset StoreでEasy Saveを買ってみたぁ!!

Unity Asset StoreでBLACK FRIDAYをやっていたので、思わず前から気になっていたEasy Saveを買ってしまった!
Easy Save

とりあえず、便利らしいのでまずは使い方を学んでいきたい!!
使い方を学ぶために備忘録的にこのブログでまとめておこうかなぁ。

ちなみにBLACK FRIDAYのセールはまだやっているみたいなので、便利なアセットを安く買えるチャンスかもしれません!
https://assetstore.unity.com/?locale=ja-JP

Unityをコマンドラインでビルドするためのバッチファイルの内容を忘れないようにメモ!!

いつも、Unityをコマンドラインでビルドする方法を忘れてしまうので、備忘録的にメモしておいた!!
つまり、バッチファイルから、エディタ拡張スクリプト内の「Build()」関数を呼び出している感じです。

ビルドのプラットフォームは「WebGL」にしています。

バッチファイル側(autobuild.batファイル)
rem このバッチファイルの相対パスへ移動
pushd "%~dp0"

"C:\Program Files\Unity\Hub\Editor\2019.4.16f1\Editor\Unity.exe" ^
-batchmode -quit -logFile log.txt ^
-buildTarget WebGL ^
-projectPath UnityProject ^
-executeMethod CommandLineFunc.Build ^
-outputPath WebBuild ^
rem -development

rem このバッチの相対パスから撤収
popd
Unityプロジェクト内のエディタ拡張のスクリプト内(CommandLineFunc.cs)
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
using System;

public class CommandLineFunc
{
    /// <summary>
    /// ビルド実行
    /// </summary>
    public static void Build()
    {
        var output = "";
        bool isDevelopment = false;
        var args = System.Environment.GetCommandLineArgs();
        for (int i = 0; i < args.Length; i++)
        {
            switch (args[i])
            {
                case "-outputPath":
                    output = args[i + 1];   //出力先の設定
                    break;
                case "-development":
                    isDevelopment = true;   //Developmentビルドにする
                    break;
                default:
                    break;
            }
        }

        var option = new BuildPlayerOptions();
        option.locationPathName = output;
        if(isDevelopment)
        {
            //optionsはビットフラグなので、|で追加していくことができる
            option.options = BuildOptions.Development | BuildOptions.AllowDebugging;
        }
        option.target = BuildTarget.WebGL; //ビルドターゲットを設定. 今回はWebGL
        var result = BuildPipeline.BuildPlayer(option);
        if(result.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
        {
            // ビルド成功処理
        }
        else
        {
            // ビルド失敗処理
        }
    }
}

Unityの新たな利用法として、イラストに使ってみた!!

先日、邪神ちゃんドロップキックイラストコンテスト3というイベントがあり、そこへ投稿するイラストを描いてみました!

ストリートファイターVが好きなので、ゆりねのアパートの前を舞台としたストV風のバトルシーンを描きたいと思ったのですが、とても背景まで描きこむスキルもないので、今回は新たな試みとして、Unityを使って背景を3Dモデルで表現することにしました。キャラクターやストVのUI的なものは、イラストとしてUnity内で取り込み、背景を3DモデルとしてUnity内で3D空間内に配置しています。
ちなみに、3DモデルはBlenderで制作していますが、それほど複雑な形状は無かったので、イラストを描くよりは格段に速く作ることができました。

結果として、意外にイラストと自然にマッチしていてよかったです!!
今後も何かイラスト作成する機会があったら使ってみたいと思います。

以下のイラストは、キャラクター部分を除いたUnityの制作画面です。
上がシーンビューで、下が出力用のゲームビューです。
Unityでイラスト制作

UnityのStandard Assets内にあるスクリプト内で自作したスクリプトの変数が読み込めない原因がわかった!!

てゆーか今まで知らなかったのがまずかったのだが、「Standard Assets」フォルダは特別がフォルダらしく、いわゆる「Resouces」フォルダや「Editor」フォルダみたいな感じの扱いらしい。そして、「Standard Assets」フォルダ内にあるスクリプトは、自作したスクリプトよりも先にコンパイルされるらしく、そうすると、「Standard Assets」フォルダ内にあるスクリプトを編集して、自作したスクリプトの変数などを参照した場合は、コンパイル順が早いため、自作したスクリプトの変数がまだ存在しないからエラーになってしまっていたようだ。

私は、「FirstPersonCharactor」と「ThirdPersonCharactor」のプレハブを使いたかったので、これらのプレハブで使われていたスクリプトを編集したかったのだが、今までこのエラーの原因が分からずにずっと諦めていました。。。
結局、対策としては、「Standard Assets」というフォルダ名にしなければいいわけなので、何か適当な「Standard Assets Test」などのように別のフォルダに変更してあげるだけでよかった!!

アバターを一から作成してみての手順をまとめてみた!!

とりあえず、備忘録的に手順だけまとめてみました。
一つ一つの作業が重かったので、結局全て完成するまで多分500時間くらいかかった気がする(;´Д`)
モデラーの方のすごさを身に染みて感じることができたぁ!!
ちなみに、Virtual Marketに出展するように作ったので、VRChatに関する作業も中に入っています。

【手順】
⓪下絵を描く
①モデルのポリゴン作成 (左右対称ミラーで作ること!!)
  ・作成手順は以下
    頭
    体
    手
    目とまつげ
    髪
    ケモ耳としっぽ
    服
    靴と装飾
    口の中
②ボーン作成
③ウェイトペイント
④VRChatでアバター動作確認
⑤UV展開
⑥テクスチャ作成
⑦シェイプキー作成
⑧ダイナミックボーン設定(もし付ける場合)
⓽アニメーションオーバーライドで表情を割り当て(VRC Avatar Discripter)
⑩クロス設定(もし付ける場合)
⑪アバターをBOOTHで配布準備
⑫VRM対応(必要ならば)

TextMeshProで全日本語対応するとアセット容量が大きすぎて使いにくい!!

結局、全日本語を対応させると、TextMeshProのアセットにすべての日本語が梱包されるようなので、ものすごい容量になってしまう!

ほとんどの日本語は使っていないので、要らない漢字などは全部取り除いて、アセットを作り直したいのだが、そもそもどの日本語がゲーム内で使われているのかわからないので困ってしまった。

そして、色々考えた結果、「プロジェクト内で使用している文字列だけをリストアップしてくれる」エディタ拡張があったので、これを使うことにした!

自分の作っているゲームでは、テキストデータは全てJsonファイルでAssetsフォルダ内に置いていたので、このエディタ拡張でAssetsフォルダ内で使っている日本語だけ抽出してTextMeshProのアセットを作れば、かなり容量削減ができた!!

使わせていただいたエディタ拡張「UsedCharEnumerator」は以下のURLをご参照ください。
https://www.hanachiru-blog.com/entry/2021/05/27/120000

Virtual Market2022 Summerに田植機を出展しました!

今回は、Quest用のワールドでの出展にチャレンジしてみました!
特に作り方は今まで大きく変わらなかったのですが、結構制限がきつかったです。
特に最後まで困ったのは、テクスチャの枚数制限でしょうか。(8枚まで)
ブース全体を作るとテクスチャ8枚はすぐに行ってしまいました。
あと、Quest特有の問題だと思うのですが、いつもは複数のモデルをMeshBakerでモデルもテクスチャもひとまとめにしているのですが、これが使えなかったことが痛かった。。。
よくわからないのですが、MeshBakerで結合したモデルはVR空間で見るとうまく表示してくれませんでした。(確か、色がついてくれなかったような気がします。)
結局、モデルとテクスチャの結合ができなくて、結果、テクスチャ枚数を減らせなくなってしまい、最後まで困ったという感じでした。
あと、地面に水面シェーダーを使ったのですが、これもQuestでは表示してくれませんでした。これは完全にGPUの違いの影響だと思われます。

とにかく、Questワールドは、今までのワールドで出展してきていたので、アップロードまでの手順はスムーズに行きましたが、表示されない問題のところでつまずいた感じでした。おそらく、いきなりQuestワールドで出展したら「全然うまくいかない~!」ってなってイライラしてくる可能性が高いので、やはり初めは通常ワールドで出展したほうが良さそうな気がしました。(だいたい通常ワールドだったらUnityで表示されていた通りにVRChatでも表示される)

冬のVirtual Market2022も出展したかったが、もう締め切り終わっていた。。。

モデルは以下のBOOTHで販売しています。(100円)
https://taroyan3rd.booth.pm/items/4021342

Brackeys Game Jam 2022.1に参加してみた!

少し時間的に余裕ができたので、Brackeys Game Jam2022.1という日本でいうところのunityroomの1週間ゲームジャムのようなイベントに参加してみました!

UnityでWebGLのゲームを作成しました。

今回はゲーム自体は非常にシンプルで、操作はクリックだけど3D謎解きゲームになっています。アイテムなどをクリックして探索をして、暗号を解いて出口から出ればクリアとなります。ゲームはシンプルですが、今回のゲームでは結構内部的にしっかり作りました。特にこだわったところは以下になります。

・UniRx、UniTaskをなるべく使うようにしました。
・マスターデータの管理にJSONファイルを使い、JSONファイル内のデータはExcelで作成するようにしました。

また、今後は以下を改善したいと考えています。
・ExcelからJSONファイルへの書き込みの自動化(Unityエディタ拡張か、Excelマクロか)
・今回は状態管理的な機構をゲーム内に入れなかったが、入れておいたほうがよかったかも。(今はポーズ中、プレイ中、初期化中、タイトル画面中など)

プレイ動画は以下になります。
ゲームのURLはこちら
(WebGLなのでブラウザでプレイできますが、PCの要求スペックが高めかもしれません)
https://tarosansei.itch.io/prisondream

Substanceでローポリモデルにハイポリの凹凸をノーマルマップとしてベークする方法

色々なサイトにやり方が書いてありますが、いつも忘れてしまうので自分用にまとめておきました。


【手順1】
ハイポリモデルを何かダウンロードしてくる。
今回は、「Sculpture showing “St. Anna” from 18th century」を使用させていただきました。
https://sketchfab.com/3d-models/sculpture-showing-st-anna-from-18th-century-f46414a1d86a42349e6cdb046f892a4e
ダウンロード形式は「obj」を指定


【手順2】
Blenderでハイポリモデルをimportする。
インポート画面
【手順3】
まずは、このハイポリをfbxファイルでexportする。
Blenderでfbxファイルの書き出し(Export)
export設定は自由だが、自分は以下のような感じ。
fbx書き出し設定
【手順4】
選択中のハイポリモデルにモディファイア「Decimate」を適応して、ポリゴンを削減する。
Decimateのほうがリメッシュよりも、UVを壊さないから便利らしいです。
BlenderのDecimateモディファイアー
Ratioを1.0から0.1とか、小さい数値にすると削減できるので、目標の削減値になったら、「apply」を適応して、ポリゴンを削減する。
DecimateモディファイアーのApply
【手順5】
ポリゴンを削減したモデルをfbxファイルでExportする。
設定は、ハイポリの時と同じでよい。
ファイル名は「Statue_lowpoly.fbx」などのようにローポリと分かるように書き出しておく。
fbxファイルの書き出し設定
【手順6】
Substance Painterを立ち上げて、New projectでローポリを開く。
Normal Map FormatはBlenderの場合は、OpenGLにしておく。
Substance Painterの新プロジェクト画面
【手順7】
TEXTURE SET SETTINGS内にあるMESH MAPSのところにある「Bake Mesh Maps」ボタンをクリックする。
TEXTURE SET SETTINGS画面
【手順8】
High Difinition Meshesの右側にあるメモのようなアイコンをクリックして、ハイポリのfbxファイルを選択する。
また、Matchのところは、「By Mesh Name」に設定しておく。
そのあと、「Bake selected textures」をクリックするとベーク開始
ベーク設定画面
【手順9】
手順8まで完了すると、MESH MAPSにベークされたテクスチャがセットされる。
よくわからないが、LAYERSで自分でペイントしたテクスチャとは別にデフォルトでセットされるテクスチャとなるようだ。(説明が難しい)
とりあえず、これで凹凸がリアルにつくようなったと思う。(ハイポリの凹凸がノーマルで焼き込まれるので)
ベーク後のTEXTURE SET SETTINGS画面

ベーク前
ベーク後
【手順10】
あとは、Substance PainterのLAYERSでいつも通りテクスチャをペイントしていけばOK
LAYERSで自分でテクスチャを貼り付けた画面
【手順11】
テクスチャ作成が終わったら、テクスチャを書き出す。
Substance PainterでテクスチャExport
【手順12】
設定は自由だが、Unityの場合は添付画像のように設定してExportボタンをクリック
主な設定箇所
・Output directory 保存フォルダ
・Output templete どの形式で出力するか
・File type pngかjpegかなど
・Size 1024pxで出力するかなど
・Padding 不明(UVの各ポリゴンの境界をどうするかなのか?)
テクスチャExportの設定画面
© 2024 Husky Studio, All rights reserved.