====== コメントすると落ちてくるタライ ======
[[https://developer.virtualcast.jp/vci-docs/manual/studio_notification/comments.html|コメントの受信]]を使用した、スタジオで「たらい」または「タライ」とコメントするとタライが降ってくるサンプルVCIです。
=== サンプルデータ ===
https://virtualcast.jp/products/220a18dd3f7064ad9508e3a633bb66b94ab0ea6c89dbf998aa2017a6b5f4f9d7
{{ :vci:sample:message:taraicomment.zip |}}
==== SubItem構成 ====
{{vci:sample:message:vcitarai.png?direct&600|}}\\
T1~T16はgrabできるsubitemを0.01倍のサイズで配置
{{vci:sample:message:vcitaraicoll.png?direct&400|}}\\
タライが落下しないように高さ20の所に透明なコライダーを設置(固定)
VCIは動的にアイテムを生成する事ができません。(19/5/24時点)\\
なので、**出現時は遠くに置いておいて、移動して縮尺を戻す事で出現させる**ように見せます。
今回は高さ20の所に透明なコライダーを設置して、20.05の高さにタライ16個を並べておいてます。\\
下から上を見た時に見えないようにするため、出現時のタライの縮尺は0.01にしておきます。\\
subitemの名前はfor文で処理する際に楽な命名にしておきます。
===== VCIスクリプト =====
-- 次に落下するタライ番号
local _TaraiNum = 1
--たらい / タライ というコメントで発火
function onMessage(sender, name, message)
--コメント内容
print(sender["name"].."「"..message.."」")
--「たらい」or「タライ」を含むコメントであればtrue
local tarai = false
if string.find(message,"たらい") ~= nil then
tarai = true
end
if string.find(message,"タライ") ~= nil then
tarai = true
end
if tarai == true then
print("たらいを落とします")
local pos = Vector3.__new(0, 5, 0)
TraraiFire(pos)
end
end
vci.message.On('comment', onMessage)
--posの位置にタライを落とす
function TraraiFire(pos)
local tarai = "T"..tostring(_TaraiNum)
_TaraiNum = _TaraiNum + 1
if _TaraiNum > 16 then
_TaraiNum = 1
end
pos.y = pos.y + 0.5 * _TaraiNum
vci.assets.GetTransform(tarai).SetLocalPosition(pos)
vci.assets.GetTransform(tarai).SetLocalScale(Vector3.one)
print("タライの落下位置 : "..tostring(pos))
end
-- デバッグ用
function onGrab(targe)
if targe == "DebugSwitch" then
print("デバッグ用スイッチ")
local pos = Vector3.__new(0, 5, 0)
TraraiFire(pos)
end
end
==== VCIスクリプト(解説) ====
スクリプトはコメント受信部分、タライのループ処理部分に分かれています。\\
==== コメント受信部分 ====
--「たらい」or「タライ」を含むコメントであればtrue
local tarai = false
if string.find(message,"たらい") ~= nil then
tarai = true
end
if string.find(message,"タライ") ~= nil then
tarai = true
end
**ニコ生は同じコメントを連続して打つ事はできません。\\
** なので、VCIでコメント連携する場合、ほぼ部分一致にする必要があります。\\
部分一致をする場合は ''string.find()'' という関数を使用すると、検索したい文字列が検索対象に含まれてるか判定できます。\\
ただし、このfind関数の戻り値は、見つかった場合number型、見つからなかった場合nilとなります。\\
**どちらの型にも対応する為に、*find関数がnilでない時(検索できた時)にフラグを立てるようにします。**\\
さらに複雑なパターンに対応したい場合は [[vci:tips:script:stringsearch]] を参考にしてください。
==== 落下処理部分====
function TraraiFire(pos)
local tarai = "T"..tostring(_TaraiNum)
_TaraiNum = _TaraiNum + 1
if _TaraiNum > 16 then
_TaraiNum = 1
end
pos.y = pos.y + 0.5 * _TaraiNum
vci.assets.GetTransform(tarai).SetLocalPosition(pos)
vci.assets.GetTransform(tarai).SetLocalScale(Vector3.one)
print("タライの落下位置 : "..tostring(pos))
end
落下処理は特に工夫なくT1からT16まで順に落としてT1に戻るようにしています。割と自然です。\\
工夫した点は連続でコメントが来てもSubItemが重ならないようにする為 ''0.5 * _TaraiNum'' で高さをずらすようにしてる点です。
今回は落下位置をVCIの出現位置(x=0, z=0)にしていますが…
・ターゲット用のsubitemを作る\\
・落下前にプレイヤーの位置調べるsubitemを移動させて、プレイヤーに接触した場合その位置に落とす。
上記の方法で落とす場所も工夫する事ができます。