目次

Webビデオ連動エフェクト

Webビデオプレイヤー・リモコンによるメッセージ送信を利用した、特定の再生時間になるとエフェクトを再生するサンプルVCIです。
ルームにおいて、Webビデオプレイヤーと操作用のリモコンを設置している場合動作します。

サンプルデータ

https://virtualcast.jp/products/d85fabe72132226ef5560c3d348e0c78d300ff01200ebd6ea8bd749fc49a7779

Unitypackage

webvideoeffectsample.zip

コンポーネント設定

VCI Object

VCI Sub Item

VCIスクリプト

Webビデオプレイヤーで下記の動画を再生時、紹介シーンが切り替わる「5秒・48秒・84秒」のタイミングでエフェクトが再生されます。
こちらの動画を予め再生できるように設定しておく必要があります。
https://www.youtube.com/watch?v=MPmCqKp8V1s

main.lua
--------------------------------
---動画用メッセージ
--------------------------------
---Webビデオプレイヤーの情報
local MESSAGE_KEY_WEB_VIDEO_INFO_FROM_REMOCON = "WebVideoInfoFromRemocon"
 
--------------------------------
---定義データ
--------------------------------
 
---演出に使用する動画タイトル
local TARGET_VIDEO_TITLE = "【リアルとメタバースを連携できる!】バーチャルキャスト OSCプロトコル対応"
 
--------------------------------
---動画データ
--------------------------------
 
---動画タイトル
local videoTitle = ""
---動画時間
local videoDuration = 0
---動画の再生開始時間
local videoPlayStartTime = 0
---動画再生中
local isPlayingVideo = false
---動画の再生開始時のクロック
local videoPlayStartClock = os.clock()
 
--------------------------------
---演出データ
--------------------------------
 
---再生エフェクト
local effect = vci.assets.GetEffekseerEmitter("Effect")
---演出開始時間(動画の秒数)
local playEffectTimeTable = {5, 48, 84}
---直前フレームでの動画再生時間
local beforePlayTime = 0
 
--------------------------------
---関数
--------------------------------
 
---Web動画プレイヤーの情報をリモコンアイテムから取得
local function HandleGetWebVideoInfo(sender, name, message)
    --動画タイトル
    videoTitle = message.title
    --動画時間
    videoDuration = message.duration
    --現在の再生時間
    videoPlayStartTime = message.currentTime
    beforePlayTime = message.currentTime
    --再生中
    isPlayingVideo = message.isPlaying
 
    print("動画情報更新\nタイトル:" .. videoTitle .. "\n再生時間時間:" .. string.format("%0.2f / %0.2f", videoPlayStartTime, videoDuration) .. "\n再生状態:" .. tostring(isPlayingVideo))
 
    --動画の再生開始時のクロック
    videoPlayStartClock = os.clock()
end
vci.message.On(MESSAGE_KEY_WEB_VIDEO_INFO_FROM_REMOCON, HandleGetWebVideoInfo)
 
---全ユーザーで毎フレーム呼ばれる
function updateAll()
    --動画再生中の場合
    if isPlayingVideo then
        --対象動画である場合
        if videoTitle == TARGET_VIDEO_TITLE then
            local currentTime = videoPlayStartTime + (os.clock() - videoPlayStartClock)
            for index, playEffectTime in ipairs(playEffectTimeTable) do
                --エフェクトの再生時間を通過した場合
                if (beforePlayTime <= playEffectTime) and (playEffectTime <= currentTime) then
                    effect.Play()
                end
            end
            beforePlayTime = currentTime
        end
    end
end