LoginSignup
3
1

More than 1 year has passed since last update.

[STYLY] VR内で動く乗り物を作ろう

Last updated at Posted at 2021-12-19

CarDriving-w500.gif

はじめに

この記事は STYLYアドベントカレンダー 19日目向けの記事です。

STYLYは、VRやARのシーンをWebから簡単に作れて様々なデバイスで動かすことができるプラットフォームですが、自分自身の移動方法はデバイスごとに決まったものが用意されているのみです。

でもVR内で乗り物に乗りたい、と思うこともあると思います。
そこで、本記事では、自分で操作できる乗り物を作ってみます。

なお、PlayMakerアセット(有償)を利用しますのでご注意ください。
また、このあたりのSTYLYの仕様は今後変化する可能性があります。

ターゲットユーザー

本記事は、以下のようなユーザーを対象にしています。

  • Unityの基本的な利用方法を知っている
  • STYLYへのアップロード方法を知っている
  • PlayMakerの基本的な使い方を知っている

必須ツール

本記事の手法には以下の環境が必要です。

STYLYの既存の移動方法

STYLYではデフォルトとして以下の移動方法を利用できます。

  • VR向け: テレポート + その場回転
  • Web向け: W/A/S/Dキーによる前後左右の移動 + ドラッグで回転
  • スマホ向け: 前進ボタン (セッション時はジョイパッド移動)+ スワイプで回転

VR酔いに関する注意

VR版STYLYで採用されている移動手法は瞬間的なテレポートですが、これは非常にVR酔いしづらい移動方式です。しかし、今回作成するような、乗り物のようなスムーズに自分が動くような移動方式は、一般的にいってVR酔いしやすい移動方法といえます。特に、プレイヤーが想定していない方向やタイミングで移動したり、フレームレートが低くてガタガタしたりといったケースで特にVR酔いが発生しやすくなります。この点注意して作成していただければと思います。

また、作成する立場ではかなりVR酔いに見舞われやすいことにもご注意ください。

今回作成する乗り物アセットについて

理解のしやすさを考慮して、今回はXZ平面上で移動する乗り物を作成します。
障害物や地形との当たり判定などは行いません。
乗り降りについても今回は作りません。
また、STYLYの仕様の関係で、残念ながらスマホ版では挙動がおかしくなります。

乗り物の加減速について

シンプルな方法としたいので、VRコントローラーのトリガーまたはスペースキーを押すと加速、離すと減速とします。1
VRデバイスによってはトリガーがないケースなどがありますが、今回は対応外になります。

仕組みについて

VR環境およびマルチプレイヤー版のWeb環境では、 [VRTK]_VIVE という名前のゲームオブジェクトを取得し、毎フレーム移動させることでプレイヤーが移動します。Web用のPlayer環境では、メインカメラを取得し、移動させます。
Studioでも同様のカメラ動作が実行されるため、編集操作が難しくなる点にはご注意ください。

乗り物の向きの変更について

乗り物の向きの変更操作をどうするかは悩ましい点があります。通常の操作系がそのまま効いているため、それとバッティングする形で強制的に方向を変更するなどすると、操作性が悪くなりますし、VR酔いの原因にもなります。

このため今回は、通常の回転操作をそのまま利用することにします。各デバイスはその場回転の方法があるので、それをそのまま乗り物の方向にします。VRでは顔にくっついたような印象が出るなどいくぶん違和感がありますが、許容することにします。

仕組みについて

メインカメラの向き(=プレイヤーの向き)を取得し、乗り物モデルの向きが同じ方向になるように変更します。

乗り物の移動方向について

トリガー(またはスペースキー)を押すと、乗り物の前方向に進むようにします。

仕組みについて

乗り物モデルのローカル座標系での前方向 (0.0.1) を Transform Direction アクションを利用してワールド座標に変換することで、ワールド座標における乗り物の方向ベクトルを算出します。これに速度を掛けることでプレイヤーの移動量を算出し、プレイヤーの座標に加算します。

作業の流れ

  1. アップロード環境準備
  2. 乗り物モデルの準備
  3. 乗り物モデルの配置
  4. デバッグ用メッセージテキストの作成
  5. 乗り物FSMを作る:車が動くようにする
  6. 乗り物FSMを作る:自分が動くようにする
  7. STYLYにアップロード
  8. STYLY Studioで配置
  9. 風景モデルの追加

0. 完成パッケージ

以下の作業を行いたくない方用、あるいは見比べたい方用に、できあがったunitypackageを用意しました。
STYLYCarRideSample.unitypackage

完成パッケージ利用方法

  • 以下の1.と2.の作業を行います
  • STYLYCarRideSample.unitypackage をUnityにインポートします
  • Assets/CarRide/CarRoot.prefab をSTYLYにアップロードします
  • STYLY Studioを起動して、アセット追加画面で、3D Model -> My Models & Upload より、任意のシーンに配置してください

1. アップロード環境準備

1.2. STYLY-Pluginのインストール

STYLYのアップロード環境を作成します。
STYLY Plugin For Unity をダウンロードし、セットアップしましょう。

こちらの記事が参考になります。
https://styly.cc/ja/manual/unity-asset-uploader/

1.3. PlayMakerのインストール

上記のUnityプロジェクトに、PlayMakerアセット(有償)をインストールします。
以下の記事が参考になると思います。
https://styly.cc/ja/tips/unity-playmaker-game-beginner-1/

2. 乗り物モデルの準備

今回は平面上を移動するので、車両などのモデルを準備しましょう。

今回は、こちらの無料アセット 3D Low Poly Car For Games (Tocus) を利用してみましょう。
https://assetstore.unity.com/packages/3d/vehicles/land/3d-low-poly-car-for-games-tocus-101652?locale=ja-JP

アセットをダウンロードし、プロジェクトにインポートします。
image.png

乗り物はなんでも良いですが、運転手から外が見やすいもののほうが、位置合わせがシビアにならないので良いと思います。また、描画負荷が軽いものが良いでしょう。

2.1 窓マテリアルの透明度を上げる

窓から外を見る形になるので、窓ガラスの透明度を上げます。Tocus_Windows.mat を選択して、Albedoの色の値を編集し、A (Alpha)の値を20ぐらいにしましょう。
image.png

3. 乗り物モデルの配置

ここまででアセットの準備はできました。
新しいシーンを作って作業していきましょう。

  • シーン作成: CarRide フォルダ内 CarRide シーン

乗り物のルートオブジェクトを作成します。

  • ヒエラルキーに Create EmptyCarRoot オブジェクトを作成します。
  • CarRoot は以下の座標にします。
    • Position: 0,0,0
    • Rotation: 0,0,0
    • Scale: 1,1,1

車のモデルオブジェクトをCarRoot オブジェクトの子に配置します。

  • Assets/Car_Low/Tocus/Prafab/Tocus プレハブを CarRoot にドロップして配置します。
  • CarRoot の子になるようにします。
  • Tocus の座標は以下のようにします。
    • Position: 0,0.38,0
    • Rotation: 0,0,0
    • Scale: 1,1,1

image.png

※ 今回の3Dモデルでは上記の値が良いですが、ほかの3Dモデルを利用する場合は、以下の条件になるように調整しましょう

  • 正しいスケールになるようにする(Unityの1単位が1mと考えて、正しい大きさにする)
  • 地面に接地するようにする

4. デバッグ用テキストUIを配置する

PlayMakerが複雑になってくると、実際にちゃんと動いているか気になってくると思います。
このため、PlayMakerから状態を表示するためのテキスト領域を作っておきましょう。

image.png

  • CarRoot の子に、UI カテゴリ内の Canvas を追加します。
    • シーン直下に作成する方法もありますが、GameObjectをprefab化したときにリンク切れすることがあるのでご注意ください。
  • CanvasのRender ModeWorld Space に変更
  • キャンバスのパラメータは以下のようにします。
    • Scale: 0.1, 0.1, 0.1
    • Width: 1000
    • Height: 400
    • Pos X: 0
    • Pos Y: 15
    • Pos Z: 60
  • こうすることで、乗り物の前方に常時確認できる確認できる大きいキャンバスが作成されます。
  • このキャンバスの子に UI カテゴリの Text オブジェクトを追加します。
    • オブジェクト名は MessageText に変更します。
    • 配置場所は自由ですが、キャンバス上半分のどこかにしておくと良いでしょう。
      • 座標例
        • PosX: 0
        • PosY: 170
        • PosZ: 0
        • Width: 400
        • Height: 60
    • Color は 白色にすると見やすいことが多いです
    • Best Fit をONにしておくと、適切なフォントサイズに調整してくれるので便利です。
    • Text の初期値は Message とでもしておきましょう。
  • Canvas および MessageText の Layer 設定をDefaultにしておきます。

image.png

5. 乗り物FSMを作る

5.1. トリガーハンドラを作る

VRでは、コントローラーのトリガーで加速し、トリガーを離すと減速するようにしたいのですが、STYLYではトリガーの情報はイベントの形で伝わってきます。
このため、PlayMakerのFSMを利用して、ONとOFFの2つの状態を持ち、その間をイベントで遷移するようなFSMを作りましょう。
現在、どちらの状態になっているかは、IsTriggerDown 変数に保存しておくことにします。

オブジェクトとFSMの追加

CarRoot の下に Create EmptyTriggerHandler ゲームオブジェクトを作成します。

  • ゲームオブジェクト追加
    • 親: CarRoot ゲームオブジェクト
    • 名前: TriggerHandler
    • コンポーネント: PlayMakerFSM

FSMにトリガーイベントを追加

PlayMakerFSMコンポーネントのEditボタンを押し、EventsタブのAdd Event の欄を使って、以下の4つのイベントを登録します。文字列を正確に入力しましょう。

  • Global_TriggerPressDown_L
  • Global_TriggerPressDown_R
  • Global_TriggerPressUp_L
  • Global_TriggerPressUp_R

左端のチェックボックスはGlobalイベントのチェックボックスですが、チェックしなくても良いです。

イベントが登録されると、以下のようになります。
image.png

FSMに変数を追加

以下の変数を追加 Add しましょう。

  • New Variable: IsTriggerDown
  • Variable Type: Bool
  • Input: OFF
  • Output: ON

※OutputをONにすると、PlayMakerFSMコンポーネントのOutput欄に値が表示されます。

image.png

FSMの遷移を作成

デフォルトのStateの名前を TriggerUp に変更し、新規ステートを追加して名前を TriggerDown としましょう。

各ステートの Add Transition メニューを使って、2つのステートのトランジションを以下のように作成します。

  • TriggerUp ステート
    • Global_TriggerPressDown_L イベント: TriggerDown ステートに遷移
    • Global_TriggerPressDown_R イベント: TriggerDown ステートに遷移
  • TriggerDown ステート
    • Global_TriggerPressUp_L イベント: TriggerUp ステートに遷移
    • Global_TriggerPressUp_R イベント: TriggerUp ステートに遷移

image.png

また、各ステートにアクションを設定し、IsTriggerDown 変数の値をセットします。

  • TriggerUp ステート
    • Set Bool Value アクション
      • Bool Variable: IsTriggerDown
      • Bool Value: OFF
      • Every Frame: OFF

image.png

  • TriggerDown ステート
    • Set Bool Value アクション
      • Bool Variable: IsTriggerDown
      • Bool Value: ON
      • Every Frame: OFF

image.png

デバッグ用の仕掛け

このイベントはVR版STYLYでしか発生しませんので、実機で本当に動作しているか確認するのはちょっと難しいことになります。しかし、前の項目で作成したTextを利用してこれを可視化することで、自信をもって作成することができます。

TriggerUp ステートを通ったときに、キャンバスに配置したメッセージテキストに Trigger Up というテキストを表示し、TriggerDown ステートを通ったときに Trigger Down と表示すれば、実際にこの遷移がうまくいっていることがわか
ります。

UI Text Set Text アクションを以下のように追加することで、これを実現することができます。

  • GameObject: MessageText オブジェクト
  • Text: Trigger Up (TriggerDownのほうのステートでは Trigger Down にする)

image.png

また、このような場合に Local Preview Tool が役にたちます。ブラウザーでSTYLY Studioを使うことなく、即座にSTYLYアプリでシーンの動作を確認することができます。ビルドの時間も短いので、実機確認の手間を大幅に短縮できます。

STYLY メニュー → Local Preview Tool で起動できます。

Local Preview Toolの画面
image.png

Local Preview Toolを使ってQuest2で動作確認する様子

TriggerUpDown.gif

参考: Local Preview Toolの紹介

5.2. スピードコントローラーを作る

乗り物の速度を上げ下げする仕掛けを作ります。
スペースキーまたはVRコントローラーのトリガーがおされていたらスピード値をアップ、押されていなかったらスピード値をダウンするようにします。これを秒間10回行うことにします。
また、スピード値は下限が0、上限をMaxSpeed変数の値とします。
スピード値はSpeed変数で表して、外のFSMから参照することにします。

まず、CarRoot ゲームオブジェクトの子に、SpeedController ゲームオブジェクトを追加しましょう。

  • ゲームオブジェクト追加
    • 親: CarRoot ゲームオブジェクト
    • 名前: SpeedController
    • コンポーネント: PlayMakerFSM

FSMを以下のように編集します。

変数の作成

Variables タブを選択して、以下のような変数を追加します。

  • IsSpaceKeyDown
    • スペースキーを押しているかを保持します。
    • Variable Type: Bool
  • IsTriggerDown
    • VRコントローラーのトリガーを押しているかを保持します。
    • Variable Type: Bool
  • Speed
    • 現在の速度値を保持します。
    • Variable Type: Float
    • Output: ON
      • PlayMakerFSMコンポーネントのインスペクター上で変数の値を確認できるようにします。
  • MaxSpeed
    • 速度の最大値を保持します。
    • Variable Type: Float
    • Value: 5
      • ※ 0ではない値をセットしておきましょう。
    • Input: ON

image.png

ステートの作成およびアクションの追加

以下のようにステートを作成します。

  • 初期ステート 名前: GetKey
    • スペースキーか、またはトリガーの状態がONであるかどうかを判定します。
    • トリガーの状態は、Get Fsm Bool アクションで、 TriggerHandler オブジェクトのFSMから取得します。
    • アクション
      • アクション名: Get Key
        • Key: Space
        • Store Result: IsSpaceKeyDown
      • アクション名: Bool Test
        • Bool Variable: IsSpaceKeyDown
        • Is True: IS_ACCEL_DOWN
          • New Event... から新規イベントを作成
      • アクション名: Get Fsm Bool
        • GameObject: TriggerHandler
        • Fsm Name: FSM
        • Variable Name: IsTriggerDown
        • Store Value: IsTriggerDown
      • アクション名: Bool Test
        • Bool Variable: IsTriggerDown
        • Is True: IS_ACCEL_DOWN
          • (上記で作成したイベントを利用)

image.png
※ 遷移をつなぐ前は、赤文字で Event not used by... のような警告が出ますが気にしなくて良いです。

  • ステート SpeedUp
    • アクション
      • アクション名: Float Add
        • Float Variable: Speed
        • Add: 0.5
          • アクセルONのときの速度の上がりやすさの値です。
      • アクション名: Float Clamp
        • Float Variable: Speed
        • Min Value: 0
        • Max Value: MaxSpeed

image.png

  • ステート SpeedDown
    • アクション
      • アクション名: Float Subtract
        • Float Variable: Speed
        • Subtract: 1
          • アクセルOFFのときの速度の下がりやすさの値です。
      • アクション名: Float Clamp
        • Float Variable: Speed
        • Min Value: 0
        • Max Value: MaxSpeed

image.png

  • ステート Wait
    • アクション
      • アクション名: Wait
        • Time: 0.1

image.png

ステートの遷移を設定

以下のような遷移を設定します。

  • ステート: GetKey
    • IS_ACCEL_DOWN イベント : ステート SpeedUp へ遷移
    • FINISHED : ステート SpeedDown へ遷移
  • ステート SpeedUp
    • FINISHED イベント : ステート Wait へ遷移
  • ステート SpeedDown
    • FINISHED イベント : ステート Wait へ遷移
  • ステート Wait
    • FINISHED イベント : ステート GetKey へ遷移

こちらのようになります。
image.png

動作確認

ここまでで、SpeedController の Speed 変数の上げ下げができたはずです。
UnityのPLAYボタンを押して試してみましょう。

Game Viewをフォーカス(クリック)してスペースキーを押すと、 SpeedController内のPlayMakerFSMのOutputのところにある Speed の値が徐々に上がって 5 になり、スペースキーをはなすと Speed の値が徐々に下がって0になるはずです。

image.png

5.3. 車の移動を実装

ここまでで、速度のコントロールができたので、これを車に適用しましょう。

処理の流れは以下のようなものです。

  1. VRでのカメラリグ(足元位置)を代表する "[VRTK]_VIVE" ゲームオブジェクトを見つけます。みつからない場合、つまりWeb環境等の場合は Main Camera を見つけます。
    • 細かい話ですが、ここでカメラの地面からの高さを補正する変数を設定します。"[VRTK]_VIVE" の場合、地面の高さにセットすればカメラは身長分高いところに置かれますが、Main Cameraの場合は、頭の高さに配置する必要があるためです。
    • 「カメラ座標のオフセット値」の変数を定義し、Main Cameraの場合はこの値を (0, 1.6, 0) とします。"[VRTK]_VIVE" の場合は (0, 0, 0) にします。
  2. 車の前方向 (0,0,1) の向きを Transform Direction アクションでグローバル座標に変換します。これで車の進行方向のベクトルを得ることができます。
  3. 上記の値に速度値をかけます。速度ベクトルが求まります。
  4. 車の座標値に、速度ベクトルを1フレーム分追加して、車の座標値を更新します。
  5. 車の座標値に、1. で求めた「カメラの高さ方向オフセット値」を追加して、カメラの座標とします。
  6. 求めたカメラの座標を "[VRTK]_VIVE" または Main Camera にセットします。

2~6の処理は、毎フレーム実行されるようにします。

PlayerTargetゲームオブジェクト(足元位置)追加

CarRoot の子に、PlayerTarget ゲームオブジェクトを追加します。
これは、プレイヤーの足元位置を表します。この座標に身長分の高さを加算したあたりに実際のカメラが配置されることを意識して配置しましょう。(身長はHMDデバイスの設定によります)

  • 3D Object -> Cube ゲームオブジェクト作成
    • 親: CarRoot
    • 名前: PlayerTarget
    • 座標: (-0.3, -0.45, 0)
    • スケール: (0.1, 0.1, 0.1)

ドライバーの頭の位置から逆算して、Y座標をおおよそ身長分下におろした位置に設定します。

※Cubeは位置の目安用のみです。

FSM設定

CarRootゲームオブジェクト に PlayMakerFSM コンポーネントを追加し、編集します。

FSM変数設定

以下のような変数を設定しましょう。

  • CameraOffset
    • Variable Type: Vector3
    • VR時のカメラリグと、Gallery内プレイヤーやStudioで取得できるメインカメラとでは基準位置が違うので、これを補正するための座標値です。
  • CameraRig
    • Variable Type: GameObject
    • プレイヤーを動かすためのカメラリグオブジェクトですVRの場合とGallery内プレイヤーやStudioとでは中身が異なります。
  • CurrentPos
    • Variable Type: Vector3
    • 現在座標を一時的に保持する変数です。
  • CurrentTargetPos
    • Variable Type: Vector3
    • カメラリグの補正された位置を一時的に保持する変数です。
  • ForwardDir
    • Variable Type: Vector3
    • 乗り物の前方方向を保持する変数です。
  • MoveDiff
    • Variable Type: Vector3
    • 1フレーム分の座標変化を保持する変数です。
  • Speed
    • Variable Type: Float
    • SpeedControllerの速度値を一時的に保持します。

image.png

FSM GetCameraRig ステート

初期ステートの名前を GetCameraRig と変えましょう。

内容は以下の画像のようにします。
image.png

Find Game ObjectのObject Nameは [VRTK]_VIVE です。打ち間違いのないようにしましょう。
CAMERA_RIG_FOUND イベントはここで新規作成します。

ステートの内容としては、[VRTK]_VIVE があればそれを CameraRig ゲームオブジェクトにセットし、なければ Main Camera を CameraRig ゲームオブジェクトにセットします。
Main Cameraを利用する場合は、CameraOffset に (0, 1.6 ,0) という値をセットします。

FSM UpdateCameraRig ステート (1)

このステートで、乗り物本体の動きを決定し、さらに乗り物の動きをカメラリグに反映します。
アクションが多いので3パートに分けて紹介します。

このステートではすべてのアクションについて Every Frame フラグをONにして、毎フレーム実行するようにします。

image.png

※Commentアクションは説明用なのでなくても大丈夫です

まず、Get FSM Float カスタムアクションを利用して、 SpeedController ゲームオブジェクトのFSMからSpeed変数の値を取得してSpeed変数にセットしています。

その後、乗り物の前方向のベクトルを取得します。Transform Direction アクションを利用して、Ownerゲームオブジェクトの(0,0,1) ベクトルをワールド座標に変換することで、ワールド座標上での乗り物の前方向ベクトル ForwardDir が得られます。
この値を MoveDiff 変数にセットし、Speed を掛けることで速度ベクトルを取得します。

FSM UpdateCameraRig ステート (2)

乗り物の座標に加算することで動かします。

image.png

速度ベクトルMoveDiffを利用して、乗り物の座標を更新します。
Vector3 Add を利用して、 移動後の座標を計算し、Ownerにセットします。
Vector3 AddPer Second フラグをセットしておくと、MoveDiff の値を一秒あたりに進む距離(=速度)として扱うことができます。各フレームの経過時間を考慮しなくて良くなります。

FSM UpdateCameraRig ステート (3)

乗り物の位置をカメラリグに反映させます。

image.png

現在の乗り物の位置を取得し、CameraOffsetの値を加算し、カメラリグのゲームオブジェクトにセットします。

ステート遷移の追加

以下のように遷移を追加しましょう。

  • GetCameraRig ステート
    • CAMERA_RIG_FOUND イベント時: UpdateCameraRig ステートに遷移

image.png

動作確認

ここまでで、車が前方に動くようになったはずです。UnityのPLAYボタンを押して確認してみましょう。
Game Viewをフォーカス(クリック)してスペースキーを押すと前に進むはずです。
進んでいるかどうかわかりにくい場合は、シーンにCubeなどを配置してみると良いでしょう。

5.4. 車の回転を実装

ここまでで車を移動させることはできましたが、一方向に移動するだけになっていて、曲がることができません。
そこで、回転方法を実装します。

今回は比較的シンプルな方法とします。Main Cameraの向きを取得し、乗り物の向きに反映させます。

RotationController ゲームオブジェクトの追加

  • ゲームオブジェクト追加
    • 親: CarRoot ゲームオブジェクト
    • 名前: RotationController
    • コンポーネント: PlayMakerFSM

FSM変数の設定

以下のように変数を設定します。

  • Camera
    • Variable Type: GameObject
    • 回転の値を取得するゲームオブジェクトです。カメラが入ります。
  • CameraRotationY
    • Variable Type: Float
    • カメラの回転角度の値です。
  • Car
    • Variable Type: GameObject
    • Input: ON
    • 回転させる乗り物のゲームオブジェクトです。
    • 値に CarRoot ゲームオブジェクトをセットしておきます。

image.png

FSM GetCamera ステート

初期ステートをこの内容に変更します。
Main Cameraを取得して Camera 変数にセットします。

image.png

FSM UpdateRotation ステート

GetRotationでカメラの回転角度を取得し、これを Car変数のゲームオブジェクトにセットします。
注意点としては、 Every Frame フラグをONにしておくことで、状態遷移せずに毎フレーム処理を実行します。

image.png

FSM ステート遷移の設定

  • GetCamera ステート
    • FINISH イベント時: UpdateRotation ステートに遷移

image.png

6. 動かしてみる

ここまでで、ヒエラルキーはこのような状態になっていると思います。
image.png

まずはUnity EditorのPLAYで動かしてみましょう。
乗り物の前方に多少Cube等を置いておくと良いでしょう。
Game Viewにフォーカスをあわせてからスペースキーを押すと、前方に移動したでしょうか?
Main CameraをY軸まわりに回転させると、車も回転するでしょうか?
image.png

うまく動かない場合は、各FSMを見直してみましょう。

Unity Editorで動いたら、Local Preview Tool を使って、PC版STYLYまたはQuest版STYLYでシーンを動かしてみましょう。STYLYにアップロードするよりもかなり高速に確認することができるのでおすすめです。

7. STYLYにアップロード

シーンには余分なアセットが含まれているので、CarRoot以下をProjectウィンドウにドロップしてPrefabにして、CarRoot prefabをアップロードすると良いでしょう。

8. STYLY Studioで配置

STYLY Studioを起動し、アップロードしたアセットをシーンに配置してみましょう。シーンをPublishして、ブラウザやVRデバイスで動くか試してみてください。
うまく動いたでしょうか?

9. 風景モデルの追加

乗り物が走るのに適した風景を用意しましょう。注意点としては、今回の手法ではy=0の平面上を移動するため、起伏のない地形にすることと、負荷の軽いモデルを利用するということです。

描画負荷についてはマテリアル数やメッシュ数、超点数が多いと負荷が高くなりますので、Mesh Bakerなどを利用して負荷低減をするのがおすすめです。(本記事では紹介にとどめます)

準備できたら、STYLY Studioで同じシーンに配置してみましょう。良い風景があるとぐっと雰囲気が良くなると思います。

image.png

応用

今回はXZ平面上を動く、頭の向きに追従という方式にしましたが、いろいろな応用が考えられます。ぜひ試してみてください。

  • 空中上下移動できるようにする
  • RigidBodyやCharacterControllerを利用して起伏のある地面上を動けるようにする
  • VRで角度差分をみて、プレイヤーのリアルな首振りには追従しないようにする
  • 乗り降りできるようにする
  • 操作から各座標への反映が遅れる要素がいくつかあるのでこれを解消する

  1. トリガーのないコントローラーを利用するデバイスが一部ありますが、目をつぶることにします。 

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1