Translate

2025年2月1日土曜日

動くマネキン(怪奇大作戦じゃないよ)

あなたの家のマネキン

気が付いたら少し移動している

そんなことはありませんか?

 

動くマネキンはSkyrimの日常坐臥にちじょうざがですが、何とかしようと思います。

まずここを読む(装備ロストは当記事では触れない)

原因については詳細に描かれていますね。

概ねAIが原因と言っても過言ではない気がします。

参照先の記事に則ってpapyrusを書き直し、いったん上手くいったかに見えましたが

睡眠、待機(高速移動、収監)などでOnLoadもOnCellLoadも動かないので

マネキンが移動してしまう。

マネキンの前で1時間待機してみる

何も起きていないように見えるが・・・

マネキンのコリジョンがおかしくなってる(◎_◎;)

一回外に出て戻ってみるとマネキンが移動していることが解る(2体は行方不明)

papyrusログを見ると、待機後に

[02/01/2025 - 04:59:56PM] VM is freezing...
[02/01/2025 - 04:59:56PM] VM is frozen
[02/01/2025 - 04:59:56PM] Saving game...
[02/01/2025 - 04:59:57PM] VM is thawing...

で終わっており特にOnLoadもOnCellLoadも呼び出されていない。

かつAIが勝手に有効になっているのではないかと推測。

まぁなんで待機でAIが有効になってしまうのかを突き詰めても仕方ないので

この事象に対応できる方法がないか考えてみます。

ここを読んで使えるものが無いか考えました。

OnUpdateGameTimeが使えそうな感じがします。

このイベントハンドラは単体では使用できず、RegisterForUpdateGameTimeと

組み合わせて使うことで時間経過によるイベントを受け取ることができます。

Event OnInit()
	RegisterForUpdateGameTime(1.0)
EndEvent

Event OnUpdateGameTime()
	self.EnableAI(false) ; ①
	Utility.Wait(0.1)
	self.MoveToMyEditorLocation() ; ②
EndEvent

こういう風に記述してみました。

初期処理で1時間(1.0)毎にイベントを飛ばすように設定しています。

イベントを受け取った場合

①AIを無効

②自分の初期位置に戻る

としています。 

ちなみに睡眠、待機(高速移動、収監)で1時間以上経過した場合でも

飛んでくるイベントは1回だけのようです。

(4時間待機しても4回じゃなく1回だけ飛んできます)

しかし、これでは家の外で時間経過した場合でも1時間毎にイベントが

発生してしまいます。

それでは負荷が高くなってしまうので自分と同じセルに存在する場合のみ

イベント処理するようにしてみます。

Event OnInit()
	RegisterForUpdateGameTime(1.0)
EndEvent

Event OnUpdateGameTime()
	If (self.GetParentCell() == Game.GetPlayer().GetParentCell())
		self.EnableAI(false) ; ①
		Utility.Wait(0.1)
		self.MoveToMyEditorLocation() ; ②
	EndIf
EndEvent

これで自分と同じセルに存在する場合のみ

①AIを無効

②自分の初期位置に戻る

が動き、それ以外は空振りするようになるので負荷は下がります。

1時間毎にイベント飛ばすところは変わらないので100%ではないですが。

それでは実証

マネキンの前で1時間待機してみる。

さっきと同じように見た目は変わっていない。

お、コリジョンは残ってる。

一回外に出て戻ってきてみても位置は変わっていない。

成功のようです。

[02/01/2025 - 08:14:31PM] VM is freezing...
[02/01/2025 - 08:14:31PM] VM is frozen
[02/01/2025 - 08:14:31PM] Saving game...
[02/01/2025 - 08:14:31PM] VM is thawing...
[02/01/2025 - 08:14:33PM] Debug:OnUpdateGameTime = [FE05F35B]
[02/01/2025 - 08:14:33PM] Debug:OnUpdateGameTime = [FE05F307]
[02/01/2025 - 08:14:33PM] Debug:OnUpdateGameTime = [FE05F04C]

イベントハンドラも正しく動いていそうです。

念のため、外で1時間待機してみました。

[02/01/2025 - 08:15:12PM] VM is freezing...
[02/01/2025 - 08:15:12PM] VM is frozen
[02/01/2025 - 08:15:13PM] Saving game...
[02/01/2025 - 08:15:13PM] VM is thawing...

デバッグ文が出ていないので外で待機した場合はちゃんと空振りしているようです。

これで問題は解決したようですね。

よかったよかった😄


0 件のコメント:

コメントを投稿