1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityでVRの手で触れる音をサウンド側の設定のみで軽量に実装する

Last updated at Posted at 2025-08-01

はじめに

VRで何かに手で触れたら音がしてほしいと思いました。
試しに入れてみた話になります。

今回は
Ghost PhotographersというVRホラーゲームで実装した
手で触れた時の音についての備忘録です。

#CRI_ADX勉強会 で未紹介の部分ですが、
プログラマやデザイナーの手をかけずに
サウンド側の設定のみで軽量に行えるものを目指しました。

デモ

手で触れるの判定

VRゲームなので、ハンドトラッキングの情報があります。
左右の手の位置にコライダーを入れておくことで、
触れたものを検知して音を鳴らしわけることができます。

手の位置に専用のコライダーをつける

image.png

このゲームでは、マルチプレーの関係もあり、
プレーヤーの手の認識が少し遅く発生するため、
Setup用の関数で動的にコライダーをつけるような形にしてあります。

レイヤーとタグを専用のものを用意しました。

手の位置から触れた時の音が鳴るようになっています。

手で触れると鳴る

ほぼすべてのものが触れられるので、
まじめにやるとすべてのモデルデータを触ることになり現実的ではないと思いました。

そこで、設定が無いものに関しては汎用の音が鳴るような仕組みにしています。

ただ、それだけでも少し足りないので、いくつかの種別を用意しています。

image.png

こういった情報が、ゲームによってはテクスチャなどに保持されていて、
利用できたりするかもしれないのですが、
その設定が無いゲームなので、サウンド側の都合でつけています。
また、テクスチャなどに依存すると取得処理やデザイナー負担も増えるため、
UnityEditor側で設定できるようにしています。

壁のTouch判定用コライダー

image.png

設定はオブジェクトの名前とSoundTouchタグ

SoundTouchのコライダーの
isTriggerEnterが発動したとき、
当たったオブジェクトの名前の先頭一致で判定をしています。

真面目にやるのであれば、コンポーネントを用意するところですが、
鳴らしたい音を判定したいだけなので、名前判定で済ませていました。

image.png

似た形状で同じ材質なものであれば、Boxコライダーのついたオブジェクトをペーストするだけで作業が終わります。

エリア発火に似ているけど少し違う点

のやり方のように、ひたすら細かいコライダーをつけていけばよいかというと、
以下の問題があります。

  • 設定は目立ったところだけする
  • 他は汎用の音が鳴ってほしい

image.png

ということで、Defaultのコライダーでも音が鳴るように設定しています。

Defaultのコライダーというのは、特に意識せずにコライダーをつけた場合の設定で、
デザイナーさんなどが作ったもの(背景の壁・床・天井など・庭の岩など)
たいていのものにコライダーが付いている場合、触れられるという判定にしています。

この手で触れる処理は後付けで対応したのもあって、ここらへんかやっつけ対応なのですが、
ひとまずこんな作りでした。

こんな作り方ですが、すべてのDefaultなコライダーのあるオブジェクトは音が鳴ります。
そして、気をつかっているオブジェクトは専用の音が鳴る仕組みになっています。

コライダーごとにキャッシュ

ユーザーが同じオブジェクトに頻繁に触る場合、

image.png

この文字列で判定しているStartsWithがコストが高そうなので、
辞書に入れて2度目以降は

image.png

辞書にあれば、文字判定しないようにしています。

実行時に動的に辞書に入れるとか、文字列判定処理をしているとかは行儀が悪いのですが、

  • メモリの制限(事前処理などで巨大な辞書にしたくない)
  • そもそも、そんなに触れまくらない想定
  • 設定をとにかくシンプルにしたい

だったので、触った初回だけちょっと処理かかるけどゴメンという実装です。

一定時間は再トリガーしないように

image.png

image.png

手の方のTriggerEnterが発火するようにしているのですが、
手の場合かなり早く動かせてしまうため、
あまり頻度が多く鳴ると不自然になるため、
最後に鳴った時間から一定時間は鳴らないようにしています。

おわりに

今回はADX2を利用していますが、ADX2のUnityには触れた時の処理がとくに無い、
というか触れたら鳴るといった部分は、オーサリングツールでは吸収できず
Unity側の機能や設定になります。
どの音を鳴らすべきかなどの設定について、サウンドデザイナーが把握しているため、
Unityを触るきっかけになるかと思います。

実現するのに必要な知識は、Unityのコライダーの設定、Prefabの概念で
そこを乗り越えられれば、表現の幅を広げるチャンスがあります。

今回のタイトルは
MetaQuest2でも動くスタンドアローンVRタイトルであるため、酔い軽減のためにも
処理をとにかく削りたいため、必要最小限のコライダーで実装してみたものになります。

何かの参考になれば幸い。

ADX2勉強会の時の資料

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?