あまり開発の時間は無かったのですが、アイデアだけは以前から1つあったので、ちょっと頑張って作ってみました!
以下のunityroomで無料でプレイできます。
https://unityroom.com/games/revolverwitches
アイデアと言っても、すごく漠然としていて、「UnityのRigidbodyを使って、速度を維持したまま、上下左右に移動させたり、速度を維持したまま瞬間移動させたりすると面白いんじゃないか」という程度のものでした。
そうして、とりあえず作ってみたものの、初めはシューティングゲームっぽく沢山の敵を殲滅させて爽快感を出すことを考えていたのですが、思ったほど爽快感が無く、シンプルなインベーダーゲームみたいになってしまって、ゲーム性を変えることにしました。結局、パズル要素というか、「どこから弾丸を発射すると敵を殲滅できるか」という、考えさせるゲームにしてみました。
プレイ動画は以下のYoutubeで見れます。
作ってみて、弾丸の速度がゆっくりと落ちていくのですが、止まる寸前で最後の敵1体を撃破できるようにしてみたところ、意外に「あは体験」みたいな爽快感があるような気がしましたw
そして、作ってみて気づいたのですが、このゲームはステージを作る側からすると、結構簡単に問題を作ることができてしまうということです!発射する位置を決めて、あとは反射する矢印を適当に配置して、敵も適当に配置して、あとはうまくいくように調整すると好きな難易度で問題を作ることができます。逆に問題は、「作ってみて実際に難易度が自分でわからない」ということですね。答えを知ってしまっているので、全く初見でこのステージはどれくらいの難易度なのかがよくわらかないのです。unityroomでのコメントにもありましたが、恐らくちょっと難易度が高くなってしまっていた気がします。
縦長の画面から分かるように、今後はAndroidとiOSでゲームを配信したいと考えています。とりあえずまずはunityroomでα版を作ってみた感じでした。
WebGLでシーン遷移の時にDoTweenを使っていたらエラーで動かなくなった!!
以下のサイトに完全に答えが書いてありました!!
https://unity-yuji.xyz/scene-load-transition-dotween-webgl/
ちなみに、シーンはLoadSceneAsyncであらかじめロードしておき、allowSceneActivationをfalseにしておいて、シーン遷移の時にtrueにすることで遷移していました。
ちなみにUnity Editorではエラーは発生せず、WebGLでシーン遷移すると以下のようなエラーが出て止まります。
【自分が選んだ直し方】
SequenceをOnDisable関数の中で「Kill」して削除する。
ちなみに、OnDisable関数はシーン遷移する直前に必ず呼ばれるみたい。
【参考コード】
https://unity-yuji.xyz/scene-load-transition-dotween-webgl/
ちなみに、シーンはLoadSceneAsyncであらかじめロードしておき、allowSceneActivationをfalseにしておいて、シーン遷移の時にtrueにすることで遷移していました。
ちなみにUnity Editorではエラーは発生せず、WebGLでシーン遷移すると以下のようなエラーが出て止まります。
【自分が選んだ直し方】
SequenceをOnDisable関数の中で「Kill」して削除する。
ちなみに、OnDisable関数はシーン遷移する直前に必ず呼ばれるみたい。
【参考コード】
public class MoveArrowController : MonoBehaviour
{
public float endValue;
public float duration;
private Sequence seq; // シーケンス
// Start is called before the first frame update
void Start()
{
seq = DOTween.Sequence();
seq.Append(this.transform.DOLocalMoveX(endValue, duration).SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutQuad));
}
private void OnDisable()
{
seq.Kill(); // これを書かないとエラー
}
}
いきなりUnityでAndroidのプラットフォームでビルドが出来なくなった!!
バージョン「Unity2020.3.2f1」を使っていたのだが、今まで普通にAndroidでビルドしてapkファイルを生成できていたのに、いきなりできなくなった!!
特に何もしていないのに。
エラーとしては以下のようなエラーだった。
Gradle build failed. See the Console for details.
つまり、詳細はコンソールを見ろとのことなので見てみた。 うむ。全くわからん!!
とにかくわからないので、空のプロジェクトを作って、Androidでビルドしたら、やはり上と同じエラーが出てビルドが出来なかった。
つまり、プロジェクトの中身は関係なく、Unityがビルドできなくなっていることが判明。
そして、試しに、別のUnityバージョンでビルドしたら、ビルドできた!!
つまり、「Unity2020.3.2f1」のバージョンでだけAndroidでのビルドが出来なくなっているっぽいのだ!!
■対処法
もう何が原因か分からないので、とりあえず近いバージョンということで、「Unity2020.3.4f1」にプロジェクトを変更して、このバージョンでビルドしたらできた!!
結局原因はわからないままだが、バージョン変えて動いたので深く考えないことにした。
特に何もしていないのに。
エラーとしては以下のようなエラーだった。
Gradle build failed. See the Console for details.
つまり、詳細はコンソールを見ろとのことなので見てみた。 うむ。全くわからん!!
とにかくわからないので、空のプロジェクトを作って、Androidでビルドしたら、やはり上と同じエラーが出てビルドが出来なかった。
つまり、プロジェクトの中身は関係なく、Unityがビルドできなくなっていることが判明。
そして、試しに、別のUnityバージョンでビルドしたら、ビルドできた!!
つまり、「Unity2020.3.2f1」のバージョンでだけAndroidでのビルドが出来なくなっているっぽいのだ!!
■対処法
もう何が原因か分からないので、とりあえず近いバージョンということで、「Unity2020.3.4f1」にプロジェクトを変更して、このバージョンでビルドしたらできた!!
結局原因はわからないままだが、バージョン変えて動いたので深く考えないことにした。
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にする必要がある。ここがなかなか見つけられなかった。
■ヘッドセット側も開発者モードの設定をしなくてはいけない
この設定は、スマホで「Meta Quest」アプリをインストールして、このアプリ内でQuest2を認識させてから、その「デバイスの管理」→「ヘッドセットの設定」→「開発者モード」を選択することでONできる。つまり、スマホで設定しないといけない。
■SideQuestは「Advanced Installer」を選択
Easy InstallerとAdvanced Installerがあるようだが、Advanced Installerのほうがわかりやすかった。多分Easyのほうでもいいのかもしれないが、よく使い方が分からなかった。
■Quest2用のVRのプロジェクトにはどのテンプレートやSDKを使えばいいのかわからなかった。
以下の3種類がぱっと思いつく。
①SteamVR Plugin
②Oculus Integration
③UnityのVR テンプレート
全て試したわけではないが、開発していくのであれば、③のUnityのVRテンプレートがいいのではないかと思った。
①のSteamVR PluginはWindowsPC内でVRゲームを作るのであればいいと思うが、apkファイルにしてQuest2に入れてもVRとして動かなかったので、Quest2のスタンドアロン型VRゲームができないのではないかと思う。
②は試していないのでわからない。(何となくVIVEとQuest2の両対応できそうな気がする)
③は両対応ができることを確認した。
■Window用であればプラットフォームをPCでビルド、Quest用であればAndroidでビルド
これは当然だが念のため。
■SteamVR Pluginで開発する場合は、SteamVRを起動させないといけない。
Unityプロジェクトを再生すると勝手に起動するかもしれないが念のため。
■UnityのVRテンプレートで開発する場合は、SteamVRは不要なようだ。
UnityのVRテンプレートを動かしたときはSteamVRは起動していなかったので、SteamVRを経由していないようだった。
■開発中にQuest2を使って動作確認する場合
まず、Quest2とPCをUSBケーブルで接続する。(同一LAN内ならOculus Air Linkでもいけるのかも)
Quest2内で「Oculus Link」(もしくはOculus Air Link)を起動して、PCとQuest2をリンクしておかないといけない。
とりあえず、開発の準備はできた感じ!!
①まずは以下の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にする必要がある。ここがなかなか見つけられなかった。
■ヘッドセット側も開発者モードの設定をしなくてはいけない
この設定は、スマホで「Meta Quest」アプリをインストールして、このアプリ内でQuest2を認識させてから、その「デバイスの管理」→「ヘッドセットの設定」→「開発者モード」を選択することでONできる。つまり、スマホで設定しないといけない。
■SideQuestは「Advanced Installer」を選択
Easy InstallerとAdvanced Installerがあるようだが、Advanced Installerのほうがわかりやすかった。多分Easyのほうでもいいのかもしれないが、よく使い方が分からなかった。
■Quest2用のVRのプロジェクトにはどのテンプレートやSDKを使えばいいのかわからなかった。
以下の3種類がぱっと思いつく。
①SteamVR Plugin
②Oculus Integration
③UnityのVR テンプレート
全て試したわけではないが、開発していくのであれば、③のUnityのVRテンプレートがいいのではないかと思った。
①のSteamVR PluginはWindowsPC内でVRゲームを作るのであればいいと思うが、apkファイルにしてQuest2に入れてもVRとして動かなかったので、Quest2のスタンドアロン型VRゲームができないのではないかと思う。
②は試していないのでわからない。(何となくVIVEとQuest2の両対応できそうな気がする)
③は両対応ができることを確認した。
■Window用であればプラットフォームをPCでビルド、Quest用であればAndroidでビルド
これは当然だが念のため。
■SteamVR Pluginで開発する場合は、SteamVRを起動させないといけない。
Unityプロジェクトを再生すると勝手に起動するかもしれないが念のため。
■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を買ってしまった!
とりあえず、便利らしいのでまずは使い方を学んでいきたい!!
使い方を学ぶために備忘録的にこのブログでまとめておこうかなぁ。
ちなみにBLACK FRIDAYのセールはまだやっているみたいなので、便利なアセットを安く買えるチャンスかもしれません!
https://assetstore.unity.com/?locale=ja-JP
とりあえず、便利らしいのでまずは使い方を学んでいきたい!!
使い方を学ぶために備忘録的にこのブログでまとめておこうかなぁ。
ちなみにBLACK FRIDAYのセールはまだやっているみたいなので、便利なアセットを安く買えるチャンスかもしれません!
https://assetstore.unity.com/?locale=ja-JP
Unityをコマンドラインでビルドするためのバッチファイルの内容を忘れないようにメモ!!
いつも、Unityをコマンドラインでビルドする方法を忘れてしまうので、備忘録的にメモしておいた!!
つまり、バッチファイルから、エディタ拡張スクリプト内の「Build()」関数を呼び出している感じです。
ビルドのプラットフォームは「WebGL」にしています。
バッチファイル側(autobuild.batファイル)
つまり、バッチファイルから、エディタ拡張スクリプト内の「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の制作画面です。
上がシーンビューで、下が出力用のゲームビューです。
ストリートファイターVが好きなので、ゆりねのアパートの前を舞台としたストV風のバトルシーンを描きたいと思ったのですが、とても背景まで描きこむスキルもないので、今回は新たな試みとして、Unityを使って背景を3Dモデルで表現することにしました。キャラクターやストVのUI的なものは、イラストとしてUnity内で取り込み、背景を3DモデルとしてUnity内で3D空間内に配置しています。
ちなみに、3DモデルはBlenderで制作していますが、それほど複雑な形状は無かったので、イラストを描くよりは格段に速く作ることができました。
結果として、意外にイラストと自然にマッチしていてよかったです!!
今後も何かイラスト作成する機会があったら使ってみたいと思います。
以下のイラストは、キャラクター部分を除いたUnityの制作画面です。
上がシーンビューで、下が出力用のゲームビューです。
UnityのStandard Assets内にあるスクリプト内で自作したスクリプトの変数が読み込めない原因がわかった!!
てゆーか今まで知らなかったのがまずかったのだが、「Standard Assets」フォルダは特別がフォルダらしく、いわゆる「Resouces」フォルダや「Editor」フォルダみたいな感じの扱いらしい。そして、「Standard Assets」フォルダ内にあるスクリプトは、自作したスクリプトよりも先にコンパイルされるらしく、そうすると、「Standard Assets」フォルダ内にあるスクリプトを編集して、自作したスクリプトの変数などを参照した場合は、コンパイル順が早いため、自作したスクリプトの変数がまだ存在しないからエラーになってしまっていたようだ。
私は、「FirstPersonCharactor」と「ThirdPersonCharactor」のプレハブを使いたかったので、これらのプレハブで使われていたスクリプトを編集したかったのだが、今までこのエラーの原因が分からずにずっと諦めていました。。。
結局、対策としては、「Standard Assets」というフォルダ名にしなければいいわけなので、何か適当な「Standard Assets Test」などのように別のフォルダに変更してあげるだけでよかった!!
私は、「FirstPersonCharactor」と「ThirdPersonCharactor」のプレハブを使いたかったので、これらのプレハブで使われていたスクリプトを編集したかったのだが、今までこのエラーの原因が分からずにずっと諦めていました。。。
結局、対策としては、「Standard Assets」というフォルダ名にしなければいいわけなので、何か適当な「Standard Assets Test」などのように別のフォルダに変更してあげるだけでよかった!!
アバターを一から作成してみての手順をまとめてみた!!
とりあえず、備忘録的に手順だけまとめてみました。
一つ一つの作業が重かったので、結局全て完成するまで多分500時間くらいかかった気がする(;´Д`)
モデラーの方のすごさを身に染みて感じることができたぁ!!
ちなみに、Virtual Marketに出展するように作ったので、VRChatに関する作業も中に入っています。
【手順】
⓪下絵を描く
①モデルのポリゴン作成 (左右対称ミラーで作ること!!)
・作成手順は以下
頭
体
手
目とまつげ
髪
ケモ耳としっぽ
服
靴と装飾
口の中
②ボーン作成
③ウェイトペイント
④VRChatでアバター動作確認
⑤UV展開
⑥テクスチャ作成
⑦シェイプキー作成
⑧ダイナミックボーン設定(もし付ける場合)
⓽アニメーションオーバーライドで表情を割り当て(VRC Avatar Discripter)
⑩クロス設定(もし付ける場合)
⑪アバターをBOOTHで配布準備
⑫VRM対応(必要ならば)
一つ一つの作業が重かったので、結局全て完成するまで多分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
ほとんどの日本語は使っていないので、要らない漢字などは全部取り除いて、アセットを作り直したいのだが、そもそもどの日本語がゲーム内で使われているのかわからないので困ってしまった。
そして、色々考えた結果、「プロジェクト内で使用している文字列だけをリストアップしてくれる」エディタ拡張があったので、これを使うことにした!
自分の作っているゲームでは、テキストデータは全てJsonファイルでAssetsフォルダ内に置いていたので、このエディタ拡張でAssetsフォルダ内で使っている日本語だけ抽出してTextMeshProのアセットを作れば、かなり容量削減ができた!!
使わせていただいたエディタ拡張「UsedCharEnumerator」は以下のURLをご参照ください。
https://www.hanachiru-blog.com/entry/2021/05/27/120000