読者です 読者をやめる 読者になる 読者になる

VR時代のノベルゲーム開発

この記事は Oculus Rift Advent Calendar 2015 - Qiita の19日目の記事です。

qiita.com

 

ノベルゲームって?

ストーリーを読ませることに特化したゲームジャンルの1つです。

日本では人気のあるジャンルで現在でも沢山のゲームが発表され続けています。

 

ノベルゲーム例 (クリックで進みます)

 

VR時代のノベルゲーム

 VR技術を知った時、一番相性が良いのはノベルゲームじゃないかなと感じてました。

「ディスプレイが邪魔だぁ!」という悲痛な驚嘆に対して、ディスプレイの向こう側へ誘う事ができる。それがVRノベルゲームです。

 

例えば、喫茶店のシーンなどでは、本当に目の前にキャラクターが座ってシナリオが進むような状態を作ることができるということですね!

 

とまぁ、かなり可能性を感じるのですが、現実に実装する際の技術的な問題や実用化してゲームを作っていく際にどのようなスキームで進めていけば良いのかなど、見えてこない部分が多かったので、動くものを作って検証してみました。

 

ストーリーの進行

従来のノベルゲームだと以下のような感じ

f:id:shikemokumk:20151215183925p:plain

画面下に固定のメッセージ枠があって、そこにシナリオが表示されていく。

 

で、VRでもテキストは綺麗に視認できるので普通にテキストを配置すれば良い感じになるんじゃないかと思って作ったのが以下。

 

 

カメラの前にTextMeshを貼り付けて、クリックでテキストを読ませています。

結論からいうと、この方法はダメでした。

テキストだけを読み続けると問題ないのです。

ただVR空間においてはシナリオをよむテキスト枠とゲーム舞台(3Dモデル)の間を交互に見る必要があり、これが手前(文字)→奥(舞台)→手前(文字)→(奥)という感じで、目の奥行きをその度に調整する必要があるのでゲームに没入しにくいという印象でした。

 というわけで、ストーリーはナレーションの声やキャラクターのボイスで進行していくことにします。

 

VRゲームのシナリオファイルの作り方

テキストを使用しないVRノベルといっても、基本はタイムラインがあって、キャラクターの表情変更や声、演出のタイミングなどを指定していく必要があります。

これは旧来のノベルゲームの製作方法と変わらないと気付きました。

演出のタイミングや表情の変更などを全てプログラミングで書いていくというのは現実的ではないでしょう。

非エンジニアがボイスのタイミングや表情、モーションなどを確認しながら簡単につくっていく仕組みが必要じゃないかと思います。

 

ということで、非エンジニアでもVRノベルゲームを作れる。なおかつ

既存のノベルゲーム作者さんが、VR対応のノベルゲームを作る

という方針で設計と実装しました。

 

吉里吉里/KAG タグを使ってVRゲームを作る

現在ノベルゲームを作っている人は吉里吉里/KAGに代表されるような記述方式でゲームを作成しています。

これは、シナリオ部分とゲームに動きを与えるタグを組み合わせることで、動きのあるゲームが作れるというものです。

例えば

[キャラクター登場]

こんにちは

[BGM変更 ]

[背景変更]

 のように、タグに到達すると、音楽を変えたり場面を変えるような言語で、エンジニア以外の人でも簡単につかえます。

 

 

VRノベルゲーム用のタグ設計

タグ解析や進行などの仕組みは、自分が公開しているジョーカースクリプトというUnityのノベルゲーム開発ツールがあるので、そこからゴソッと移植してきました。

マクロや変数管理、シナリオ制御などは既存のノウハウをそのまま流用できる。

従来のノベルゲーム製作手法を拡張してVR用のタグを追加していきます。

 

キャラクター登場

キャラクターをゲームに登場させるためには以下のようなタグを打ちます。

3D空間なので、x y z の3座標をしていしているところが今までのノベルゲームと異なります。名前にunitychan という一意の値を付与しています

;キャラクターを定義

[chara_new name=unitychan storage=unitychan x=0 y=0 z=-2.5]

;キャラクターを表示
[chara_show name=unitychan]
[wait time=3 ]
[p]

 

さらに、キャラクターをクリック毎に立ち位置を変えるタグは

[chara_pos name="unitychan" x=2.5 y=0 z=-2 time=5 ]
[p]
 

 のように記述するようにしました。

これでゲーム開始してみます。
 
 

 

 

簡単なタグ表記だけでVR空間にキャラクターが登場して歩きました。

 

ボイス再生

ボイスの再生も、従来のノベルゲームと異なる概念が必要になります。それは誰が喋ったかという指定が必要 ということです。

VR空間ではキャラクターの立ち位置によって、音の聞こえてくる方向が変わってきます。自分自身の首の方向によっても聞こえ方が異なります。

以下のように、タグを書くことで自動的にどのオブジェクトから音が出ているのかを再生できるようにしました。

[chara_voice name="unitychan" storage="voice1" ]

 

こんな感じで、簡単にVR空間でも適切な音を再生できます。

 

視線待ち命令タグ

VRノベルゲームで起こり得ることが、プレイヤーの視線がドコに向いているかわからないという事があります。

重要なシーンが展開されているのに、プレイヤーが逆方向を向いていて見逃してしまう。なんてことが起こりかねません。

そこで、プレイヤーの視線がある方向に向くまでストーリーを進めないタグを用意しました。以下の様に記述することで、視線がキャラクターに向いた時だけ、シナリオが進みます。

*waiteye
[wait_eye name="unitychan"]
[chara_voice name="unitychan" storage="voice1" ]
[chara_anim name="unitychan" state="anim1"]
 
[wait time=3]
[chara_anim name="unitychan" state="anim1" condition="false"]
 
@jump target="waiteye"

 

この wait_eye タグに到達すると、unitychan に視線が向くまでストーリーを進めません。

これにより、プレイヤーの視線誘導が簡単になり重要な部分の見逃しなどを防ぐことができます。

このシナリオタグを実行すると以下の様な動きになります。

 

 

 

wait_eye タグの部分で視線を待ち、Unityちゃんに視線が向いた時にシナリオが進みます。その先のchara_animタグ(好きなタイミングでモーションを指定できる)が発火してモーションが再生されます。

つまり、視線が向いた時だけ、アニメーションを行なうという動きになります。

jumpタグでラベルloopに戻るので、なんども繰り返されます。

 

この仕組をつかうと、ノベルゲームなどでは重要な物語分岐でも新しい表現ができそうです。例えば、敵に拳銃で恋人が撃たれそうになっている時

「恋人をかばう」

「敵を撃つ」

のような選択肢が表示されるとします。

従来のノベルゲームだとマウスでクリックで選択しますが、

VRノベルだと、その瞬間

「恋人に視線を向けている」

「敵に視線を向けている」

のような状況を判定して、物語が分岐していくようなゲームも作れそうです。

 

プレイヤーの周りを歩かせる

最後にまとめとして、プレイヤーの周りを歩かせる動きを書きます。

以下の短いタグで実現できます。

*loop
[chara_pos name="unitychan" x=1.5 y=0 z=-1.5 time=5 ]
[wait time=6]
[wait_eye name="unitychan"]
 
[chara_pos name="unitychan" x=1.5 y=0 z=1.5 time=5 ]
[wait time=6]
[wait_eye name="unitychan"]
 
[chara_pos name="unitychan" x=-1.5 y=0 z=1.5 time=5 ]
[wait time=6]
[wait_eye name="unitychan"]
 
[chara_pos name="unitychan" x=-1.5 y=0 z=-1.5 time=5 ]
[wait time=6]
[wait_eye name="unitychan"]
 
@jump target="loop"

 

再生すると以下のような動きをします。

目線が向くと自分の周りを歩いてくれます。

 

VR空間上の複雑なシナリオも、簡単なタグを組み合わせて定義できるので修正や調整なども容易にできるかと思います。

 

まとめ

今回は、従来のノベルゲームの開発手法をVRのノベルゲームで使用できないか。というところから実装してみました。

結果として、今回紹介したタグだけでも組み合わせれば、かなり多彩なゲームが作れそうだという感触を得ることができました。

もちろん、今の状態ではVRゲーム向けに必要なタグは全然足りませんが、

吉里吉里やティラノスクリプトを使っている、2Dノベルゲーム開発者の方でも、違和感なく作れそうですよね?)

 

簡単なスクリプトでVR空間を定義できるというのはメリット多いと感じました。

 

というわけで

自分自身もVRアプリを作りたいと思っていたのですが、このタグによるVRアプリは実用に耐えれると感じました。

なので、着々と拡張を進めていく予定です。

今回はUnityで作りましたが、UE4でも試してみてうまく行けそうな方で実装してみたいと思います。

 

目標はVRコンテンツ製作の敷居をぐっと下げるツール です。

ただ、一番の壁はやはり、3Dモデリングだと思っているのですが、以下の様なプロダクトも準備されているようなので、VRノベルの敷居が下がる日は確実に到来しそうです。

 

gigazine.net

 

製品版のRift 発売日あたりに公開したいな〜。

来年の目標の1つとしてみます。

 

せっかくなのでちょっと募集も。。。

このプロダクトを作るにあったって3Dモデリング、アニメーションなどをお手伝いしてくれる方を募集します。

完全に個人的なプロジェクトなので、報酬的には厳しい(学生さんのアルバイトくらい)しかお支払い出来ないのですが、3Dを勉強中の方など、興味がある方がいらっしゃいましたら、お気軽にお声がけください。

 

 

明日は udasan_koubou さんの 女の子にケーキを作ってもらう方法 です