7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VCIのデバッグをマシにするスクリプト

Last updated at Posted at 2019-03-01

デバッグしずらい問題

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()
7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?