メインコンテンツまでスキップ

ランタイム制御

ゲーム実行中にKawaiiPhysicsを動的に制御する方法を説明します。

パラメータの動的変更

Blueprintから

Animation Blueprintの変数を通じてパラメータを変更できます。

// Animation Blueprint内
UPROPERTY(BlueprintReadWrite)
float DynamicDamping = 0.1f;

C++から

// AnimInstanceを取得してパラメータを変更
UAnimInstance* AnimInstance = Mesh->GetAnimInstance();
// カスタムAnimInstanceクラスでパラメータを公開

有効/無効の切り替え

一時停止

UPROPERTY()
bool bEnabled = true;

使用例

  • カットシーン中は無効化
  • ポーズメニュー中は無効化
  • LODに応じて無効化

外部力の動的適用

SetExternalForce

// 爆発の衝撃
void ApplyExplosionForce(FVector ExplosionLocation, float Force)
{
FVector Direction = (BoneLocation - ExplosionLocation).GetSafeNormal();
SetExternalForce(Direction * Force);
}

時間経過で減衰

void Tick(float DeltaTime)
{
// 外部力を徐々に減衰
CurrentExternalForce *= FMath::Exp(-DecayRate * DeltaTime);
SetExternalForce(CurrentExternalForce);
}

リセット

物理状態を初期状態に戻します。

// 物理状態をリセット
ResetDynamics();

使用例

  • テレポート後
  • アニメーション遷移時
  • リスポーン時

イベント連携

AnimNotifyサポート

バージョン情報

v1.17.0で追加

KawaiiPhysics専用のAnimNotifyが提供されています。

AnimNotify_KawaiiPhysics_ResetDynamics

物理状態をリセットします。テレポートやアニメーション遷移時に使用します。

AnimNotify_KawaiiPhysics_SetExternalForce

外部力を設定します。ジャンプ開始時の風圧などに使用します。

AnimNotifyState: Set Alpha

バージョン情報

v1.20.0で追加

アニメーション中に物理のブレンド率を動的に変更できるAnimNotifyStateです。

アニメーションタイムライン:
[=======================================]
[--Set Alpha: 0.0 -> 1.0--]
↑ ↑
開始(物理OFF) 終了(物理ON)

使用例:

  • 特定のアニメーション中だけ物理を無効化
  • アニメーション遷移時のスムーズなブレンド
  • カットシーン中の制御

カスタムAnimNotify

Anim Notifyから物理パラメータを変更:

void UAnimNotify_KPForce::Notify(...)
{
// ジャンプ開始時に外部力を適用
KawaiiPhysics->SetExternalForce(FVector(0, 0, 100));
}

ゲームプレイイベント

// ダメージを受けた時
void OnDamageReceived(float Damage, FVector HitDirection)
{
// 衝撃を物理に反映
float ImpactForce = Damage * 10.0f;
KawaiiPhysics->SetExternalForce(HitDirection * ImpactForce);
}

Blueprint Function Library

よく使う操作をライブラリ化すると便利です。

UCLASS()
class UKawaiiPhysicsLibrary : public UBlueprintFunctionLibrary
{
UFUNCTION(BlueprintCallable)
static void ApplyImpulse(AActor* Actor, FVector Impulse);

UFUNCTION(BlueprintCallable)
static void ResetAllKawaiiPhysics(AActor* Actor);
};

詳しくは APIリファレンス を参照してください。