タイトル: プレイヤーを非表示にする方法
SEOタイトル: UE5 でプレイヤー (Pawn / Character) を非表示にする全パターン
| この記事の要点 |
|
結論: 用途別の使い分け
| やりたいこと | 推奨関数 |
|---|---|
| アクター全体を完全に非表示にする | 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 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(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& 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。