====== 叩くとアニメーションをして音が鳴るドラムを作る ======
[[https://developer.virtualcast.jp/vci-docs/api/events/onCollisionEnter.html | onCollisionEnter]]を使用した、アイテムをぶつけると音やアニメーションが再生されるサンプルです。
=== サンプルデータ ===
https://virtualcast.jp/products/5315c1a2c3ec38eb95c65db2db65299ddb58c39943e659e83033e651019c5f72
{{ :vci:sample:oncollision:チュートリアルドラム.zip |}}
=== 音源サンプル ===
{{ vci:sample:oncollision:drum_snd.wav |}}
===== 手順 =====
スティックで叩くとアニメーションをして音がなる簡単なドラムを作ってみましょう。\\
オブジェクトが衝突したときの処理になるので「**onCollisionEnter**」を使用します。
今回のVCIはドラムとスティックの2つのSubItemで構成されます。\\
{{ vci:sample:oncollision:tutorial_drum_1.png?direct&600 }}
アニメーションや音を鳴らすためにはUnity上でスクリプトだけではなく素材も準備する必要があります。\\
順番に見ていきましょう。
1. 音源を用意\\
2. アニメーションを用意\\
3. コライダを用意\\
4. スクリプトを記述
**1. 音源を用意**\\
音を鳴らすためには音源を準備しましょう。\\
圧縮形式の音源ファイルでも、VCIを出力する際には非圧縮のwavファイルとして出力されます。\\
容量が増加することがあるので注意しましょう。\\
また、インポートする音源ファイルの形式によってはUnityのプレビュー上で再生できても出力すると音が鳴らないこともあります。\\
その場合は別のファイルフォーマットで試してみてください。
**VCISubItem**以下の階層にAudio Sourceでアタッチします。
※VCI Objectにアタッチした場合、VCI出力できません。
{{:vci:sample:oncollision:vcisubitem.png?direct&400|}}
2. VCISubItemに「**Animation**」コンポーネントをアタッチし、\\
アニメーションを1つ作成します。\\
詳細:[[vci/sample/animation/tutorial2]]
VCIのアニメーションではループ再生のON/OFFを選択することができます。\\
一度きりの再生の場合、アニメーション終了時の変形で形状が固定されたままになります。\\
今回はドラムのスケールを変更し、一瞬大きくなり、またもとの大きさに戻るアニメーションを作りました。
**3. コライダを用意**\\
物理衝突をさせるのでコライダとrigidbody設定が必要になります。\\
コライダをつける際にはSubItemの一番上の階層に、全てのコライダをつけるようにしましょう。\\
動くオブジェクトの場合、下の階層にコライダをつけてしまうと衝突時にばらばらになってしまいます。
SubItemそれぞれに、次のようにセットしました。\\
設定する値で特に重要なのは\\
・Use Gravity\\
・Is Kinematic\\
・Is Trigger\\
・Grabbable\\
です。それぞれどのような機能なのか覚えておきましょう。
{{vci:sample:oncollision:tutorial_drum_5.png?direct&400|}}
{{vci:sample:oncollision:tutorial_drum_6.png?direct&400|}}
GroupIDは0以外で全てのSubItemで同じ数字にしましょう。\\
同じ数字のSubItem同士はアイテムをつかんだ際にオーナー権が同じになり、\\
正しく物理挙動をするようになります。
**4. スクリプトを記述**\\
GameObjectの「VCI Object」コンポーネントのScriptsのSizeを1に指定し、\\
Nameに「main.lua」を記入、Sourceに以下スクリプトを記入します。
===== VCIスクリプト =====
local transform = vci.assets.GetTransform("drum")
local animation = transform.GetAnimation()
local audioSources = transform.GetAudioSources()
---[SubItemの所有権]アイテムにCollider(not Trigger)が接触したときに呼ばれる。
---@param item string @SubItem名
---@param hit string @Collider名
function onCollisionEnter(item, hit)
if (item == "drum" and hit == "stick") or (item == "stick" and hit == "drum") then
audioSources[1]._ALL_Play(1.0, false) --サウンドを鳴らす
animation._ALL_Play(false) --アニメーションを再生 true/falseでループのON/OFFを指定
vci.assets.HapticPulseOnGrabbingController(item, 1500, 0.05) --itemを掴んでいるコントローラを振動させる
end
end