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

新しい石碑(スクリプト割り当て済み)の設置 - 簡単な Papyrus サンプル群

最終更新: 2015-04-02 (木) 21:36:12 (2275d)

MOD 本体

fileExampleSetObject.zip

  • ExampleSetObject.esp
  • Scripts
    • ExampleSetObject.pex
    • Source
      • ExampleSetObject.psc

インストール方法

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

アンインストール方法

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

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

概要

このサンプルは「新しい石碑の設置」の発展です。

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

coc example

石碑をアクティベートすると石碑が増えます。設置場所は、場所は部屋内のどこかです。

新しい石碑の設置」では、新しく設置された石碑にはスクリプトは設定されておらず、アクティベートしても何も起こりませんでした。

なぜかというと設置した新しい石碑は、スクリプトを持っていない標準の石碑だからです。

本サンプルは、一度アクティベートした石碑は動作しなくなり、新しく設置された石碑をアクティベートしていくことで石碑が増えていくものになっています。

ObjectReference.PlaceAtMe メソッドでオブジェクトを生成してからスクリプトを割り当てることはできません。

スクリプトをもったオブジェクトを動的に生成するには、スクリプトを割り当て済みのベースオブジェクトを Object Window で作成しておく必要があります。

object_window.png

以上の状態を作り出すには以下の操作を行います。

  • ベースである WETempActivator を右クリックし Duplicate を選択し「WETempActivator」ベースオブジェクトのコピーを生成する。
  • コピーしてできたオブジェクトを右クリックし Edit を選択し「Activator」ダイアログを表示する。
    • ID を「ExampleSetObjectActivator」に設定する。
    • Scripts にスクリプトを追加する。
  • 設定後のダイアログのスクリーンショットを以下に示す。
example_set_object_activator.png

「ExampleSetObjectActivator」ベースオブジェクトを作ったら「WETempActivator」の代わりにこの「ExampleSetObjectActivator」をセルに配置します。

スクリプト概要(ExampleSetObject)

Scriptname ExampleSetObject extends ObjectReference  

bool activated = false

Event OnActivate(ObjectReference akActionRef)
	if (activated)
		Debug.Notification("Activated")
	else
		activated = true

		float newx = -1000 + 2000 * Utility.RandomFloat()
		float newy = -1000 + 2000 * Utility.RandomFloat()

		Debug.Notification("Activate ... new object (" + newx + ", " + newy + ")")

		ObjectReference newObject = PlaceAtMe(GetBaseObject(), 1)
		newObject.SetPosition(newx, newy, z)
	endIf
endEvent

ヒント

GetBaseObject で設置物を決定

ObjectReference.PlaceAtMe でオブジェクトを生成する際に ObjectReference.GetBaseObject を使っています。

これがスクリプト割り当て済みの「ExampleSetObjectActivator」ベースオブジェクトを返します。

こうすることでスクリプト割り当て済みの石碑をコピーして作り出すことができます。

1度石碑の生成に使用した石碑と、新しく生成された石碑を区別するために activated 変数を設けて動作を分けています。

疑問点

「WETempActivator」ベースオブジェクトのコピーの残骸について

「WETempActivator」を Duplicate すると「WETempActivatorDUPLICATE001」というものができ、編集しても残り続けます。削除しても消えません。

何かに影響しないか、また、しっかりと消す方法がないのか疑問として残っています。