「バグ・仕様情報」の編集履歴(バックアップ)一覧はこちら

バグ・仕様情報」(2014/02/08 (土) 15:05:24) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*バグ・仕様情報 #contents **ゲーム編 ***ゲーム起動直後に両手武器スキルが初期値に戻ってしまう。 ゲーム起動直後のロードは両手武器スキルが初期値(15)になります。 コンソール・メニュー・セルロード等をすると元に戻るので通常プレイには差し支えないんですが、 スクリプトでロード時に両手武器のスキルを参照するときに大変困ります。 スキル参照する前に以下のような処理を加えます。 Actor player = Game.GetPlayer() player.ModAV("TwoHanded",1) player.ModAV("TwoHanded",-1) 値が変動すると元に戻る性質を利用して直します。 **CK編 ***数値の仕様 符号付きshort型で-32767~32767扱えない数値が多いです。 商人の所持金だと32767を超えるお金を持つと正常に取引できなくなる(いくら売ってもお金が入らない)。 HPも32767以上は上がりません。 **Papyrus編 ***OnLoad() OnInit()の仕様 OnLoadはそのオブジェクトが読まれた時のイベント判定です。 OnInitがオブジェクトにつけるタイプは機能せず、クエストにつける場合はクエストスタート時の初回だけ機能します。 OnLoadイベントは、3Dオブジェクトの実体が「実際に画面に出現したとき」に呼ばれるイベントなので 3Dオブジェクトとしての実体がない Quest Scriptで呼ばれることはありません。 (例)  ◯ プレイヤーが存在するセルに、オブジェクトが入ってきた場合  ◯ オブジェクトが存在するセルにプレイヤーが入ってきた場合(ドアの出入り・ファストトラベルなど)  ◯ プレイヤーが所持しているオブジェクトを、地面に落とした時  ✕ プレイヤーがオブジェクトを取得したとき  ✕ プレイヤーが所持しているオブジェクトを、インベントリ内でプレビュー表示したとき // OnLoad()がうまく機能しなかったシチュエーションが思い当たらないので // どういったシチュエーションで機能しないのかを書いて頂けると嬉しいです。 // // アクターの時だと読まれない? ゲームロード時に駆動するイベントが使いたい場合はSkyrim1.6以降に追加されたOnPlayerLoadGame()を使ってください。 もしもプレイヤーがセルに入る度に確実にイベントを起こしたい場合はOnLoad()ではなくOnCellAttach()を使ってください。 ***HasKeyword()のバグ(仕様?) OnLoad OnInitとは逆に、HasKeyword()は、オブジェクトについている場合にしか機能しません。 NordRace.HasKeyword(ActorTypeNPC) ; ← 機能しません NordRaceActor.HasKeyword(ActorTypeNPC) ; ← 機能します ***Playidle()とSendAnimationEvent() どちらもモーションを呼ぶメソッドでplayidleはAnimationsから登録されたのを呼び出しますが、SendAnimationEvent()はAnim Eventsの中から直接呼び出します。 隠密のPerkで習得できるサイレントロールを例にすると、スニーク中に前方向+ダッシュキーで前転できます。 Conditionsの条件判定にかかわらず、両方のメソッドで呼び出す限りはスニーク中にしか使えません。 また、魔法や杖を装備している時に使えません。パークで習得する方は魔法や杖を装備していても使えます。 モーションが発動する何らかの条件はモーションそのものやモーションブレンド制御のBehaviorファイルではなく、内部的に定義されていると考えられます。 またモーションには優先度の設定があるみたいです。 attackStop(攻撃停止)、staggerStart(怯みモーション)みたいなのは優先度高いようです。 例えば攻撃中にモーションを割り込みたい場合はattackStopモーションで攻撃を止め、割り込みのモーションを再生します。 これらを使用することによりある程度のモーション制限は突破できます。 ***誰が殺したのかを取得するさいの仕様 死ぬ真っ最中のイベントOn DyingのakKiller, 死んだ直後のイベントOn DeathのakKiller, 死んでから誰が殺したかを取得するGetKiller()などの場合、 フォロワーがキルした場合もプレイヤーのキルの扱いになるのは仕様です。 キルしたのはフォロワーかプレイヤーを判別する方法は以下のとおり。 Scriptname Script名 extends activemagiceffect   Event OnHit(ObjectReference akAggressor,Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)   actor attacker = akAggressor as actor if (GetTargetActor().GetActorValue("Health")<=0 ) if attacker == player ;プレイヤー側の処理 debug.notification(" attacker is player") elseif (attacker.IsPlayerTeammate()) ;フォロワー側の処理 debug.notification(" attacker is teammate") endif endif EndEvent 殺される側にActiveMagicをつけて、OnHitイベントでターゲットのHPが0以下の時、攻撃したのはどちらかを判定してます。  
*バグ・仕様情報 #contents **ゲーム編 ***ゲーム起動直後に両手武器スキルが初期値に戻ってしまう。 ゲーム起動直後のロードは両手武器スキルが初期値(15)になります。 コンソール・メニュー・セルロード等をすると元に戻るので通常プレイには差し支えないんですが、 スクリプトでロード時に両手武器のスキルを参照するときに大変困ります。 スキル参照する前に以下のような処理を加えます。 Actor player = Game.GetPlayer() player.ModAV("TwoHanded",1) player.ModAV("TwoHanded",-1) 値が変動すると元に戻る性質を利用して直します。 **CK編 ***数値の仕様 符号付きshort型で-32767~32767扱えない数値が多いです。 商人の所持金だと32767を超えるお金を持つと正常に取引できなくなる(いくら売ってもお金が入らない)。 HPも32767以上は上がりません。 ***草の読み込みの仕様 新規に作った草はData/Meshes/Landscape/Grassに入れること。その他の場所では認識されない。 Nifに問題がありエラーを吐いてしまった場合、CKを閉じて再度起動し直さないとずっと見えない。 NiAlphaPropertyのEnable Blendingにはチェックを入れてはいけない。エラーの原因になる。 Transform>Applyをしておくこと。しないとエラーの原因になる。 **Papyrus編 ***OnLoad() OnInit()の仕様 OnLoadはそのオブジェクトが読まれた時のイベント判定です。 OnInitがオブジェクトにつけるタイプは機能せず、クエストにつける場合はクエストスタート時の初回だけ機能します。 OnLoadイベントは、3Dオブジェクトの実体が「実際に画面に出現したとき」に呼ばれるイベントなので 3Dオブジェクトとしての実体がない Quest Scriptで呼ばれることはありません。 (例)  ◯ プレイヤーが存在するセルに、オブジェクトが入ってきた場合  ◯ オブジェクトが存在するセルにプレイヤーが入ってきた場合(ドアの出入り・ファストトラベルなど)  ◯ プレイヤーが所持しているオブジェクトを、地面に落とした時  ✕ プレイヤーがオブジェクトを取得したとき  ✕ プレイヤーが所持しているオブジェクトを、インベントリ内でプレビュー表示したとき // OnLoad()がうまく機能しなかったシチュエーションが思い当たらないので // どういったシチュエーションで機能しないのかを書いて頂けると嬉しいです。 // // アクターの時だと読まれない? ゲームロード時に駆動するイベントが使いたい場合はSkyrim1.6以降に追加されたOnPlayerLoadGame()を使ってください。 もしもプレイヤーがセルに入る度に確実にイベントを起こしたい場合はOnLoad()ではなくOnCellAttach()を使ってください。 ***HasKeyword()のバグ(仕様?) OnLoad OnInitとは逆に、HasKeyword()は、オブジェクトについている場合にしか機能しません。 NordRace.HasKeyword(ActorTypeNPC) ; ← 機能しません NordRaceActor.HasKeyword(ActorTypeNPC) ; ← 機能します ***Playidle()とSendAnimationEvent() どちらもモーションを呼ぶメソッドでplayidleはAnimationsから登録されたのを呼び出しますが、SendAnimationEvent()はAnim Eventsの中から直接呼び出します。 隠密のPerkで習得できるサイレントロールを例にすると、スニーク中に前方向+ダッシュキーで前転できます。 Conditionsの条件判定にかかわらず、両方のメソッドで呼び出す限りはスニーク中にしか使えません。 また、魔法や杖を装備している時に使えません。パークで習得する方は魔法や杖を装備していても使えます。 モーションが発動する何らかの条件はモーションそのものやモーションブレンド制御のBehaviorファイルではなく、内部的に定義されていると考えられます。 またモーションには優先度の設定があるみたいです。 attackStop(攻撃停止)、staggerStart(怯みモーション)みたいなのは優先度高いようです。 例えば攻撃中にモーションを割り込みたい場合はattackStopモーションで攻撃を止め、割り込みのモーションを再生します。 これらを使用することによりある程度のモーション制限は突破できます。 ***誰が殺したのかを取得するさいの仕様 死ぬ真っ最中のイベントOn DyingのakKiller, 死んだ直後のイベントOn DeathのakKiller, 死んでから誰が殺したかを取得するGetKiller()などの場合、 フォロワーがキルした場合もプレイヤーのキルの扱いになるのは仕様です。 キルしたのはフォロワーかプレイヤーを判別する方法は以下のとおり。 Scriptname Script名 extends activemagiceffect   Event OnHit(ObjectReference akAggressor,Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)   actor attacker = akAggressor as actor if (GetTargetActor().GetActorValue("Health")<=0 ) if attacker == player ;プレイヤー側の処理 debug.notification(" attacker is player") elseif (attacker.IsPlayerTeammate()) ;フォロワー側の処理 debug.notification(" attacker is teammate") endif endif EndEvent 殺される側にActiveMagicをつけて、OnHitイベントでターゲットのHPが0以下の時、攻撃したのはどちらかを判定してます。  

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー