この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の20日目の記事です。
今回の内容
今回は以下のリストバンド型の入場券を自動装着できるようにしていきます
ボタンを押すと出現し、自動的に腕に装着されるようにします。
今回は学ぶ技術は以下となります。
・スクリプトでの自動装着
Unity概要
今回はリストバンドを作成しますが、リストバンドを付ける位置(手首よりちょっと肘寄り)と装着可能ボーンな位置が異なっているという課題があります。(装着可能位置は各ボーンの始点であり、今回つけたい位置は肘ボーンと手首ボーンの中間です。)
普通にoffsetでも位置調整はできなくはないとは思いますが、今回は以下のように装着位置調整用オブジェクトを作りそこに装着機能をもたせます。
こうしておくと、スクリプトで位置調整用オブジェクトを動かすことで装着位置を自由に調整できて便利です。
また、腕輪型の装着VCIを作成する場合は装着対象は「~Hand(手首)」ではなく「~LowerArm(肘)」にしてください。
~Handに設定すると、以下のように手首を動かすと腕から外れてしまいます。
Handにつけたときの挙動 pic.twitter.com/uYeAc5zw8c
— #らいと(きょろ、ちょべりば→ぐ) (@lightjug) December 26, 2020
コードの作成
装着VCIのスクリプトの書き方は以下の公式ページを御覧ください。
・ExportTransform(ページの下の方に乗っています)
装着するにはAttachToAvatar()を使いますが、その際にアイテムがちゃんと装着可能な位置にある必要があるのでご注意ください。
今回はボタンを押したら装着されるようにしたいと思います。
コードは以下のようになります。
function onUse(use)
if use == "Button_WristBand_Appear" then
-- 出現対象とする腕輪を探す。関数はチュロスのときのものとほぼ作りは同じのため省略。
local wristband = fetchWristBand()
-- リストバンドと同じnoの装着用子オブジェクトを取得する.
if wristband then
--位置調整用オブジェクトを取得
local attachItem = getAttachItem(wristband.GetName())
--装着対象のボーンの位置を取得
local avatar = vci.studio.GetLocalAvatar()
local lowerArmBone = avatar.GetBoneTransform("LeftLowerArm")
local handBone = avatar.GetBoneTransform("LeftHand")
if lowerArmBone and handBone then
--リストバンドをいい感じの位置(肘と手首の間の位置)に移動。
local wristPos = lowerArmBone.position*0.4 + handBone.position*0.6
wristband.SetPosition(wristPos)
wristband.SetRotation(lowerArmBone.rotation)
--装着用の子オブジェクトを肘の位置に移動
attachItem.SetPosition(lowerArmBone.position)
--装着させる。
attachItem.AttachToAvatar()
end
end
end
end
function getAttachItem(wristband)
local no = string.match( wristband,"WristBand (.+)" )
if no then
return vci.assets.GetTransform("WristBand_Attach "..no)
end
end
実際に動かすと以下のようになります。
リストバンド型の入場券。
— #らいと(きょろ、ちょべりば→ぐ) (@lightjug) December 26, 2020
入場券としての機能がないのが特徴。 pic.twitter.com/fjnF4Q5Qsi
終わりに
いかがでしたでしょうか?
今回はただ装着させただけですが、ゆくゆくはこのリストバンドを当てると動く仕掛けなどを作りたいと思います。
次回の内容は未定です。