[vci楽器制作メモ]太鼓リズムマシーン

出来たのがこれ。

 

やりたかった機能は以下です。
 
  • Useしたらアニメーション太鼓が叩かれるアニメーションが始まり音も流れ出す。
  • 横のプラスマイナスのキューブをタッチしたら流れる太鼓の音のBPMを変えられる。表示も変わる。

 

vciのバージョンはUniVCI-0.17です。

 

スクリプトの全体

bool_loop = false
bool_clock = false
count = 1

--テクスチャの中の分割数
local TOTAL = 9
bgmvol = 0.5

--キューブに触れるとcountを計算、テクスチャを動かす。

function onTriggerEnter(item, hit)
    if item == "Cube1" then
        if count >= TOTAL-1 then
            count = 0
        else
            count = count + 1
       end
        SetTextureOffset(count)
    end

    if item == "Cube" then
        if count < 1 then
            count = 8
        else
            count = count -1
        end
        SetTextureOffset(count)
    end
end

--Useするとアニメーションを動かす。bool_loopとbool_clockをtrueにする。

function onUse(use)
    if use == "taiko" then
        if bool_loop == false then
            vci.assets._ALL_PlayAnimationFromName("taiko_motion2",true)
            bool_loop = true
            bool_clock = true
        else
            vci.assets._ALL_StopAnimation()
            vci.assets.audio._ALL_Stop("taiko_sound")

    bool_loop = false
        end
    end
end

 

--bool_loopがtrueの時音を鳴らすタイミング計算

--bool_clockがtrueになったら再生した時間を記録してすぐfalseに戻す。

--clockStartでos.clockを引いた数がBPMを越えたら音を鳴らす。

function updateAll()
    if bool_loop == true then
        if bool_clock == true then
            clockStart = os.clock() --再生した時間を記録
            bool_clock = false
        end
        if os.clock() - clockStart > 60*(1/(110 +(count *10 ))) then
            vci.assets.audio._ALL_Play("taiko_sound", bgmvol, false)
            bool_clock = true
        end
 end

end

 

--画像の表示場所計算

function SetTextureOffset( count )
    local offset = Vector2.zero
    -- y shift
    local Yshift = math.floor(count / 3)
    offset.y = -(1/3) * Yshift

    -- x shift
    local Xshift = count % 3
    offset.x = (1/3) * Xshift
    vci.assets._ALL_SetMaterialTextureOffsetFromIndex(8, offset)
end

SetTextureOffset(count)

 

 

 

 

f:id:alakialaca:20190606032804p:plain

テンポの表示を変える。

 

 

↓の「Useすると柄が変わるポスター」がわかりやすい。

https://virtualcast.jp/wiki/doku.php?id=vci:sample:onuse:no5

 

このイベント関数で、テクスチャの表示区間?場所?を変えます。

↓のような画像があるとして、

f:id:alakialaca:20190606042624j:plain

1の部分、2の部分と表示場所を移して行く感じです。オフセット移動とか書かれてもわかりづらいよ。。。

f:id:alakialaca:20190606042600p:plain

 

vci.assets._ALL_SetMaterialTextureOffsetFromIndex(テクスチャの指定,offset )
第一引数のテクスチャの指定が、よくわかってないです

 このリファレンスの説明がわからないよー

https://virtualcast.jp/wiki/doku.php?id=vci:script:reference:exportassets

f:id:alakialaca:20190606032435p:plain

 

8にしたら、BPMの10の桁のテクスチャが変わるから、こう書いた。

他の数字にしたら、他の貼ったテクスチャに影響があった。

使用しているテクスチャに番号振られているっぽいのかな?わかり次第追記したい。

誰か知っていたら教えてください。

 

 

 テクスチャの9等分した時の左上の部分が、面の上に来るようにするのは、Blenderで行いました。

↓の記事を参考にしたらできました。

 http://blog.livedoor.jp/hawamo21/archives/2949798.html

 

表示したい面にシームを付けて、

f:id:alakialaca:20190604035540j:plain

 

 UV展開して面が左上に来るようにした。(汚いUV展開で申し訳ない。)

f:id:alakialaca:20190606031522j:plain

 

 

 

流れる音のBPMを変える

 

vci.assets.audio._ALL_Play(鳴らしたい音ファイル, ボリューム, false)

 

 

これで、第3引数がtrueの時にループして、falseだと一回だけ鳴ります。

 

BPMの計算が

60*拍子*小節数/テンポで、この太鼓リズムマシーンのBPMの最低値が110なため。

 

60*(1/(110 +(count *10 ))

これでBPMを秒に換算して計算をして、

再生した時の時間を代入しておいたclockStartでos.clockを引いた数がBPMを越えたら再び鳴らしています。

 

function updateAll()
    if bool_loop == true then
        if bool_clock == true then
            clockStart = os.clock() --再生した時間を記録
            bool_clock = false
        end
        if os.clock() - clockStart > 60*(1/(110 +(count *10 ))) then
            vci.assets.audio._ALL_Play("taiko", bgmvol, false)

            bool_clock = true
    end
end

 

 

 update()で毎フレーム呼び出しができます。↓参照

https://virtualcast.jp/wiki/doku.php?id=vci:script:reference:eventfunction:tips1

 

 

 

アニメーションのオンオフ

 ↓の記事が参考になる。

 https://virtualcast.jp/wiki/doku.php?id=vci:sample:animation:tutorial

 

bool_loopがfalseだったらアニメーション再生。

bool_loopがtrueだったらアニメーション停止して、音の再生もストップというものです。

 function onUse(use)
    if use == "taiko" then
        if bool_loop == false then
            vci.assets._ALL_PlayAnimationFromName("taiko_motion",true)

            bool_loop = true
        else
            vci.assets._ALL_StopAnimation()
            vci.assets.audio._ALL_Stop("taiko_sound")

            bool_loop = false
        end
    end
end

 

 

現在はBPM110~190までしか変えられない仕様になってますが(途中で飽きた)

もしも、やる気が出たら作り直しますね。