デバッグしずらい問題
VirtualCastのVCIはスクリプトを書き換えると自動的にリロードしてくれます。
しかし前回のグローバル変数や関数の状態はリセットしてくれません。そのためスクリプト上には存在しない謎の存在のせいで悩まされることがあります。
それとアイテムがどこか遠くに飛んでいってしまい、試すのにわざわざ手元に持ってくるのが面倒すぎます。
いろいろリセットするスクリプト
グローバルの状態とサブアイテムの位置・角度・加速度をリセットしてくれるスクリプトです。
このスクリプトをluaファイルの一番上に貼り付けておくと、ファイルを保存してリロードされるたびにアイテムの状態が初期状態に戻るのでデバッグしやすくなります。
一番上の
SubItemNamesToReset = {}, -- ここにサブアイテムの名前を全てセットする
の部分にアイテムごとのサブアイテムの名前を書いておかないとリセットされません。
忘れずに書いてください。
Resetter
--[[
スクリプトが実行されるたびに初期状態にリセットしてデバッグしやすくしてくれるVCIスクリプト
リセットしてくれるのはサブアイテムの位置・角度・加速度とグローバル変数の状態
使う際はサブアイテムの名前を一番上のSubItemNamesToResetにセットしてください
例) SubItemNamesToReset = { "SubItem1", "SubItem2", "SubItem3" },
]]
local Resetter = {
SubItemNamesToReset = { }, -- ここにサブアイテムの名前を全てセットする
ResetEnv = function(self)
if _RESETTER_ENV_DEFAULE_KEYS_LIST == nil then
-- 初回実行時にデフォルトのグローバル変数を記録しておく
_RESETTER_ENV_DEFAULE_KEYS_LIST = {}
for key, value in pairs(_ENV) do
_RESETTER_ENV_DEFAULE_KEYS_LIST[key] = true
end
else
-- 2回目以降は初回に存在しなかったグローバル変数を全て削除する
for key, value in pairs(_ENV) do
if _RESETTER_ENV_DEFAULE_KEYS_LIST[key] == nil then
_ENV[key] = nil
end
end
end
end,
ResetSubItem = function(self, subItemName)
local subItem = vci.assets.GetSubItem(subItemName)
if (_RESETTER_SUB_ITEM_TRANSFORMS == nil) then
_RESETTER_SUB_ITEM_TRANSFORMS = {}
end
if _RESETTER_SUB_ITEM_TRANSFORMS[subItemName] == nil then
-- 初回実行時にサブアイテムの位置と角度を記録しておく
_RESETTER_SUB_ITEM_TRANSFORMS[subItemName] = {
Position = subItem.GetPosition(),
Rotation = subItem.GetRotation()
}
else
-- 2回目以降はサブアイテムの加速度と位置と角度をリセットする
subItem.SetVelocity(Vector3.zero)
subItem.SetAngularVelocity(Vector3.zero)
subItem.SetPosition(_RESETTER_SUB_ITEM_TRANSFORMS[subItemName].Position)
subItem.SetRotation(_RESETTER_SUB_ITEM_TRANSFORMS[subItemName].Rotation)
end
end,
Reset = function(self)
for index, subItemName in pairs(self.SubItemNamesToReset) do
self:ResetSubItem(subItemName)
end
self:ResetEnv()
end
}
Resetter:Reset()