Language:

サイドバー

バーチャルキャスト公式Wiki

メニュー

Steam版

デバイス

アセット

配信

その他

リリース情報

デベロッパー向け


開発環境

GLB

vci:script:reference:message

以前のリビジョンの文書です


ExportMessage(メッセージ通信)

メッセージと呼ばれるデータを指定の名前に紐づけて、ローカルの他のVCIや、他のクライアントのVCIとも通信することができます。

想定用途は2種類あります。
ひとつは EmitWithId自分自身のVCIのネットワーク同期のため です。
もうひとつは Emit空間内の異なるVCIへのイベントの発出のため です。

具体的な活用例としては以下が挙げられます。
EmitWithId を使えば色の変化などのVCIの状態変化をネットワーク同期できます。
Emit を使えばリモコンなど他のVCIを操作したり、文字表示VCIに表示する文字を伝えることができます。

制限としては、送信出来るデータ量は約 4000 byte です。

またネットワーク同期を行う機能として他に同期変数があります。

名前 説明 バージョン
Emit メッセージを全体に送信
EmitWithId IDを指定してメッセージを送信 2.0.0b以降
On メッセージを受信

Emit

Emit fun(messageName: string, value: usertype)

  • 空間(スタジオ・ルーム)にあるすべてのVCIに対してメッセージを送信します。
  • ローカルのみならず、他のクライアントにもメッセージを送信します。
  • 異なるVCIに対する通信など、空間全体にメッセージを発する必要がある時に使用します。
    用途に合致しない限り使用を避けてください
  • 受信側は誰からのメッセージなのか区別することができないため、他のVCIを誤動作させる可能性があります。メッセージ名にありふれた名前を使わないでください
  • 空間全体にメッセージを発するため、ネットワーク負荷が非常に重いです。
    updateイベントなど高頻度で呼ばないでください
sample.lua
function onUse(objectName)
    vci.message.Emit("my_special_vci_protocol_display_text", "こんにちは")
end

EmitWithId

EmitWithId fun(messageName: string, value: usertype, targetId: string)

  • 特定のVCIに対してメッセージを送信します。
  • ローカルのみならず、他のクライアントにもメッセージを送信します。
  • 同じVCIを複数出したときも、自分自身のVCIにのみメッセージを届けることができます。
sample.lua
function onUse(objectName)
    -- 自分自身のVCIに対してメッセージを送信
    vci.message.EmitWithId("color", 3, vci.assets.GetInstanceId())
end

On

On fun(messageName: string, callback: usertype)

  • メッセージを受信します。
  • メッセージを送信したのと同じVCIでも、別のVCIでもOK。
  • Onの第1引数と Emitの第1引数 が一致したものを受け取ります。
  • 受け取ったメッセージを第2引数の関数に渡します。
  • Onは第2引数で指定した関数よりも後に定義してください。受信関数よりも前に定義するとエラーとなります。

引数

以下、3つの引数をとります。senderはシステムによって設定される送信者情報のtableです。

引数 内容
sender.type vci という文字列。
sender.name 送信元のVCIのTitle。
sender.commentSource 空文字列。
name メッセージの名前。Emit 関数の第1引数です。
message メッセージの内容。Emit 関数の第2引数です。

サンプル

送信側

send.lua
function onUse(self)
    -- 第1引数にメッセージの種類 第2引数にメッセージの内容
    -- 今回は受信側のSubItemをジャンプさせるメッセージとその強さを指定
    vci.message.Emit("message_jump",3000)
end

受信側

get.lua
local receiver = vci.assets.GetTransform("Cube")
 
    -- sender: 送信者情報(システムが設定します)
    -- name: メッセージの名前。Emit 関数の第1引数です。
    -- message: メッセージの内容。Emit 関数の第2引数です。
function Jump(sender, name, message)
 
    for k, v in pairs(sender) do
        print(k .. ":" .. v)
    end
 
    -- nameにメッセージの種類 messageにメッセージの内容が入ってます    
    print(name)
    print(message)
 
    --messageに入っているジャンプの強さでSubItemを飛ばします
    receiver.AddForce(message*receiver.GetUp())
 
end
 
--シーンでメッセージ名が"message_jump"のvci.message.Emitが実行されたときにJump関数が呼び出される
vci.message.On("message_jump", Jump)

EmitWithIdで特定のVCIに対して送信する

get.lua
function GetMessage(sender, name, message)
    print(message.abc)
end
 
vci.message.On("123", GetMessage)
function update()
    -- vci.assets.GetInstanceIdを指定して自分自身にだけ送信する
    vci.message.EmitWithId("123", { abc = "ハロー" }, vci.assets.GetInstanceId())
end 

送信側がやっている事
基本的に送りたいメッセージをEmit()を実行して送るだけです。
ただし、受信側とどのようなメッセージをやり取りするかは事前に決めておく必要があります。

受信側がやっている事
1.vci.message.On() で受信したいメッセージの種類を登録します。
 Emit()でメッセージが送信された時にOn()で登録されたメッセージを読み込むことができます。
2.この例では、送られてきたメッセージはJump()に渡されます。
 メッセージの内容がJump()の引数として与えられます。
3.Jump()の引数の内容がメッセージの内容なので、
 送信するメッセージの内容を変化させることで、受信側の挙動を変えることができます。

解説

サンプル

vci/script/reference/message.1676287580.txt.gz · 最終更新: 2023/02/13 20:26 by santarh

ページ用ツール