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:exporttransform

ExportTransform

ExportTransformクラスはTransformやRigidbodyに干渉する事のできるクラスです。
VCIの移動、回転、縮尺の変更や、力を与えて回転させたり、吹き飛ばしたりする事ができます。

メンバ変数・関数一覧

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

表記の省略の為、Vector3型Vec3number型num と表記してあります。
引数は () の中に、戻り値の型は :(セミコロン) の後に表記してあります。


名前 説明 VCバージョン
GetName fun(): string Subitemの名前を取得できます
GetLocalPosition fun(): Vec3 SubitemのPositionを取得できます
(Subitemローカル)
GetPosition fun(): Vec3 SubitemのPositionを取得できます
GetLocalRotation fun(): Quaternion SubitemのRotationを取得できます
(Subitemローカル)
GetRotation fun(): Quaternion SubitemのRotationを取得できます
GetLocalScale fun(): Vec3 Subitemのscaleを取得できます
GetRight fun(): Vec3 Subitemを基準にした右方向(X軸プラス)のベクトルを取得できます
GetUp fun(): Vec3 Subitemを基準にした上方向(Y軸プラス)のベクトルを取得できます
GetForward fun(): Vec3 Subitemを基準にした正面方向(Z軸プラス)のベクトルを取得できます
GetLocalToWorldMatrix fun(): Matrix4x4 ローカル座標からワールド座標に変換した時の行列
GetAttractable fun(): bool
BindUpdate fun(callback: usertype)
GetAnimation fun(): ExportAnimation ExportAnimationを使用するのに使います
GetAudioSources fun(): ExportAudioSource[] ExportAudioSourceを使用するのに使います
対象のExportTransformが表すGameObjectにアタッチされているすべてのAudioSourceを返します
v2.0.3b以降
IsMine bool SubItemの所有者の場合 true を返し、そうでなければ nil を返します
IsSubItem bool SubItemの場合は true を返し、そうでなければ false を返します
ActiveInHierarchy bool
ActiveSelf bool Transform 自身の有効無効設定を取得します v2.0.1a以降
SetPosition fun(position: Vec3) SubitemのPositionの値をVec3で指定した値に変更します
SetLocalPosition fun(localPosition: Vec3) SubitemのPositionの値をVec3で指定した値に変更します
SetRotation fun(rotation: Quaternion) SubitemのRotationの値をQuaternionで指定した値に変更します
SetLocalRotation fun(localRotation: Quaternion) SubitemのRotationの値をQuaternionで指定した値に変更します
SetLocalScale fun(localScale: Vec3) Subitemのscaleの値をVec3で指定した値に変更します
SetVelocity fun(velocity: Vec3) Subitemに加わっている力をVec3で指定した値に変更します
SetAngularVelocity fun(angularVelocity: Vec3) Subitemに加わってる回転をVec3で押した方向に変更します
AddForce fun(force: Vec3) Vec3で指定した値の力をSubitemに与えます
SetActive fun(isActive: bool) Transform 自身の有効無効設定を設定します(非同期) v2.0.1a以降
_ALL_SetActive fun(isActive: bool) Transform 自身の有効無効設定を設定します(全員へ同期) v2.0.1a以降

装着アイテム関連

名前 説明 VCバージョン
IsAttached bool 装着されている場合に true を返します 1.9.2a以降
AttachableDistance number 装着可能な距離を返します 1.9.2a以降
AttachableHumanBodyBones usertype 装着可能なボーン名一覧をtableで返します 1.9.2a以降
AttachToAvatar fun() 装着可能な場合に、装着を試みます 1.9.2a以降
DetachFromAvatar fun() 装着している場合に、脱着します 1.9.2a以降
SetAttractable fun(value: bool)

ExportTransformクラスを使うには Subitem = vci.assets.GetSubItem(“Subitem”) という風にSubitemを名前で指定してインスタンス化します。
その後、 Subitem.各メソッド() という風に実行してゆきます。

VCIの同期について

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

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

つまり、transformの同期については、強く意識せずともVCIを出したクライアントで動かした結果が、バーチャルキャストの機能を通じて他のクライアントにも適用されます。
詳細なtransformの同期については VCIアイテムとSubItemについて をご確認ください。

GetTransform()

サンプル

main.lua
--ExportTransform
--オブジェクト名は「SubItem」
SubItem = vci.assets.GetTransform("SubItem") 
 
print(SubItem.GetName())
print(SubItem.ToString())


実行結果

SubItem
VCIEmbedded.LuaMoonSharp.ExportTransform

vci.assets.GetTransform() の引数にオブジェクト名を入れると、
引数にしたオブジェクトのExportTransformをインスタンス化する事ができます。
インスタンス化したExportTransformのメソッドを使用する事により、transformの値を変更したり取得する事ができます。

サンプル2

main.lua
--ExportTransform
--SubItemに設定してるオブジェクト名は「SubItem」
Item = vci.assets.GetTransform("Item ") 
 
print(Item.GetPosition())
print(Item.GetLocalPosition())
print(Item.GetRotation())
print(Item.GetLocalRotation())
print(Item.GetLocalScale())
print(Item.GetForward())


実行結果

(0.0, 1.2, 0.0)
(0.0, 1.2, 0.0)
(0.0, 0.0, 0.0, 1.0)
(0.0, 0.0, 0.0, 1.0)
(1.0, 1.0, 1.0)
(0.0, 0.0, 1.0)

複数のsubItemをfor文で宣言する

main.lua
-- テーブルをfor文で宣言する
local _Items = {}
for i=1, 5 do
    _Items[i] = vci.assets.GetTransform("Item"..tostring(i))
    print(_Items[i].."をテーブルに登録しました。")
end

SubItemの名前を Item1 Item2 Item3 という風に連番で命名します。
そしたら for文を使って1からの連番で GetTransform() する事ができます。
※iは tostring(i) で文字列に変換できます。

IsMine

サンプル

main.lua
item = vci.assets.GetTransform('SubItem')
 
function updateAll() -- 所有権に関係なく全ユーザーが十個する
    if item.IsMine then -- SubItemの所有者の場合 true
        item.SetPosition(Vector3.__new(1, 2, 3))
    end
end

SubItemの所有者の場合だけ処理したい場合などに使用します。
所有権については 所有権とイベント関数の関係 を参考にしてください。

GetName()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    cubeName = cube.GetName()
    print(cubeName)
end


実行結果

"TestCube"

戻り値:string
VCIのオブジェクト名を取得できます。

GetPosition() / GetLocalPosition()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    cubePos = cube.GetPosition()
    print(cubePos)
end


実行結果

(0.0, 1.2, 0.0)

戻り値:Vector3
Subitemの現在地を取得できます。
Position()の場合、Unityの原点(0,0,0)が基準になり、LocalPosition()の場合はVCIを出現させた位置が原点として扱われます。

GetRotation() / GetLocalRotation()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    cubeRot = cube.GetRotation()
    print(cubeRot)
end


実行結果

(-0.5, 0.5, 0.5, 0.5)

戻り値:Quaternion
Subitemの回転(Quaternion)を取得できます。
Quaternionとは Rotation()の場合、Unity全体が基準の回転(Z+が正面)となり、LocalRotation()の場合はVCIを出現させた時の方向を基準とした回転として扱われます。
SetRotation(Quaternion.identity) UnityのZ+が正面方向として、姿勢を変更できます。

GetLocalScale()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    cubeScale = cube.GetLocalScale()
    print(cubeScale)
end


実行結果

(1.0, 1.0, 1.0, 1.0)

戻り値:Vector3
SubItemの縮尺を取得できます。

スケールが変更可能なSubItemのスケジュールを変える場合、1度GetLocalScale()で取得した値に対して、目的の倍率を掛けた後にSetLocalScale()とする事で「現在の大きさを基準したscaleの変更」をする事ができます。
(SetLocalScale()のみだと、現在の大きさを考慮しないスケールの変更となる)

GetForward()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    local cubeForward = cube.GetForward()
    print(cubeForward)
    cube.AddForce(cubeForward * 1000)
end


実行結果

cubeが向いてる方向に飛ぶ。cubeを離した状態でuseする必要がある。

戻り値:Vector3
SubItemが現在向いてる前方向のベクトルを取得できます。
(サブアイテムを基準にしたZ軸プラスのベクトル)

用途としては…GetForward()でオブジェクトの正面方向のベクトルを取得し、onUngrab()(SubItemを話した時)に正面方向のベクトルを使って AddForce()で力を加えると正面方向に力を加える事ができます。
「勢いよく前に飛ばす」等ができる。

SetPosition() / SetLocalPosition()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    local cubePos = cube.GetPosition()
    print(cubePos)
    cubePos.z = cubePos.z + 1
    print(cubePos)
    cube.SetPosition(cubePos)
    cube.SetVelocity(Vector3.zero)
end


実行結果

(0.0, 1.0, 0.0)
(0.0, 1.0, 1.0)
Z軸方向に1移動して止まります。

引数:vector3
VCIの現在地をVector3で指定した値に変更します。
Position()の場合、Unityの原点(0,0,0)が基準になり、LocalPosition()の場合はVCIを出現させた位置が原点として扱われます。

位置や回転をSetする場合、SubItemに力が加わっているとSetメソッドで指定した値にした後すぐ力が加わる計算が入るので、意図した結果にならない事があります。
なので、Setメソッドを呼んだ後にSetVelocity(0,0,0) で加わっている力を0にするのがよいです。

順番はSetPosition()の後にSetVelocity(0,0,0)です。
(逆だと力が0になった後でSetPosition()で力が加わる可能性があります)

SetRotation() / SetLocalRotation()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
local subCube = vci.assets.GetSubItem("TestCube2")
 
function onUse(use)
    local cubeRot = cube.GetLocalRotation()
    local subCubeRot = subCube.GetLocalRotation()
    subCube.SetLocalRotation(cubeRot)
    subCube.SetVelocity(Vector3.zero)
    subCube.SetAngularVelocity(Vector3.zero)
end


実行結果

subCubeの角度がCubeと等しくなります。

引数:Quaternion
VCIの姿勢(回転)をQuternionで指定した値に変更します。
Rotation()の場合、Unity全体が基準の回転(Z+が正面)となり、LocalRotation()の場合はVCIを出現させた時の方向を基準とした回転として扱われます。

位置や回転をSetする場合、SubItemに力が加わっているとSetメソッドで指定した値にした後すぐ力が加わる計算が入るので、意図した結果にならない事があります。
なので、Setメソッドを呼んだ後にSetVelocity(0,0,0) で加わっている力を0にするのがよいです。

順番はSetPosition()の後にSetVelocity(0,0,0)です。
(逆だと力が0になった後でSetPosition()で力が加わる可能性があります)

SetLocalScale()

main.lua
local cube = vci.assets.GetSubItem("TestCube")
 
function onUse(use)
    local cubeScale = cube.GetLocalScale()
    setScale = cubeScale * 1.5
    cube.SetLocalScale(setScale)
    print(cube.GetLocalScale())
end


実行結果

(4回use)
(1.0, 1.0, 1.0)
(1.5, 1.5, 1.5)
(2.3, 2.3, 2.3)
(3.4, 3.4, 3.4)

引数:vector3
VCIの縮尺をVector3で指定した値に変更します。

スケールが変更可能なSubItemのスケジュールを変える場合、1度GetLocalScale()で取得した値に対して、目的の倍率を掛けた後にSetLocalScale()とする事で「現在の大きさを基準したscaleの変更」をする事ができます。

SetVelocity()

引数:vector3
VCIに加わってる力を指定したVector3に変更します。

下記サンプルは掴んだ時に subitem の名前のオブジェクトがZ方向に移動します。
実行された直後にVelocityの値を持った状態になります。
Vector3.zero をセットすると、物理演算による運動を無くす事ができます。

サンプル

main.lua
item = vci.assets.GetSubItem("subitem")
function onGrab()
    local velocity = Vector3.__new(0, 0, 10)
    print(velocity)
    item.SetVelocity(velocity)
end

SetAngularVelocity()

引数:vector3
Vector3を基準とした回転する力がVCIに加わります。

下記サンプルは掴んだ時に subitem の名前のオブジェクトにvelocityが加わった場合の回転の力が加わります。

サンプル

main.lua
item = vci.assets.GetSubItem("subitem")
function onGrab()
    local velocity = Vector3.__new(10, 0, 0)
    print(velocity)
    item.SetAngularVelocity(velocity)
end

AddForce()

引数:vector3
Vector3の方向に向かって力が加わります。

下記サンプルは掴んだ時に subitem の名前のオブジェクトがZ方向に移動します。
AddForceなので、加速度があるような感じで少しづつ力が加わります。

サンプル

main.lua
item = vci.assets.GetSubItem("subitem")
function onGrab()
    local force = Vector3.__new(0, 0, 10)
    print(force)
    item.AddForce(force)
end

装着アイテム操作

VCバージョン: 1.9.2a以降

VCIAttachableがアタッチされたSubItemの操作ができます。 AttachToAvatarで装着し、DetachFromAvatarで脱着します。装着状態はIsAttachedで確認できます。 装着の判定は、VCIAttachableで設定された距離とボーン設定に従います。SubItemの所有権がない場合は装着できません。

サンプル

main.lua
local item = vci.assets.GetSubItem("Cube")
 
local dist = item.AttachableDistance
print("AttachableDistance: "..dist)
 
print("Bones")
local bones = item.AttachableHumanBodyBones
for key,value in ipairs(bones) do
    print(key .. " : " .. value)
end
 
function update()
 
    if vci.me.GetButtonInput(1) then
        print("装着します")
        item.AttachToAvatar()
    end
 
    if vci.me.GetButtonInput(2) then
        print("脱着します")
        item.DetachFromAvatar()
    end
 
end
 
vci.StartCoroutine(
    coroutine.create(
        function()
            while true do
                local isAttached = item.IsAttached
                if isAttached then
                    print("装着しています")
                else
                    print("装着していません")
                end
                sleep(1)
            end
        end
    )
)
 
function sleep(sec)
    local t0 = os.time() + sec
    while os.time() < t0 do
        coroutine.yield()
    end
end

サンプルデータ

手をかざすと自動で付着して、5秒後に離れるVCIです。装着中はエフェクトが再生されます。

attachsample.zip

main.lua
local item = vci.assets.GetSubItem("Ball")
local effect = vci.assets.GetEffekseerEmitter("Ball")
 
vci.StartCoroutine(
    coroutine.create(
        function()
            while true do
                if item.IsAttached == false then
                    item.AttachToAvatar()
                    sleep(0.1)
                    if item.IsAttached then
                        effect.Play()
                        sleep(5)
                        item.DetachFromAvatar()
                        effect.Stop()
                        sleep(1)
                    end
                end
                sleep(0.5)
            end
        end
    )
)
 
function sleep(sec)
    local t0 = os.time() + sec
    while os.time() < t0 do
        coroutine.yield()
    end
end

SetActive() / ActiveSelf / ActiveInHierarchy

Transform の有効無効設定は SetActive(isActive: bool) で設定することができます。
デフォルトの状態は有効です。
※SetActiveの場合は非同期でアクティブを変更するため、部屋にいる全員の環境でアクティブを変更する場合は_ALL_SetActive(isActive: bool)を使用します。

有効状態である場合

  • レンダリングが有効化し、表示されます。
  • 物理判定が有効化し、他の Rigidbody と干渉できる状態になります。
  • Grab や Use といったインタラクションが有効化し、可能になります。

無効状態である場合

  • レンダリングが無効化し、表示されなくなります。
  • 物理判定が無効化し、他の Rigidbody と干渉できない状態になります。
  • Grab や Use といったインタラクションが無効化し、できなくなります。

また ActiveSelf は自分自身の有効無効設定を取得します。

ただし Transform が他の Transform の子になっている場合は挙動が複雑になります。 たとえば Hierarchy 上の親 Transform が無効状態ならば、自身の有効無効に関わらず、無効状態になります。

したがって、その Transform が実際に有効なのか無効なのかを調べるには ActiveInHierarchy を使うと良いでしょう。

Transform の Hierarchy 構造
─ Parent
   └ Child
main.lua
local Parent = vci.assets.GetTransform("Parent")
local Child = vci.assets.GetTransform("Child")
 
Parent.SetActive(false) -- Parent は無効設定
Child.SetActive(true) -- Child は有効設定
 
--> Parent も Child も無効状態になり、非表示状態になる
 
print(Child.ActiveSelf) --> true. Child 自身は有効設定だが...
print(Child.ActiveInHierarchy) --> false. Child は実際には無効状態となる.
vci/script/reference/exporttransform.txt · 最終更新: 2021/06/17 19:14 by t-daihisa

ページ用ツール