まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

バーチャルキャスト+VCIで色のアニメーションを行う

バーチャルキャスト+VCIでマテリアルの色を変化させてみました。
Animationを使って色が変化していくアニメーションを作りたかったのですが、バーチャルキャスト+VCIで扱えるのは「位置・大きさ・回転」のアニメーションのみ。現状マテリアルの色を変化させるなら、スクリプトを書くしかありませんでした。

使う用途があったので、簡単なサンプルを作ってみました。
オブジェクトを1回にぎると色の変化が始まり、2回目で止まります。色の変化は2秒かけて赤→青と変化するようにしました。
止まってから再度にぎると、途中からではなくリセットされた状態(赤にもどる)で変化します。

内容としてはこちらを参考にしました。
virtualcast.jp

下に色がループするバージョンを追記しました。

local state=0

--何秒かけて変化するか
local framevalue = vci.me.Time.TotalSeconds

--カウント開始
local framestart = 0

local moveflag = 0
local changeColor = 0
local red = Color.__new(1,0,0,1)
local blue = Color.__new(0,0,1,1)

function update()

--moveflagが1になったときに、updateの中身を実行
 if moveflag==1 then

  --print(vci.me.Time.TotalSeconds)

  --この場合は2秒かけて変化する
  framevalue = (vci.me.Time.TotalSeconds-framestart)/2

  --Color.Lerpで色を徐々に変えていく
   changeColor = Color.Lerp(red,blue,framevalue) 

   --マテリアルに色を設定
   vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor)
 end


end

function onUse(use)

    --カウントスタート
    framestart = vci.me.Time.TotalSeconds

    --1のときにupdateの中身を動かす
    moveflag = 1

    if use == "Enn" and  state == 0 then
    print("1回目にぎった")
    state=1

    
elseif use == "Enn" and state == 1 then
    print("2回目にぎったよ")
    state=0

    --updateの中身を止める
    moveflag = 0

end
end


Unity(C#)で書かれた下記のスクリプトをVCI(Lua)用に書き直して、アイテムとアイテムが接触したとき(タッチしたとき)に色が変化して、再度タッチすると止まるものも作ってみました。
prince9.hatenablog.com

また下記のようにアイテムの中にボタンがある場合は、このようにすることで当たり判定をつけることができます。
1.タッチするアイテムとボタンに当たり判定をつける(下の場合はピンクの棒と黄色のボタン)
f:id:prince9:20190526204343p:plain
2.ボタンに「Fixed Joint」をつけて、「Connected Body」にアイテムを指定する(下記の場合は本)。
Fixed Jointをつけておけば、元のアイテム(下記の場合は本)を動かすと同時にボタンも動きます
f:id:prince9:20190526204407p:plain
f:id:prince9:20190526204557p:plain


■アイテムとアイテムが接触したとき(タッチしたとき)に色相が変化して、再度タッチすると止まるスクリプト

--アイテムの状態を示す変数
local state=0

--カウント開始
local moveflag = 0

--何秒で色が変わるか
local duration = 12

--HSVで色指定
local changeColor = 0

function update()
--moveflagが1になったときに、updateの中身を実行
 if moveflag==1 then

--durationの時間ごとに色が変わる
local phi = vci.me.Time.TotalSeconds / duration * 2 * math.pi
local amplitude = math.cos(phi)
print(amplitude)

--色相・彩度・明度のうち、色相のみ変化
 changeColor = Color.HSVToRGB(amplitude, 1,1);

--マテリアル指定
  vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor)
   

end

end


function onCollisionEnter(item, hit)
    if item == "Bou" and hit == "Shikaku" and state == 0 then
         --カウントスタート
    moveflag = 1
    print("当たった")
    state=1
--アニメーションを再生させたいときは、ここに書く
-- vci.assets._ALL_PlayAnimationFromName("Animation1", false)

elseif item == "Bou" and hit == "Shikaku" and state == 1 then
    state=0
    --updateの中身を止める
    moveflag = 0
--アニメーションを再生させたいときは、ここに書く
-- vci.assets._ALL_PlayAnimationFromName("Animation1", false)


end
end