14. 値を引き継ぐ

OnTickが呼ばれるたびに前の回から数を1ずつ増やしてみます。次に転生後にも残したい値を指定します。Persistは初回Recompileで解放されます。

メソッドの外に置く値

OnTickの中でint count = 0;と書くと、呼ばれるたびに0から始まります。前の回の値を使うにはProgramのフィールドにします。

ArcaneScript
public class Program : ArcaneProgram
{
    private int count = 0;

    public void OnTick()
    {
        count++;
        if (count == 3)
        {
            Workshop.Log.Write("Third call.");
        }
    }
}

countの宣言をOnTickの外へ置いています。最初の呼び出しで1、次で2、その次で3になり、Third call.を出します。4回目には4になるので、この文章は出ません。

OnTickの回数は正確な経過秒数を表すものではありません。

転生しても残す値

通常のフィールドは転生すると初期化されます。Programのフィールド宣言の前に[Persist]を付けると、対応する値を転生後にも残せます。

例えば採掘目標なら[Persist] private int oreTarget = 100;と書きます。OnTickでTotal < oreTargetと比べれば、その目標を使えます。Persistは値を引き継ぐ指定であり、資源を増やしたり、以前のジョブを復元したりする操作ではありません。

いつ処理が呼ばれるか

名前呼ばれる場面
OnStart初回実行、同じセッションでの通常再開
OnTickScript実行中の定期的な処理
OnRestored再入室後に保存実行版を再開
OnPrestige転生後の通知

同じセッションで停止・通常再開した場合、フィールドの値は保たれます。再入室後は自分で再開します。転生と再開が重なる場合の順序や、残るデータの種類は転生と引き継ぎで確認できます。

練習問題

例のcountを転生後にも残すにはどの宣言をどう変えますか。

解答例を表示する解答例を閉じる

Program直下のprivate int count = 0;を[Persist] private int count = 0;に変えます。OnTickの中へ移す必要はありません。Persistを付ける場所はProgramのフィールドです。