====== StartCoroutine(コルーチン) ======
このページは過去の情報となります。\\
新しいスクリプトリファレンスは**[[https://developer.virtualcast.jp/vci-docs/api/|こちら]]**になります。
**StartCoroutine fun(coroutine: usertype)**\\
コルーチンを開始します。\\
Luaの[[http://www.lua.org/manual/5.2/manual.html#2.6|コルーチン]]機能を用いて、Unityの[[https://docs.unity3d.com/ja/2018.4/Manual/Coroutines.html|コルーチン]]のような記述ができます。
バージョン: v1.9.2a以降
==== サンプル1 ====
vci.StartCoroutine(
coroutine.create(
function()
print("コルーチン開始")
local i = 0
while i < 10 do
-- カウントする
print(i)
i = i + 1
-- 0.5秒スリープする
sleep(0.5)
end
print("コルーチン終了")
end
)
)
function sleep(sec)
local t0 = os.time() + sec
while os.time() < t0 do
-- コルーチンの実行を中断する
coroutine.yield()
end
end
コルーチンは複数実行できますが、過剰に追加すると動作が不安定になるのでご注意ください。
また、無限ループにもご注意ください。coroutine.yieldがループ内に入っている場合は問題ありませんが、
coroutine.yieldをループ内に入れなかった場合、**Too Many Instructions**というエラーが表示され、スクリプトが停止します。
==== サンプル2 ====
複数のコルーチンを用いてアニメーションするサンプルです。
{{ :vci:script:reference:coroutinesample.zip |}}
local cube = vci.assets.GetTransform("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