====== vci(ExportVci) ====== You can access various information and functions in VCI.\\ ---- ===== List of member variables and functions ===== **For the complete list, refer to "types.lua" file in "EmbeddedScriptWorkspace" folder. ** ---vci module ---@class ExportVci ---@field StartCoroutine fun(coroutine: usertype) ---@field studio ExportStudio ---@field me ExportMe ---@field assets ExportAssets ---@field state ExportState ---@field message ExportMessage ---@field ResetRootTransform fun() ---@field _ALL_ResetRootTransform fun() ^ Method ^ Description ^ VC version ^ | StartCoroutine fun(coroutine: usertype) | Start a coroutine | 1.9.2a and later | | [[en:vci:script:reference:exportstudio | studio ]] | | | | [[en:vci:script:reference:exportme | me]] | | | | [[en:vci:script:reference:exportassets | assets]] | | | | [[en:vci:script:reference:exportstate | state]] | | | | [[en:vci:script:reference:message | message]] | | | | ResetRootTransform fun() | Reset the Transform of the VCI | 1.9.2a and later | | _ALL_ResetRootTransform fun() | Reset the Transform of the VCI | 1.9.2a and later | ---- ===== Start a coroutine ===== VC version: 1.9.2a and later By using [[http://www.lua.org/manual/5.2/manual.html#2.6|coroutine]] feature in lua, you can implement a Unity like [[https://docs.unity3d.com/2018.4/Documentation/Manual/Coroutines.html|coroutine]] in your script. Example vci.StartCoroutine( coroutine.create( function() print("Coroutine start") local i = 0 while i < 10 do -- Counts print(i) i = i + 1 -- Sleep for 0.5 seconds sleep(0.5) end print("Coroutine end") end ) ) function sleep(sec) local t0 = os.time() + sec while os.time() < t0 do -- Stop the coroutine coroutine.yield() end end You can run multiple coroutines in parallel, but be careful not to run too many as it may make the system unstable. Also, watch out for infinite loops. If the loop contains `coroutine.yield` , then it should be a problem. However, if `coroutine.yield` is not included in the loop, the error **Too Many Instructions** will be displayed and the script will be stopped. ==== Example data ==== This example uses multiple coroutines to animate. {{ :vci:script:reference:coroutinesample.zip |}} local cube = vci.assets.GetSubItem("Cube") vci.StartCoroutine( coroutine.create( function() print("Coroutine1: start") while true do local r = math.random() local g = math.random() local b = math.random() vci.assets.SetMaterialColorFromIndex(0, Color.__new(r,g,b)) sleep(2) end end ) ) vci.StartCoroutine( coroutine.create( function() print("Coroutine2: start") local ry = 0 while true do cube.SetLocalRotation(Quaternion.Euler(0, ry, 0)) ry = ry + 1 coroutine.yield() end end ) ) vci.StartCoroutine( coroutine.create( function() print("Coroutine3: start") local cnt = 0 while true do local x = 2 * math.cos(cnt / 100) local z = 2 * math.sin(cnt / 100) cube.SetLocalPosition(Vector3.__new(x, 4, z)) cnt = cnt + 1 coroutine.yield() end end ) ) function sleep(sec) local t0 = os.time() + sec while os.time() < t0 do coroutine.yield() end end ---- ===== Reset the Transform of VCI ===== VC version: 1.9.2a and later Under a usual situation, item VCIs are spawned right in the front of the avatar. After the generation, calling ResetRootTransform will reset the transform of the root of the VCI. The coordinate will be set to the origin, and the rotation will also be reset. Example vci.ResetRootTransform()