この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:12:00

タイトル: プレイヤーを非表示にする方法
SEOタイトル: UE5 でプレイヤー (Pawn / Character) を非表示にする全パターン

この記事の要点
  • Set Actor Hidden In Game = アクター全体を非表示(最も簡単)
  • Set Owner No See = 一人称視点で自分のメッシュだけ隠す典型パターン
  • Set Component Visibility = メッシュ単位の細かい制御
  • Set Actor Tick Enabled (false) = 描画と一緒に Tick も止めて重さを軽減
  • マルチプレイ対応: Replicate 設定に注意。Server で変更しないと他クライアントに反映されない

結論: 用途別の使い分け

やりたいこと推奨関数
アクター全体を完全に非表示にするSet Actor Hidden In Game
一人称視点で自分の体だけ隠すSet Owner No See on Mesh
メッシュだけ非表示・コリジョンは残すSet Visibility on SkeletalMeshComponent
頭だけ非表示(一人称)Bone Hidden In Game
非表示 + Tick も止めるHidden + Set Actor Tick Enabled
マルチで他クライアントから見えなくするServer 側で Hidden + Replicate

方法1: Set Actor Hidden In Game

最も単純。アクター全体(メッシュ・パーティクル・子コンポーネント全部)が描画されなくなります。コリジョンは残ります。

// C++
SetActorHiddenInGame(true);     // 非表示
SetActorHiddenInGame(false);    // 再表示
// Blueprint
Set Actor Hidden In Game
  Target:    Self
  New Hidden: True

方法2: 一人称視点で自分のメッシュだけ隠す (Set Owner No See)

FPS で「自分の腕は見えるが体は見えない」を実現する典型手法:

// MyCharacter.cpp
void AMyCharacter::BeginPlay()
{
    Super::BeginPlay();

    if (IsLocallyControlled())
    {
        // 自分視点では 3 人称メッシュを隠す
        GetMesh()->SetOwnerNoSee(true);

        // 一人称メッシュは自分だけに見せる
        FirstPersonMesh->SetOnlyOwnerSee(true);
        FirstPersonMesh->SetOwnerNoSee(false);
    }
}
関数動作
SetOwnerNoSee(true)所有者プレイヤーには見えない、他は見える
SetOnlyOwnerSee(true)所有者プレイヤーだけに見える
SetVisibility(false)すべてのプレイヤーに見えない
SetHiddenInGame(true)SetVisibility と同等(古い API)

方法3: コンポーネント単位の Visibility

// メッシュコンポーネントだけ非表示
GetMesh()->SetVisibility(false);

// 子コンポーネントも一緒に
GetMesh()->SetVisibility(false, /*bPropagateToChildren=*/true);

// 帽子コンポーネントだけ非表示
HatComponent->SetVisibility(false);
// Blueprint
Set Visibility
  Target:                 Mesh (SkeletalMeshComponent)
  New Visibility:         False
  Propagate To Children:  True

方法4: ボーン単位で非表示

「頭だけ消す」「武器を持ってる手だけ消す」など部分的に隠す:

// 頭のボーンを非表示
GetMesh()->HideBoneByName(TEXT("head"), EPhysBodyOp::PBO_None);

// 再表示
GetMesh()->UnHideBoneByName(TEXT("head"));

// 名前で複数指定
TArray<FName> Bones = { TEXT("head"), TEXT("neck_01") };
for (const FName& B : Bones)
{
    GetMesh()->HideBoneByName(B, EPhysBodyOp::PBO_None);
}

方法5: 非表示 + Tick 停止で軽量化

長時間非表示にするなら Tick も止めると CPU 負荷が下がります:

void AMyCharacter::SetCharacterEnabled(bool bEnabled)
{
    SetActorHiddenInGame(!bEnabled);
    SetActorEnableCollision(bEnabled);
    SetActorTickEnabled(bEnabled);

    // アニメーション Tick も止める
    if (USkeletalMeshComponent* M = GetMesh())
    {
        M->SetComponentTickEnabled(bEnabled);
    }

    // 入力も無効化
    if (APlayerController* PC = Cast<APlayerController>(GetController()))
    {
        if (bEnabled)
            EnableInput(PC);
        else
            DisableInput(PC);
    }
}

方法6: マテリアル不透明度で消す(演出向け)

// マテリアルの透明度パラメータで滑らかに消す
UMaterialInstanceDynamic* DynMat = GetMesh()->CreateDynamicMaterialInstance(0);
DynMat->SetScalarParameterValue(TEXT("Opacity"), 0.0f);

// タイムラインで徐々にフェード
void AMyChar::Fade(float Alpha)
{
    if (DynMat)
        DynMat->SetScalarParameterValue(TEXT("Opacity"), Alpha);
}

マルチプレイヤーでの注意点

Hidden 状態は自動で Replicate されないことがあります。次の対応が必要です:

// MyCharacter.h
UPROPERTY(ReplicatedUsing=OnRep_HiddenState)
bool bIsHidden;

UFUNCTION()
void OnRep_HiddenState();

// MyCharacter.cpp
void AMyCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(AMyCharacter, bIsHidden);
}

void AMyCharacter::ServerHide()
{
    if (HasAuthority())
    {
        bIsHidden = true;
        SetActorHiddenInGame(true);
        OnRep_HiddenState();  // サーバでも適用
    }
}

void AMyCharacter::OnRep_HiddenState()
{
    SetActorHiddenInGame(bIsHidden);
}

影だけ残す (Hidden Shadow)

キャラ本体は非表示でも、影 (シャドウ) は表示し続けたい場合:

USkeletalMeshComponent* M = GetMesh();
M->SetVisibility(false);
M->bCastHiddenShadow = true;  // 隠れていても影を投影

カメラから一定距離で自動非表示

void AMyCharacter::Tick(float Delta)
{
    Super::Tick(Delta);

    APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
    if (!PC || !PC->PlayerCameraManager) return;

    const float Dist = FVector::Dist(
        GetActorLocation(),
        PC->PlayerCameraManager->GetCameraLocation());

    SetActorHiddenInGame(Dist < 100.0f);  // 1m 以内なら非表示
}

よくあるミス

  • Visibility を切ったのに見える → 子コンポーネントには伝播しないので bPropagateToChildren=true を指定
  • マルチで自分だけ消える / 他人だけ消える → SetOwnerNoSee と SetOnlyOwnerSee を混同
  • パーティクルが残る → Niagara/Cascade は Visibility 別管理。Deactivate() も呼ぶ
  • 影が残る → 仕様。bCastHiddenShadow = false で消える

FAQ

Q: 完全に「いない」状態にしたい
A: SetActorHiddenInGame(true) + SetActorEnableCollision(false) + SetActorTickEnabled(false) の 3 点セットで実現。

Q: 死亡演出で消す → 復活したい
A: Destroy() ではなく Hidden で隠せば、後で SetActorHiddenInGame(false) で復活可能。

Q: Hidden In Game とエディタの非表示の違い
A: エディタの目玉アイコンは bHiddenInEditor でゲームには影響なし。実行時に隠すのは Hidden In Game。