バーチャルキャスト公式Wiki
メニュー
Steam版
デバイス
アセット
配信
その他
リリース情報
- wiki編集者用ページ
-
以前のリビジョンの文書です
ExportTransformクラスはTransformやRigidbodyに干渉する事のできるクラスです。
VCIの移動、回転、縮尺の変更や、力を与えて回転させたり、吹き飛ばしたりする事ができます。
[EmbeddedScriptWorkspace]フォルダ内の[types.lua]を開くと一覧を確認できます。
表記の省略の為、Vector3型
は Vec3
、number型
は 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 | ||
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.各メソッド()
という風に実行してゆきます。
ネットワーク越しに動くものを考える場合、同期を意識する必要があります。
バーチャルキャストのスタジオの中にAさん、Bさん、Cさんと居た時、Aさんが動かした結果をBさん、Cさんに反映させる事を「同期させる」といいます。
一方、動かした人のパソコンでしか動かないような設定は「ローカルのみで動作する」というような言い方になります。
VCIでは主に同期させる方法は以下の通りになります。
_ALL_
のついたメソッドは同期して実行されます。
つまり、transformの同期については、強く意識せずともVCIを出したクライアントで動かした結果が、バーチャルキャストの機能を通じて他のクライアントにも適用されます。
詳細なtransformの同期については VCIアイテムとSubItemについて をご確認ください。
サンプル
--ExportTransform --オブジェクト名は「SubItem」 SubItem = vci.assets.GetTransform("SubItem") print(SubItem.GetName()) print(SubItem.ToString())
実行結果
SubItem VCIEmbedded.LuaMoonSharp.ExportTransform
vci.assets.GetTransform()
の引数にオブジェクト名を入れると、
引数にしたオブジェクトのExportTransformをインスタンス化する事ができます。
インスタンス化したExportTransformのメソッドを使用する事により、transformの値を変更したり取得する事ができます。
サンプル2
--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)
-- テーブルを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)
で文字列に変換できます。
サンプル
item = vci.assets.GetTransform('SubItem') function updateAll() -- 所有権に関係なく全ユーザーが十個する if item.IsMine then -- SubItemの所有者の場合 true item.SetPosition(Vector3.__new(1, 2, 3)) end end
SubItemの所有者の場合だけ処理したい場合などに使用します。
所有権については 所有権とイベント関数の関係 を参考にしてください。
local cube = vci.assets.GetSubItem("TestCube") function onUse(use) cubeName = cube.GetName() print(cubeName) end
実行結果
"TestCube"
戻り値:string
VCIのオブジェクト名を取得できます。
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を出現させた位置が原点として扱われます。
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+が正面方向として、姿勢を変更できます。
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()のみだと、現在の大きさを考慮しないスケールの変更となる)
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()で力を加えると正面方向に力を加える事ができます。
「勢いよく前に飛ばす」等ができる。
戻り値:Vector3
SubItemの角速度を、ラジアン/秒で表されるベクトルで取得します。
下記サンプルは、SubItemをUseした時に角速度を取得してログに出力します。
local cube = vci.assets.GetSubItem("TestCube") function onUse(use) local angularVelocity = cube.GetAngularVelocity() print(angularVelocity) end
引数:Vector3
VCIの速度をベクトルとして取得します。
下記サンプルはSubItemをUseした時に、そのVCIの速度を取得し、ログに表示します。
サンプル
item = vci.assets.GetSubItem("subitem") function onGrab() local velocity = item.GetVelocity() print(velocity) end
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()で力が加わる可能性があります)
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()で力が加わる可能性があります)
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の変更」をする事ができます。
引数:vector3
VCIの速度を、指定したVector3の値に設定します。
下記サンプルはSubItemを掴んだ時に、+Z方向に移動するように速度を設定します。
実行された直後にVelocityの値を持った状態になります。
Vector3.zero をセットすると、物理演算による移動を止める事ができます。
サンプル
item = vci.assets.GetSubItem("subitem") function onGrab() local velocity = Vector3.__new(0, 0, 10) print(velocity) item.SetVelocity(velocity) end
引数:vector3
SubItemの角速度を、ラジアン/秒で表されるベクトルで設定します。
下記サンプルは、SubItemを掴んだ時に、velocity変数の値を角速度として設定します。
サンプル
item = vci.assets.GetSubItem("subitem") function onGrab() local velocity = Vector3.__new(10, 0, 0) print(velocity) item.SetAngularVelocity(velocity) end
引数:vector3
Vector3の方向に向かって力が加わります。
下記サンプルは掴んだ時に subitem の名前のオブジェクトがZ方向に移動します。
AddForceなので、加速度があるような感じで少しづつ力が加わります。
サンプル
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の所有権がない場合は装着できません。
サンプル
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です。装着中はエフェクトが再生されます。
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
Transform の有効無効設定は SetActive(isActive: bool)
で設定することができます。
デフォルトの状態は有効です。
※SetActiveの場合は非同期でアクティブを変更するため、部屋にいる全員の環境でアクティブを変更する場合は_ALL_SetActive(isActive: bool)
を使用します。
有効状態である場合
無効状態である場合
また ActiveSelf
は自分自身の有効無効設定を取得します。
ただし Transform が他の Transform の子になっている場合は挙動が複雑になります。 たとえば Hierarchy 上の親 Transform が無効状態ならば、自身の有効無効に関わらず、無効状態になります。
したがって、その Transform が実際に有効なのか無効なのかを調べるには ActiveInHierarchy
を使うと良いでしょう。
─ Parent └ Child
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 は実際には無効状態となる.