スニーク中に透明になります。透明度は自由に設定することができ、隠密スキル依存にすることもできます。
指輪や魔法といったものは一切使いません。また、透明度をかえる以外のことは一切しません。
作ったきっかけ
Additional Encountersのデバッグをしている最中に、隠密状態でダンジョンにやってくる半透明の敵を見ながら、プレイヤーも半透明にしたいと思いました。探してみたのですが、指輪が要るとかスニーク自体をいじるとかはあれど、いたってシンプルなものが見つからなかったので、試しに作ってみました。
技術的な話
アクターを透明にするにはSetAlpha関数を使います。これ自体は全く難しくありません。問題はタイミングです。
アクターのスニーク状態を監視する方法ですが、イベント駆動と常時監視の2つを組み合わせます。
プレイヤーに限って言えば、スニークする時はスニークキーを押すので、キーを監視してOnKeyDownイベントを捕捉すればいいです。注意するのは、キーを押す以外にもPapyrusから強制的にスニーク状態にさせられることもあるため、これだけではだめです。NPCはキーを押してスニークするわけではありませんので、この方法は使えません。
常時監視は、プレイヤーに限れば、クエストを作ってReferenceAliasに入れたらそれでOKです。あとは適当な間隔でOnUpdateイベントを発動させればいいだけです。NPCの場合はこの方法しかありません。NPCの場合はスペルを配ってMagic Effectで処理することになります。NPCは死ぬこともありますから、Magic Effectが切れた時の処理をきちんとしないと、死体が透明のままになったりするので注意です。
両者を組み合わせる場合に注意すべき点があります。キー監視の方でイベントを捕捉した場合、その場で処理するのではなく、RegisterForSingleUpdate関数を使ってOnUpdateイベントを発動させる方が無難です。アクターに対する処理が2か所に分散していると、処理内容によっては排他制御が必要になってくるので、作り方が甘いとアクターの状態が狂ってしまいます。
常時監視をする上で、スクリプトでループを回すことに抵抗を感じる方がいるかもしれません。CKでスペルを作り、紐づけるMagic Effectの発動条件に「対象がスニーク中である」とすれば、スニーク中のみMagic Effectが発動するスペルになります。これは一見するとスクリプトを使わず効率が良さそうに見えますが、実際は発動条件のチェックが毎秒発動しているので、スクリプトと大してかわりません。むしろ、スクリプトの方が、必要な場合は即時発動、しばらく必要ないことがわかりきっている場合は30秒後、といった具合に柔軟に設定できるので、スクリプトの方がよかったりします。
アニメーションイベントを監視する方法もありました。CK Wikiのこのページに書かれているMovement & World Interaction Eventsのところです。この方法だとキーを押したかどうかではなく、スニークの体勢に入ったかどうかでイベントが発火するので、常時監視は不要となります。ただ、スニークに入った・抜けた以外でもイベントが発火しまくるのが問題かもしれません。