Unity初心者によるスマホVRゲームづくりメモ

はじめに

この記事は初投稿のテストがてら、Unityに触れて半年とたたない初心者の自分が、スマホのVRゲームを作る時にやったことを、徒然なるままに書き連ねたものです。
書いてあるのはかなり簡単なことばかりなので、「Unityは少ししか触ったことないけど、スマホVRのなんかを軽く作ってみたいなー」というような人向け。Unityの基本操作や想定のプラットフォーム(AndroidまたはiOS)へのビルド方法はある程度知っている前提で書いております。

この記事で紹介するのは、「両眼視差の表現」、「ジャイロによる視点操作」、「Unityエディター上での視点操作」、「レティクルの配置」についてです。

なお、私が使用しているのは
macOS Catalina 10.15.4
Unity 2019.3.13f1
Xcode (Version 11.3)
となっております。ご参考までに。

方針

そもそもUnityと言いますと、多くのクリエイターたちによる優秀なアセットやパッケージが豊富に公開されています。これらを上手に活用することで、作業効率を高めたり、作品のクオリティを高めたりといったことが可能となります。
スマホVRのためのものも当然いくつか存在しておりますが、今回は習熟のためそれらをなるべく使用せず、「作れるものは自分で用意する」ことを基本方針としておりますことをご了承ください。

最初にやること

さて、さっそく「両眼視差の表現」と「ジャイロによる視点操作」を実現していきましょう。
これにはいくつかの方法が考えられます。
1. 公開されているパッケージを使う
  利点:有用なプレハブやスクリプトなどが用意されている
  欠点:パッケージ関連のエラーを対処するのに時間がかかる(Unity初心者としての個人的な意見)
2.  シーン上にカメラを2つ設置して回転をスクリプトで制御する
  利点:構造として非常に簡潔
  欠点:VRゴーグルのレンズによって生じる歪みに対応するのが難しい
3. CardBoardに対応するよう設定する(Unity 2017以降で可能)
  利点:簡単
  欠点:バージョンによっては設定不可能
それぞれに利点・欠点がありますが、今回は方針に沿ったうえで最も簡単な3を選びます。
まずは新しい3Dプロジェクトを作成します。

スクリーンショット 2020-07-08 18.36.19

(忘れないうちにFile>Build Settingsから、ターゲットとするプラットフォームを選択し、Swith Platformしておきましょう。)
そしてEdit>Project Settingsを選択し、PlayerSettingsを表示します。その後Settings for iOSのタブ(ターゲットプラットフォームがAndroidの場合そちらで)でXR Settingsの項を開き、Virtual Reality Supportedにチェックを入れ、Virtual Reality SDKsCardBoardを追加します。

スクリーンショット 2020-07-08 18.40.26

最初にやることはこれだけです。なんとこれだけの設定で、スマホVRの肝心な要素である「両眼視差の表現」と「ジャイロによる視点操作」の両方を実装することができます。お手軽ですね。

Unityエディターでテストプレイするために

さあこれでスマホVRゲームを作る基礎が整ったわけで、あとはゲームを作っていくだけ…なのですが、このままだと1つ困ることがあります。
それがこれ。

スクリーンショット 2020-07-08 18.52.18

エディター上で再生しようとするとこんな注意が。エディターでのテストプレイには対応していないみたいです。
しかしこれでは何かと不便なので、エディター上でもカメラを動かせるようにしましょう。
以下のスクリプトを作成してください。

#if UNITY_EDITOR
using UnityEngine;

public class EditorTest : MonoBehaviour
{
	[SerializeField] float sensitivity = 1000;
	Transform player;
	float XRotate=0;
	bool exit=true;
	bool isFirst;
	
	void Start(){
		player=transform.parent;
	}
	void Update(){
		if(Input.GetKeyDown(KeyCode.Q))
		{
			Flipper();
		}
		if(exit) return;
		if(isFirst&&Input.GetAxis("Mouse X")!=0)
		{
			isFirst=false;
			return;
		}
		float MouseX=Input.GetAxis("Mouse X")*sensitivity*Time.deltaTime;
		float MouseY=Input.GetAxis("Mouse Y")*sensitivity*Time.deltaTime;
		XRotate-=MouseY;
		XRotate=Mathf.Clamp(XRotate,-90,90);
		transform.localRotation=Quaternion.Euler(XRotate,0,0);
		player.Rotate(Vector3.up*MouseX);
	}
	void Flipper(){
		exit=!exit;
		if(Cursor.lockState==CursorLockMode.None){
			Cursor.lockState=CursorLockMode.Locked;
			isFirst=true;
		}
		else if(Cursor.lockState==CursorLockMode.Locked){
			Cursor.lockState=CursorLockMode.None;
		}
	}
}

#endif

このスクリプトを、入れ子構造にしたカメラにアタッチすることで、Unityエディタ上で動かしたときに、Qキーを押せば視点操作ができるようになります。(もう一度押せば解除できます。視点を固定した状態でインスペクタを確認したいときに使うためこのようにしています)

スクリーンショット 2020-07-08 18.54.42

照準の設置

さて、これで今度こそVRゲームを制作する準備は整いました。
しかし、最後にもう一つだけ作業を、料理にパセリを添えるかの如くやっておきましょう。
やることは簡単。HierarchyにCanvasをMain Cameraの子要素として追加し、CanvasコンポーネントのRender ModeをWorld Spaceに変更、Rect Transformの値を画像のように変更します。

スクリーンショット 2020-07-08 18.57.21

そして、そのCanvasの子にTextを追加、そのRect Transformの値を画像のように変更し、Textコンポーネントをいじって上下左右共に中央揃えにしてTextボックスに+と打ち込むだけ。(フォントサイズはお好みで。)

スクリーンショット 2020-07-08 18.57.29

これで、プレイヤーの視界の前方に常に表示される照準の完成です。
視線(正確には頭の向き)によってオブジェクトやボタンを選ばせる際、照準があると分かりやすいので、これだけでも最初に用意しておくとよいかと思います。

最後に

以上で説明を終わります。
Unityは書籍やネットにて様々な人が様々なことについて解説していますが、初心者なりに書いたこの記事もその中の一つとして誰かの役に立てることがあればよいと思います。

この記事が気に入ったらサポートをしてみませんか?