Language:

サイドバー

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

メインメニュー

初心者向けガイド

VirtualCast

遊ぶ世界

THE SEED ONLINE

ニコニコ

SHOWROOM

配信

配信ツール

その他

wikiについて

デベロッパー向け


開発環境

VRM(アバター)

VCI(アイテム/背景)

VCI更新情報

更新日 - UniVCI バージョン
2021/03/17 v0.32
2.0.3b
2021/01/14 v0.31
2.0.1a
2020/12/03 v0.30
2.0.0b
2020/11/12 v0.30
2.0.0a
2020/10/22 v0.29
1.9.5b
2020/07/30 v0.29
1.9.3e
2020/06/25 v0.28
1.9.3c
2020/05/21 v0.27
1.9.2e

以前のアップデート履歴


GLB(背景)

vci:script:reference:exportassets

vci.assets(ExportAssets)

VCIにアタッチされたコンポーネントを扱う時のメソッドで、下記のような事ができます。
また_ALL_が付いているメソッドはスタジオ内に居るユーザー全員のVCIで実行されます。

  • Audio(音)の再生
  • Animation(アニメーション)の再生
  • MaterialのカラーやUVの変更

1.8.2aから、マテリアル制御系のメソッドが追加されました。

assets.material (ExportMaterial) (マテリアル制御)

vci.assets以下にあるマテリアル操作系メソッドはExportMaterialに移行予定ですので、ExportMaterialの方を優先してご使用ください。

メンバ変数・関数一覧

[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと一覧を確認できます。


名前 説明 対応バージョン
GetInstanceId fun(): string VCIごとに割り当てられたユニークID(string)を入手出来ます v2.0.0b以降
GetSubItem fun(name: string): ExportTransform ※現在非推奨です。GetTransformを使用することを推奨しています。VCI内のSubItemの(ExportTransform)を取得します。
GetTransform fun(name: string): ExportTransform VCI内のObjectのExportTransformを取得します。
GetSubItemAttractable fun(name: string): bool SubItemが引き寄せできる設定であれば true を返し、そうでなければ false を返します。
GetEffekseerEmitter fun(name: string): ExportEffekseer VCI内のObjectのEffekseer (エフェクト)を取得します。
GetEffekseerEmitters fun(name: string): usertype VCI内のObjectの Effekseer (エフェクト)を取得します。
IsMine bool VCIを出したクライアントであれば true を返し、そうでなければ nil になります。
audio ExportAudio VCI内のObjectのassets.audio (ExportAudio) (オーディオ制御)を取得します。
material ExportMaterial VCI内のObjectのassets.material (ExportMaterial) (マテリアル制御)を取得します。
SetMaterialColorFromIndex fun(index: number, color: Color) Indexnumberで指定したマテリアルの色を変更します
SetMaterialColorFromName fun(name: string, color: Color) 名前で指定したマテリアルの色を変更します
SetMaterialEmissionColorFromIndex fun(index: number, color: Color) Indexnumberで指定したマテリアルのEmissionColorを変更します
SetMaterialEmissionColorFromName fun(name: string, color: Color) 名前で指定したマテリアルのEmissionColorを変更します
SetMaterialTextureOffsetFromIndex fun(index: number, offset: Vector2) Indexnumberで指定したマテリアルの UVoffset を変更します
SetMaterialTextureOffsetFromName fun(name: string, offset: Vector2) 名前で指定したマテリアルの UVoffset を変更します
PlayAnimationFromIndex fun(index: number, isloop: bool) Indexnumberで指定したAnimationを再生します
PlayAnimationFromName fun(name: string, isloop: bool) 名前で指定したAnimationを再生します
StopAnimation fun() 全てのAnimationを停止します
PlayAudioFromIndex fun(index: number) Indexnumberで指定したAudioファイルを再生します
PlayAudioFromName fun(name: string) 名前で指定したAudioファイルを再生します
PauseAudioFromIndex fun(index: number, isPause: bool) Indexnumberで指定したAudioファイルを一時停止します
PauseAudioFromName fun(name: string, isPause: bool) 名前で指定したAudioファイルを一時停止します
StopAudioFromIndex fun(index: number) Indexnumberで指定したAudioファイルを停止します
StopAudioFromName fun(name: string) 名前で指定したAudioファイルを停止します
HapticPulseOnGrabbingController fun(target: string, strength: number, duration: number) コントローラーを振動させるのに使用します
HapticPulseOnTouchingController fun(target: string, strength: number, duration: number) コントローラーを振動させるのに使用します
SetText fun(id: string, text: string) VCIのテキスト機能で使用します
SetSubItemAttractable fun(name: string, value: bool) 引き寄せの可否を設定します

_ALL_ を含むメソッドは、他のクライアントでも実行され同期します。
全てのクライアントで同じ結果になってほしい場合は _ALL_ を含むメソッドを使用してください。

名前 説明
_ALL_SetMaterialColorFromIndex Indexnumberで指定したマテリアルの色を変更します
_ALL_SetMaterialColorFromName 名前で指定したマテリアルの色を変更します
_ALL_SetMaterialEmissionColorFromIndex Indexnumberで指定したマテリアルのEmissionColorを変更します
_ALL_SetMaterialEmissionColorFromName 名前で指定したマテリアルのEmissionColorを変更します
_ALL_SetMaterialTextureOffsetFromIndex Indexnumberで指定したマテリアルの UVoffset を変更します
_ALL_SetMaterialTextureOffsetFromName 名前で指定したマテリアルの UVoffset を変更します
_ALL_PlayAnimationFromIndex Indexnumberで指定したAnimationを再生します
_ALL_PlayAnimationFromName 名前で指定したAnimationを再生します
_ALL_StopAnimation
_ALL_PlayAudioFromIndex Indexnumberで指定したAudioファイルを再生します
_ALL_PlayAudioFromName 名前で指定したAudioファイルを再生します
_ALL_PauseAudioFromIndex Indexnumberで指定したAudioファイルを一時停止します
_ALL_PauseAudioFromName 名前で指定したAudioファイルを一時停止します
_ALL_StopAudioFromIndex Indexnumberで指定したAudioファイルを停止します
_ALL_StopAudioFromName 名前で指定したAudioファイルを停止します
_ALL_HapticPulseOnGrabbingController コントローラーを振動させるのに使用します
_ALL_HapticPulseOnTouchingController コントローラーを振動させるのに使用します
_ALL_SetText VCIのテキスト機能で使用します
_ALL_SetSubItemAttractable

VCIの同期について

ネットワーク越しに動くものを考える場合、同期を意識する必要があります。
バーチャルキャストのスタジオの中にAさん、Bさん、Cさんと居た時、Aさんが動かした結果をBさん、Cさんに反映させる事を「同期させる」といいます。
一方、動かした人のパソコンでしか動かないような設定は「ローカルのみで動作する」というような言い方になります。
VCIでは主に同期させる方法は以下の通りになります。

  • transformはバーチャルキャストの機能によって同期します。
  • _ALL_ のついたメソッドは同期して実行されます。
  • 共有変数を使用してVCIの状態を同期させます。

つまり vci.assets のメソッドは基本的に _ALL_ が付いたものを使用し、他のユーザーのVCIも動作するように作るという事です。
※音がなる程度のシンプルなVCIであれば、イベント関数で _ALL_ を呼びさえすれば問題ありません。
逆に、それぞれのユーザーでVCIの状態を変えたい時は同期しないようにローカルで動作するように作ります。

transformの同期については VCIアイテムとSubItemについて をご確認ください。

設定出来る文字量の制限について

_ALL_SetText など、 _ALL_ で始まるAPIで設定出来る文字量は UTF-8 換算で 512 byte までとなります。

目安としてはアルファベットならば約 500 文字、日本語ならば約 250 文字となります。

大量のテキストを表示したい場合は vci.state vci.message API を使用して同期を行う実装をしてください。

vci.message で送信出来る文字量は UTF-8 換算で 4000 byte までとなります。

vci.state で共有出来るデータ量は最大16KBまでとなります。

GetInstanceId

main.lua
print("id = "..tostring(vci.assets.GetInstanceId()))

実行結果

"id = QTZGZSKIDFIBLEODF"

説明
VCIに割り当てられたユニークIDを入手します
同じVCIを複数出した場合、別々のユニークIDを入手します。
またVCIを出し直した場合は新たに別のユニークIDを入手します

GetSubItem(非推奨)

サンプル1

main.lua
local Subitem = vci.assets.GetSubItem("Subitem")
 
function onUse(use)
    print(Subitem.GetPosition())
    Subitem.SetPosition(Vector3.zero)
end

サンプル2

main.lua
function onUse(use)
    print(vci.assets.GetSubItem("Subitem").GetPosition())
    vci.assets.GetSubItem("Subitem").SetPosition(Vector3.zero)
end

実行結果

(1.4, 0.2, 1.0)
useするとSubitemが(0.0, 0.0, 0.0)に移動します。
 
サンプル1とサンプル2で同じ動きをします。

説明
現在非推奨です。代わりにGetTransformの使用を推奨しています。 VCI内のSubItem(ExportTransform)を取得します。 詳しい使い方はExportTransformを参照してください。

GetTransform

サンプル1

main.lua
local Subitem = vci.assets.GetTransform("Subitem")
 
function onUse(use)
    print(Subitem.GetPosition())
    Subitem.SetPosition(Vector3.zero)
end

サンプル2

main.lua
function onUse(use)
    print(vci.assets.GetTransform("Subitem").GetPosition())
    vci.assets.GetTransform("Subitem").SetPosition(Vector3.zero)
end

実行結果

(1.4, 0.2, 1.0)
useするとSubitemが(0.0, 0.0, 0.0)に移動します。
 
サンプル1とサンプル2で同じ動きをします。

説明
VCI内Objectの(ExportTransform)を取得します。 詳しい使い方はExportTransformを参照してください。

GetSubItemAttractable

サンプル

main.lua
function onUse(use)
    print(vci.assets.GetSubItemAttractable(use))
end

実行結果

ture

説明
SubItemが引き寄せできる設定かどうかを返します。
引き寄せが可能であればtrueを、不可能であればfalseを返します。

GetEffekseerEmitter

GetEffekseerEmitter fun(name: string): ExportEffekseer
サンプル

main.lua
local SubitemEffekseer = vci.assets.GetEffekseerEmitter("Subitem")
function onUse(use)
    SubitemEffekseer.PlayOneShot()
end

実行結果

"Subitem"にアタッチされているEffekseerを一回再生する。

説明
詳しい使い方はEffekseer (エフェクト)を参照してください。

GetEffekseerEmitters

GetEffekseerEmitters fun(name: string): usertype
サンプル

main.lua
local SubitemEffekseers = vci.assets.GetEffekseerEmitters("Subitem")
function onUse(use)
    SubitemEffekseers[1].PlayOneShot()
end

実行結果

"Subitem"に1番目にアタッチされているEffekseerを一回再生する。

説明
詳しい使い方はEffekseer (エフェクト)を参照してください。

audio

audio ExportAudio
サンプル

main.lua
local Audio = vci.assets.audio
function onUse(use)
    Audio._ALL_Play("Fire", 0.5, false)
end

実行結果

"Fire"というAudioを再生する。

説明
詳しい使い方はassets.audio (ExportAudio) (オーディオ制御)を参照してください。

material

material ExportMaterial
サンプル

main.lua
local Material = vci.assets.material
function onUse(use)
    print(Material.GetColor("CubeColor"))
end

実行結果

RGBA(1.000, 1.000, 1.000, 1.000)

説明
詳しい使い方はassets.material (ExportMaterial) (マテリアル制御)を参照してください。

IsMine

VCIの所有者(アイテムを出した人)であるか判定します。 予め部屋に置いてあるアイテムの場合は、最初に入室した人が所有権を持ちます。(IsMine = trueになる)

main.lua
function updateAll() -- 所有権に関係なく全ユーザーに来る
    if vci.assets.IsMine then
        print("VCIの所有者です")
    end
end

実行結果

VCIの所有者です
(VCIの所有者(VCIを呼び出したユーザー)のみのConsoleにログが流れます)

SetMaterialColor

サンプル

main.lua
function onUse(self)
    print("onUse")
    local r = math.random()
    local g = math.random()
    local b = math.random()
    vci.assets._ALL_SetMaterialColorFromIndex(0, Color.__new(r,g,b))
end

実行結果

(アイテムを使った時に、ランダムに色を変更します)

マテリアルの色を変更します。指定方法は以下の2種類あります。

  • SetMaterialColorFromIndex(マテリアル番号,Color)
  • SetMaterialColorFromName(“マテリアル名”,Color)

また、Colorにはアルファ値(透明度)の指定もでき、Transparentなどのマテリアルの場合は半透明にすることもできます。

main.lua
function onUse(self)
    print("onUse")
    local r = 1.0
    local g = 0.0
    local b = 0.0
    local a = 0.5
    vci.assets._ALL_SetMaterialColorFromIndex(0, Color.__new(r,g,b,a))
end

実行結果

(赤い半透明のマテリアルに変更します)

SetMaterialEmissionColor

サンプル

main.lua
function onUse(self)
    print("onUse")
    local r = math.random()
    local g = math.random()
    local b = math.random()
    vci.assets._ALL_SetMaterialEmissionColorFromIndex(0, Color.__new(r,g,b))
end

実行結果

(アイテムを使った時に、ランダムにEmissionColorを変更します)

マテリアルの色を変更します。指定方法は以下の2種類あります。

  • SetMaterialEmissionColorFromIndex(マテリアル番号,Color)
  • SetMaterialEmissionColorFromName(“マテリアル名”,Color)

SetMaterialTextureOffset

サンプル

main.lua
function SetCounterOffset(count)
    local offset = Vector2.zero
 
    -- y shift
    local Yshift = math.floor(count / 4)    
    offset.y = -0.25 * Yshift
 
    -- x shift
    local Xshift = count % 4
    offset.x = 0.25 * Xshift
 
    vci.assets._ALL_SetMaterialTextureOffsetFromName("Counter", offset)
end

実行結果

(countの値に応じて、X方向にシフトすべき回数と、Y方向にシフトすべき回数を求めて、Counterを変化させます)


イメージとしては、4×4のグリッド状(最大16パターン)にUVをシフトさせるサンプルです。
3DモデルのUVの開始位置は左上です。
countの値が1の場合、y方向のシフト回数は0、x方向に1となり、UVが1の場所に変化します。
countの値が8の場合、y方向のシフト回数は2、x方向に0となり、UVが8の場所に変化します。
詳細な作り方はサンプルを確認してください。
→サンプル作成中※

指定方法は以下の2種類あります。

  • SetMaterialTextureOffsetFromIndex(マテリアル番号,Color)
  • SetMaterialTextureOffsetFromName(“マテリアル名”,Color)

PlayAnimation / StopAnimation

サンプル

main.lua
function onGrab(target)
    -- SubItemの名前毎に、再生するアニメーションを分岐する
    if target == "Subitem1" then
        vci.assets._ALL_PlayAnimationFromName("Subitem1",true) --true/false ループの可否
    end
 
    if target == "Subitem2" then
        vci.assets._ALL_PlayAnimationFromName("Subitem2",true) --true/false ループの可否
    end
end

実行結果

(Subitem1を掴んだ時にSubitem1が、Subitem2を掴んだ時にSubitem2のアニメーションが再生されます)

Subitemで再生するアニメーションを制御するようなサンプルです。
Subitemの名前とanimationのファイル名は一致している必要はありませんが、分かりやすくするためにサンプルではSubitemとanimationの名前を一致させています。
animationの作成や、セットアップの方法などはサンプルを参考にしてください。
→※サンプルページ作成中

PlayAudio

Audioファイルと、アニメーションファイルの名前は“gun”である必要があります。
音量はEditor実行して確認しましょう。
Unity オーディオソース

サンプル

main.lua
function onUse(target)
    if target == "gun" then
        vci.assets._ALL_PlayAudioFromName("gun")
        vci.assets._ALL_PlayAnimationFromName("gun",false) --true/false ループの可否
    end
end

実行結果

(gunという名前のVCIをuseした時に、音と(発火のような)アニメーションを再生させます)

AudioIndex


  • オーディオはオーディオクリップのファイル名で指定する方法と、AudioIndexで指定する方法があります。
  • AudioIndexはhierarchyの上から順に登録されてゆきます。
  • Index番号は0から始まります。
  • 上記の画像ではAudioTest_1のアイテムの場合、index0を指定するとAudio1が再生され、
    AudioTest_2のアイテムの場合、index0を指定するとAudio5が再生されます。

PauseAudio

サンプル

main.lua
local _PauseAudio = true
function onUse(use)
    if use == "Play" then
        vci.assets._ALL_PlayAudioFromName("bgm")
    end
    if use == "Pause" then
        vci.assets._ALL_PauseAudioFromName("bgm", _PauseAudio)
        _PauseAudio = not(_PauseAudio)
    end
end

実行結果

"Pause"をuseすることで音楽を一時停止することが出来ます。\\
一時停止中に再度"Pause"することで停止した場所から音楽を再生することが出来ます。\\

説明
第二引数にtrueを渡すと第一引数に渡した名前のオーディオが一時停止します。
falseを渡すと再生します。

StopAudio

サンプル

main.lua
function onGrab()
    -- Grabした時にAudio1を再生する。
    vci.assets._ALL_PlayAudioFromName("Audio1")
end
 
function onUse(use)
    -- StopをUseした時にAudio1を停止する。    
    if use == "Stop" then
        vci.assets._ALL_StopAudioFromName("Audio1")
        print("Stopが押されました。再生を停止します。")
    end
end

実行結果

("Stop"という名前のSubitemをUseすると、"Audio1"の再生が停止します。)

ファイル名で指定してオーディオの再生を停止します。
ファイル名は AudioSourceコンポーネント の AudioClip に割り当てられてるファイルの名前です。

HapticPulseOnGrabbingController

サンプル

main.lua
function onUse(use)
    -- useには掴んだSubItemの名前が格納される
    vci.assets.HapticPulseOnGrabbingController(use, 3000, 1)
    print(use.."を使っていた場合、useしたコントローラーを振動させます")
end

実行結果

(3000の強さで1秒振動します)

引数には (振動させるSubItem, 振動の強さ, 振動の時間) をとります。
振動させるSubItemはstringで指定し、強さは0~3999までの間をとります。
HapticPulseOnGrabbingController()の実行時に指定したSubItemを使っているコントローラーが振動します。

HapticPulseOnTouchingController

サンプル

main.lua
function onUse(use)
    -- useには掴んだSubItemの名前が格納される
    vci.assets.HapticPulseOnTouchingController(use, 3000, 1)
    print(use.."に触れていた場合、触れているコントローラーを振動させます")
end

実行結果

(useしたVCIに触れている場合、3000の強さで1秒振動します)

引数には (振動させるSubItem, 振動の強さ, 振動の時間) をとります。
振動させるSubItemはstringで指定し、強さは0~3999までの間をとります。
HapticPulseOnGrabbingController()の実行時に指定したSubItemを触れているコントローラーが振動します。

SetText()

第1引数:string (テキストのオブジェクト名) 第2引数:string (テキスト本文)

  • 詳細は VCIのテキスト表示 を確認してください。
  • 第1引数にはTextMeshProがアタッチされたオブジェクトのオブジェクト名を入れます。
  • 第2引数にテキスト本文を入れます。
  • 改行は “1行目\n2行目” という風に “\n” を挟む事で行えます。

サンプル

main.lua
function update()
    local time = os.date(("%H:%M:%S"))
    -- TextItem がテキストのオブジェクト
    vci.assets.SetText("TextItem", " Time : "..tostring(time))
end

実行結果

(時刻が表示されます)

SetSubItemAttractable

サンプル

main.lua
function onUse(use)
    print(vci.assets.GetSubItemAttractable("TestCube2"))
    vci.assets.SetSubItemAttractable("SubItem", false)
    print(vci.assets.GetSubItemAttractable("TestCube2"))
end

実行結果

一回目
true
true
二回目
false
false
三回目
false
false

vci.assets.GetSubItemAttractable(“SubItem”)の結果がfalseになります。
SubItemがアタッチされているオブジェクトに対して操作でき、SetSubItemAttractableで変更直後にvci.assets.GetSubItemAttractable(“SubItem”)を実行しても結果は変わらないので、処理を離して実装しましょう。

説明
引き寄せの可否を設定します。
trueの時、引き寄せが可能になります。

メソッド名

サンプル

main.lua
 

実行結果

 

説明

vci/script/reference/exportassets.txt · 最終更新: 2021/08/03 17:54 by t-daihisa

ページ用ツール