ユーザ用ツール

サイト用ツール


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を取得できます
GetForward fun(): Vec3 Subitemを基準にした正面方向(Z軸プラス)のベクトルを取得できます
GetRight fun(): Vec3 Subitemを基準にした右方向(X軸プラス)のベクトルを取得できます
GetUp fun(): Vec3 Subitemを基準にした上方向(Y軸プラス)のベクトルを取得できます
GetLocalToWorldMatrix fun(): Matrix4x4 ローカル座標からワールド座標に変換した時の行列
GetAnimation fun(): ExportAnimation ExportAnimationを使用するのに使います
IsMine bool SubItemの所有者の場合 true を返し、そうでなければ nil を返します
IsSubItem bool SubItemの場合は true を返し、そうでなければ false を返します
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に与えます

装着アイテム関連

名前 説明 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以降

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


VCIの同期について

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

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

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


GetSubItem()

サンプル

main.lua
--ExportTransform
--SubItemに設定してるオブジェクト名は「SubItem」
SubItem = vci.assets.GetSubItem("SubItem") 
 
print(SubItem.GetName())
print(SubItem.ToString())


実行結果

SubItem
VCIEmbedded.LuaMoonSharp.ExportTransform

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

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

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

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


IsMine

サンプル

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

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


Get transform

サンプル

main.lua
--ExportTransform
--SubItemに設定してるオブジェクト名は「SubItem」
SubItem = vci.assets.GetSubItem("SubItem") 
 
print(SubItem.GetPosition())
print(SubItem.GetLocalPosition())
print(SubItem.GetRotation())
print(SubItem.GetLocalRotation())
print(SubItem.GetLocalScale())
print(SubItem.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)

GetName()

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


GetPosition() / GetLocalPosition()

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


GetRotation() / GetLocalRotation()

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


GetLocalScale()

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

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


GetForward()

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

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


SetPosition() / SetLocalPosition()

引数: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()

引数: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()

引数: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
vci/script/reference/exporttransform.txt · 最終更新: 2020/04/16 12:48 by fumo

ページ用ツール