バーチャルキャストのアイテム、VCIでバーチャル楽器の大太鼓を制作しました。
それでつまったところ、変更した部分などのメモ。
目次
・オリジナルのサウンドを録音
・Blenderでモデリング
・円形の部分にコライダをつけるには
・太鼓スクリプト
・物理衝突させて鳴らす
概要
この大太鼓は、バチで表側を叩くと「ドドン」と2回鳴ります。
効果音的に使ってほしいアイテム。
裏は「ドン」と一回のみ。
叩いたほうの手が振動します。
オリジナルのサウンドを録音
VCIの楽器を作る際、販売、配布されている音データをそのまま入れてしまうと、フリー素材のものであっても二次配布、禁止事項に該当する可能性があります。
以前のエントリ。
無料だと見逃される可能性が高いですが、販売を視野に入れているので、自分で録音したものにしたい。
というわけで、実家の敷地に太鼓と練習場があるので、そこで録音してきました。
Kontact音源としても販売しています。
Blenderでモデリング
皮の部分を別にして、Unityで被せる。
しかし、あとでMesh ColliderがVCIで使えないことに気が付くのであります。
もうちょっと軽く作れる方法がありそう。
円形の部分にコライダをつけるには
オブジェクトの形に沿った、Mesh Colliderが使えないということで、箱状のBox Colliderが一番近いのではないかということで代用しました。
感覚的によさそうだなと思い、Zに45度の角度をつけています。
あんまり美しくないけどこんな感じ。
足にもAudio Sourceがついているけど、テスト用につけたものなので鳴りません。
太鼓スクリプト
VCI Objectにつけたスクリプトはこれ。
function onTriggerEnter(item, hit) --itemにhitが接触した瞬間に呼び出される if (item == "kawa1" and hit == "stick1") or (item == "stick1" and hit == "kawa1") then vci.assets._ALL_PlayAudioFromName("ddn") --ドドン vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) --itemを掴んでいるコントローラを振動させる end if (item == "kawa1" and hit == "stick2") or (item == "stick2" and hit == "kawa1") then vci.assets._ALL_PlayAudioFromName("ddn") vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end if (item == "kawa2" and hit == "stick1") or (item == "stick1" and hit == "kawa2") then vci.assets._ALL_PlayAudioFromName("don") --ドン vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end if (item == "kawa2" and hit == "stick2") or (item == "stick2" and hit == "kawa2") then vci.assets._ALL_PlayAudioFromName("don") vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end end
kawa1は表側の皮。kawa2は裏側の皮。
鳴らすだけではなく、itemを掴んでいるコントローラが振動するようにしました。
無限音階楽器では、stickを分けてなかったんだけど、変な鳴り方をしたのでstick1と、stick2それぞれ書きました。
stickでの叩き方自体は無限音階楽器の制作メモで書いています。
公式のものも参考に
物理衝突させて鳴らす
一度、物理衝突でうまく叩けなかったので、楽器をすり抜ける形にしたんですが、
やっぱり、物理衝突があるほうが存在感あるなということで、onCollisionEnterで鳴らす形にしました。
実はこれが曲者で、onCollisionEnterだと、VCI Sub Itemの子が呼び出されない。
なので、子を外に出して、独立したVCI Sub Itemにする。
そうすると、まとめて掴んで持ち運ぶということが不可能になるので、掴めないようにしました。
巨大な太鼓なので、そういう仕様でも納得感があるので大丈夫かなと思います。
スクリプトはonTriggerEnterをonCollisionEnterに書き換えるだけ。
function onCollisionEnter(item, hit) --itemにhitが接触した瞬間に呼び出される if (item == "kawa1" and hit == "stick1") or (item == "stick1" and hit == "kawa1") then vci.assets._ALL_PlayAudioFromName("ddn") --ドドン vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) --itemを掴んでいるコントローラを振動させる end if (item == "kawa1" and hit == "stick2") or (item == "stick2" and hit == "kawa1") then vci.assets._ALL_PlayAudioFromName("ddn") vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end if (item == "kawa2" and hit == "stick1") or (item == "stick1" and hit == "kawa2") then vci.assets._ALL_PlayAudioFromName("don") --ドン vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end if (item == "kawa2" and hit == "stick2") or (item == "stick2" and hit == "kawa2") then vci.assets._ALL_PlayAudioFromName("don") vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) end end
まとめると、VCIでは、物理衝突がありつつ持ち運べて、複数の音源が鳴る楽器というのは今のところ不可、ということです。
今後やりたいこと
・ノイズを処理する
頭にプチノイズっぽいものが入る。
まえの音が途中で途切れて発生しているのかもしれないので、WAVの余韻を短くしたほうがいいのかもしれない。
・アニメーションさせたい
ちょっとだけ大きくなって、震える感じにしてみたい
・音を途切れずに鳴らしたい
連続で鳴らすと音が途切れてしまうので、ワンショットで鳴らしきるようにしたい。
途切れないようにできれば、演奏できる楽器になる。それができないから、効果音用としている。
PlayAudioのかわりにPlayOneShotAudioでいけるかなと思ったけどいけなかった。
負荷が高くなっちゃいそうでもある。
おわりに
たれ乳アルパカ作曲系vtuber、alaki paca/荒木パカさん(@arabiiiiiiiiiii )にめちゃくちゃ教えてもらいました。
VCIのブログも書いてらっしゃいます。
■vciで音を出す。そして弾き語りをする。| アルパカ研究室
公式にも色々書いてあるのでにらめっこ
公開したバーチャル楽器はこちら