このページは過去の情報となります。
新しいスクリプトリファレンスはこちらになります。
ExportTransformクラスはVCIのオブジェクトを扱うクラスです。
オブジェクトはUnityのTransformに対応し、加えてRigidbodyやSubItemの操作も含まれます。
たとえば移動、回転、縮尺の変更や、力を与えて回転させたり、吹き飛ばしたりする事ができます。
ExportAssets | ||
---|---|---|
名前 | 説明 | バージョン |
GetTransform | VCI内のTransformを取得 | |
ExportTransform | ||
名前 | 説明 | バージョン |
GetName | Transformの名前を取得 | |
GetPosition / GetLocalPosition | Transformの位置を取得 | |
GetRotation / GetLocalRotation | Transformの回転を取得 | |
GetLocalScale | Transformの縮尺を取得 | |
GetVelocity | Rigidbodyの速度をVector3として取得 | |
GetAngularVelocity | Rigidbodyの角速度をVector3として取得 | |
GetForward / GetRight / GetUp | Transformを基準に前・右・上のVector3を取得 | |
GetLocalToWorldMatrix | ローカル→ワールド座標に変換した時の行列 | |
GetAttractable | SubItemが引き寄せ可能かどうか | |
SetPosition / SetLocalPosition | Transformの位置をVector3で変更 | |
SetRotation / SetLocalRotation | Transformの回転をQuaternionで変更 | |
SetLocalScale | Transformの縮尺をVector3で変更 | |
SetVelocity | Rigidbodyに加わっている力をVector3で変更 | |
SetAngularVelocity | Rigidbodyに加わってる回転をVector3で変更 | |
AddForce | 指定したForceModeでRigidbodyに力を付与 | v2.2.1a以降 |
SetAttractable | SubItemの引き寄せを設定 | |
IsMine | SubItemの所有者かどうか | |
IsSubItem | SubItemかどうか | |
SetActive / ActiveSelf / ActiveInHierarchy | Transform 自身の有効無効設定を設定 | v2.0.1a以降 |
他のクラスで使用 | ||
名前 | 説明 | バージョン |
GetAnimation | ExportAnimationを使用 | |
GetAudioSources | ExportAudioSourceを使用 | v2.0.3b以降 |
ExportTransformクラスを使うには local transform = vci.assets.GetTransform(“SubItemName”)
のようにTransformの名前を指定してインスタンス化します。
その後、 transform.各関数()
と各関数を実行できます。
ネットワーク越しに動くものを考える場合、同期を意識する必要があります。
バーチャルキャストのスタジオの中にAさん、Bさん、Cさんと居た時、Aさんが動かした結果をBさん、Cさんに反映させる事を「同期させる」といいます。
一方、動かした人のパソコンでしか動かないような設定は「ローカルのみで動作する」というような言い方になります。
VCIでは主に同期させる方法は以下の通りになります。
_ALL_
のついた関数は同期して実行されます。
つまり、transformの同期については、強く意識せずともVCIを出したクライアントで動かした結果が、バーチャルキャストの機能を通じて他のクライアントにも適用されます。
詳細なtransformの同期については VCIアイテムとSubItemについて をご確認ください。
ExportAssets.GetTransform fun(name: string): ExportTransform
VCI 内のオブジェクトを取得します。
引数 name
に取得したいオブジェクト名を入れると、該当オブジェクトの ExportTransform
を取得します。
指定した名前のオブジェクトが存在しない場合、 nil
が返ります。
取得した ExportTransform
の関数を使用する事により、 transform の値の取得や変更を行う事ができます。
(詳しくは ExportTransform を参照してください)
(バーチャルキャスト 2.3.1a 以降)
引数 name
が /
から始まる文字列の場合、 name
を VCIObject から見たパスとして検索し、該当パスにオブジェクトがあった場合はそのオブジェクトの ExportTransform
を取得します。
該当パスのオブジェクトが存在しない場合は、従来通り name
全体をオブジェクト名として検索します。
--ExportTransform --SubItem のオブジェクト名は「SubItem」 local SubItem = vci.assets.GetTransform("SubItem") print("Name: " .. SubItem.GetName()) print("Position: " .. SubItem.GetPosition().ToString()) print("LocalPosition: " .. SubItem.GetLocalPosition().ToString()) print("Rotation: " .. SubItem.GetRotation().ToString()) print("LocalRotation: " .. SubItem.GetLocalRotation().ToString()) print("LocalScale: " .. SubItem.GetLocalScale().ToString()) print("Forward: " .. SubItem.GetForward().ToString())
Name: SubItem Position: (0.00, 1.00, 0.00) LocalPosition: (0.00, 0.00, 0.00) Rotation: (0.00000, 0.70711, 0.00000, 0.70711) LocalRotation: (0.00000, 0.00000, 0.00000, 1.00000) LocalScale: (1.00, 1.00, 1.00) Forward: (1.00, 0.00, 0.00)
以下のような構造の VCI の場合
local shhere_1 = vci.assets.GetTransform("/SubItem1/Sphere") print(shhere_1.GetName()) print(shhere_1.GetPosition()) local shhere_2 = vci.assets.GetTransform("/SubItem2/Sphere") print(shhere_2.GetName()) print(shhere_2.GetPosition())
Sphere (1.00, 2.50, 0.00) Sphere (2.00, 1.00, 0.00)
SubItemの名前を Item1
Item2
Item3
という風に連番で命名します。
そしたら for文を使って1からの連番で GetTransform()
する事ができます。
※iは tostring(i)
で文字列に変換できます。
-- テーブルをfor文で宣言する local _Items = {} for i=1, 5 do _Items[i] = vci.assets.GetTransform("Item"..tostring(i)) print(_Items[i].."をテーブルに登録しました。") end
ExportTransformGetName fun(): string
VCIのオブジェクト名を取得できます。
string
local cube = vci.assets.GetTransform("TestCube") function onUse(use) cubeName = cube.GetName() print(cubeName) end
"TestCube"
GetPosition fun(): Vector3
GetLocalPosition fun(): Vector3
Transformの現在地を取得できます。
Position()の場合、Unityの原点(0,0,0)が基準になり、LocalPosition()の場合はVCIを出現させた位置が原点として扱われます。
Vector3
local cube = vci.assets.GetTransform("TestCube") function onUse(use) cubePos = cube.GetPosition() print(cubePos) end
(0.0, 1.2, 0.0)
GetRotation fun(): Quaternion
GetLocalRotation fun(): Quaternion
Transformの回転(Quaternion)を取得できます。
Quaternionとは
Rotation()の場合、Unity全体が基準の回転(Z+が正面)となり、LocalRotation()の場合はVCIを出現させた時の方向を基準とした回転として扱われます。
SetRotation(Quaternion.identity)
UnityのZ+が正面方向として、姿勢を変更できます。
Quaternion
local cube = vci.assets.GetTransform("TestCube") function onUse(use) cubeRot = cube.GetRotation() print(cubeRot) end
(-0.5, 0.5, 0.5, 0.5)
GetLocalScale fun(): Vector3
Transformの縮尺を取得できます。
スケールが変更可能なTransformのスケジュールを変える場合、1度GetLocalScale()で取得した値に対して、目的の倍率を掛けた後にSetLocalScale()とする事で「現在の大きさを基準したscaleの変更」をする事ができます。
(SetLocalScale()のみだと、現在の大きさを考慮しないスケールの変更となる)
Vector3
local cube = vci.assets.GetTransform("TestCube") function onUse(use) cubeScale = cube.GetLocalScale() print(cubeScale) end
(1.0, 1.0, 1.0, 1.0)
GetVelocity fun(): Vector3
Transformの速度をベクトルとして取得します。
サンプルはSubItemをUseした時に、そのVCIの速度を取得し、ログに表示します。
Vector3
item = vci.assets.GetTransform("subitem") function onGrab() local velocity = item.GetVelocity() print(velocity) end
GetAngularVelocity fun(): Vector3
Transformの角速度を、ラジアン/秒で表されるベクトルで取得します。
サンプルは、SubItemをUseした時に角速度を取得してログに出力します。
Vector3
local cube = vci.assets.GetTransform("TestCube") function onUse(use) local angularVelocity = cube.GetAngularVelocity() print(angularVelocity) end
GetForward fun(): Vector3
GetRight fun(): Vector3
GetUp fun(): Vector3
Transformが現在向いてる前方向のベクトルを取得できます。
(Transformを基準にしたZ軸プラスのベクトル)
用途としては…GetForward()でオブジェクトの正面方向のベクトルを取得し、onUngrab()(SubItemを離した時)に正面方向のベクトルを使って AddForce()で力を加えると正面方向に力を加える事ができます。
「勢いよく前に飛ばす」等ができる。
Vector3
local cube = vci.assets.GetTransform("subitem") function onUse(use) local cubeForward = cube.GetForward() print(cubeForward) cube.AddForce(cubeForward * 1000) end
cubeが向いてる方向に飛ぶ。cubeを離した状態でuseする必要がある。
GetLocalToWorldMatrix fun(): Matrix4x4
ローカル座標からワールド座標に変換した時の行列です。
GetAttractable fun(): boolean
SubItemが引き寄せ可能かどうかを返します。
SetPosition fun(position: Vector3):
SetLocalPosition fun(localPosition: Vector3):
VCIの現在地をVector3で指定した値に変更します。
Position()の場合、Unityの原点(0,0,0)が基準になり、LocalPosition()の場合はVCIを出現させた位置が原点として扱われます。
位置や回転をSetする場合、Transformに力が加わっているとSet関数で指定した値にした後すぐ力が加わる計算が入るので、意図した結果にならない事があります。
なので、Set関数を呼んだ後にSetVelocity(0,0,0) で加わっている力を0にするのがよいです。
順番はSetPosition()の後にSetVelocity(0,0,0)です。
(逆だと力が0になった後でSetPosition()で力が加わる可能性があります)
vector3
local cube = vci.assets.GetTransform("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移動して止まります。
SetRotation fun(rotation: Quaternion):
SetLocalRotation fun(localRotation: Quaternion):
VCIの姿勢(回転)をQuternionで指定した値に変更します。
Rotation()の場合、Unity全体が基準の回転(Z+が正面)となり、LocalRotation()の場合はVCIを出現させた時の方向を基準とした回転として扱われます。
位置や回転をSetする場合、Transformに力が加わっているとSet関数で指定した値にした後すぐ力が加わる計算が入るので、意図した結果にならない事があります。
なので、Set関数を呼んだ後にSetVelocity(0,0,0) で加わっている力を0にするのがよいです。
順番はSetPosition()の後にSetVelocity(0,0,0)です。
(逆だと力が0になった後でSetPosition()で力が加わる可能性があります)
Quaternion
local cube = vci.assets.GetTransform("TestCube") local subCube = vci.assets.GetTransform("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と等しくなります。
SetLocalScale fun(localScale: Vector3):
VCIの縮尺をVector3で指定した値に変更します。
スケールが変更可能なTransformのスケジュールを変える場合、1度GetLocalScale()で取得した値に対して、目的の倍率を掛けた後にSetLocalScale()とする事で「現在の大きさを基準したscaleの変更」をする事ができます。
local cube = vci.assets.GetTransform("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)
SetVelocity fun(velocity: Vector3):
Transformの速度を、指定したVector3の値に設定します。
サンプルはSubItemを離した時に、+Z方向に移動するように速度を設定します。
実行された直後にVelocityの値を持った状態になります。
Vector3.zero をセットすると、物理演算による移動を止める事ができます。
vector3
item = vci.assets.GetTransform("subitem") function onUngrab() local velocity = Vector3.__new(0, 0, 10) print(velocity) item.SetVelocity(velocity) end
SetAngularVelocity fun(angularVelocity: Vector3):
Transformの角速度を、ラジアン/秒で表されるベクトルで設定します。
サンプルは、SubItemを離した時に、velocity変数の値を角速度として設定します。
vector3
item = vci.assets.GetTransform("subitem") function onUngrab() local velocity = Vector3.__new(10, 0, 0) print(velocity) item.SetAngularVelocity(velocity) end
AddForce fun(force: Vector3, forceMode: ExportForceMode):
ForceModeで指定したアルゴリズムを利用し、Vector3の方向に向かって力を加えます。
item = vci.assets.GetTransform("subitem") function onUngrab() item.AddForce(Vector3.__new(0, 0, 10), vci.forceMode.Force) end
item = vci.assets.GetTransform("subitem") function onUngrab() item.AddForce(Vector3.__new(0, 0, 10), vci.forceMode.Impulse) end
IsMine boolean
SubItemの所有者の場合だけ処理したい場合などに使用します。
所有権については 所有権とイベント関数の関係 を参考にしてください。
item = vci.assets.GetTransform('SubItem') function updateAll() -- 所有権に関係なく全ユーザーが十個する if item.IsMine then -- SubItemの所有者の場合 true item.SetPosition(Vector3.__new(1, 2, 3)) end end
SetAttractable fun(value: boolean):
SubItemの引き寄せを設定します。
IsSubItem boolean
SubItemであるかどうかを返します。
SetActive fun(isActive: boolean):
_ALL_SetActive fun(isActive: boolean):
ActiveSelf boolean
ActiveInHierarchy boolean
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 は実際には無効状態となる.