Papyrus による世界の創造 - Skyrim MOD 制作

定期処理の実現 - 簡単な Papyrus サンプル群

最終更新: 2015-04-02 (木) 21:36:11 (2493d)

MOD 本体

fileExampleContinuousProcess.zip

  • ExampleContinuousProcess.esp
  • Scripts
    • ExampleContinuousProcess.pex
    • Source
      • ExampleContinuousProcess.psc

インストール方法

解凍して Data フォルダにコピーもしくは NMM での導入も可能です。

アンインストール方法

アンインストールは、導入したファイルを全て削除すれば完了です。Data フォルダを「Example」で検索すれば該当ファイルが全て検索できるので簡単です。

NMM で導入した場合は、NMM が全部やってくれます。

概要

CenterOnCell - coc(セル移動) コンソールコマンドにて部屋に行きます。

coc example

時間の経過と共に画面左上に 1, 2, 3, 4 と数字がカウントアップされていくはずです。

石碑に ExampleContinuousProcess スクリプトが割り当てられており、そのスクリプトがカウントを表示しています。

スクリプト概要(Example)

Scriptname ExampleContinuousProcess extends ObjectReference  

int count = 0

Event OnCellLoad()
	RegisterForSingleUpdate(1)
endEvent

Event OnUpdate()
	count = count + 1
	Debug.Notification(count)

	RegisterForSingleUpdate(5)
endEvent

ポイント

RegisterForSingleUpdate による OnUpdate の連鎖

定期処理の実現方法は以下の通りです。

他のセルへ移動した際の動作

起動するには石碑が設置してあるセルへ来る必要がありますが、それ以降は他のセルへ移動しても定期処理は動き続けます。

セルにいるときのみ限定で動かす

定期処理の起動条件と実行継続条件を変えます。

起動条件ObjectReference.OnCellAttach
実行継続条件Game.GetPlayer().GetParentCell() == GetParentCell()

起動条件については以下のサンプル

を参考にしてください。

これでプレイヤーがセルに入ってくる度に起動されるようになります。

実行継続条件は、

  • プレイヤーと石碑が同じセルに居る場合'

という条件を増やしています。

この2つを変更することで、同セル内にいるときのみ限定で動かすことができるようになります。

以下、スクリプトの事例です。

Scriptname ExampleContinuousProcess extends ObjectReference  

int count = 0

Event OnCellLoad()
	RegisterForSingleUpdate(1)
endEvent

Event OnUpdate()
	if (akActionRef == Self && Game.GetPlayer().GetParentCell() == GetParentCell())
	 	count = count + 1
	 	Debug.Notification(count)

	 	RegisterForSingleUpdate(5)
	endIf

endEvent

CenterOnCell - coc(セル移動) コンソールコマンドで部屋を行き来してみてください。

coc example
coc qasmoke
coc example

example の部屋にいるときだけカウントがアップしていくのがわかると思います。