タイトル: カメラを傾ける角度を制限させる方法
SEOタイトル: UE5 カメラ傾き角度制限完全ガイド (Pitch Min/Max)
| この記事の要点 |
|
カメラ Pitch 制限の基本
UE5 (Unreal Engine 5) の三人称・一人称ゲームで、マウスやスティック操作によるカメラの上下回転 (Pitch) を一定角度で制限する方法を解説します。デフォルトでは -89° 〜 +89° まで回転可能ですが、これだと真下や真上まで向けてしまい、不自然な視界になります。
方法1: PlayerController の View Pitch を直接編集
最も標準的な方法。APlayerController にはViewPitchMin / ViewPitchMax プロパティが用意されています。
Blueprint での設定
- 自作 PlayerController BP を開く(無ければ Blueprints > New > Blueprint Class > PlayerController)
- Class Defaults を開く
- 検索バーに「Pitch」と入力
- Player Camera Manager Class 内に Inputs (legacy) のViewPitchMin / Max が存在しないので、PlayerCameraManager 側で設定する
- または PlayerController の InputPitchScale / Yaw / Roll でスケール調整
PlayerCameraManager を派生して設定
// MyPlayerCameraManager.h
#pragma once
#include "CoreMinimal.h"
#include "Camera/PlayerCameraManager.h"
#include "MyPlayerCameraManager.generated.h"
UCLASS()
class AMyPlayerCameraManager : public APlayerCameraManager
{
GENERATED_BODY()
public:
AMyPlayerCameraManager();
};
// MyPlayerCameraManager.cpp
AMyPlayerCameraManager::AMyPlayerCameraManager()
{
ViewPitchMin = -80.0f;
ViewPitchMax = 80.0f;
ViewYawMin = 0.0f; // 360° 回転制限なし用は変えない
ViewYawMax = 359.999f;
ViewRollMin = 0.0f;
ViewRollMax = 359.999f;
}
そして PlayerController で指定
// MyPlayerController.cpp
#include "MyPlayerCameraManager.h"
AMyPlayerController::AMyPlayerController()
{
PlayerCameraManagerClass = AMyPlayerCameraManager::StaticClass();
}
方法2: BeginPlay で動的に制限
動的にゲーム中で制限値を変えたい場合(例: スコープを覗いたら制限を狭める):
void AMyPlayerController::BeginPlay()
{
Super::BeginPlay();
if (PlayerCameraManager)
{
PlayerCameraManager->ViewPitchMin = -60.0f;
PlayerCameraManager->ViewPitchMax = 60.0f;
}
}
// 通常モード
void AMyPlayerController::SetNormalPitchLimits()
{
if (PlayerCameraManager)
{
PlayerCameraManager->ViewPitchMin = -80.0f;
PlayerCameraManager->ViewPitchMax = 80.0f;
}
}
// スコープ覗き
void AMyPlayerController::SetScopePitchLimits()
{
if (PlayerCameraManager)
{
PlayerCameraManager->ViewPitchMin = -30.0f;
PlayerCameraManager->ViewPitchMax = 30.0f;
}
}
Blueprint 版
Event BeginPlay
→ Get Player Camera Manager
→ Set View Pitch Min (-80)
→ Set View Pitch Max (80)
方法3: SpringArm + Camera 構成
三人称ゲームで一般的な SpringArm + Camera 構成では、追加で以下の設定が必要:
| コンポーネント | 設定項目 | 値 |
|---|---|---|
| SpringArm | Use Pawn Control Rotation | true |
| SpringArm | Inherit Pitch / Yaw / Roll | 個別判断 (通常 Pitch のみ) |
| Camera | Use Pawn Control Rotation | false (SpringArm 経由なので) |
| Pawn | Use Controller Rotation Pitch | false (Pawn を回さない) |
| Pawn | Use Controller Rotation Yaw | true (Pawn の向きは Yaw 追従) |
これで Controller の RotationInput が SpringArm の Pitch のみ反映され、PlayerCameraManager の ViewPitchMin/Max で制限が効きます。
方法4: Enhanced Input で入力段階制限
UE5 標準の Enhanced Input なら Input Modifier で値を制限する方法もあります:
// Input Action: IA_Look (Vector2D, X=Yaw, Y=Pitch)
// Input Mapping Context で
// IA_Look の Modifier に "Clamp" や "DeadZone" を追加
// Trigger で Pitch のみ範囲制限したい場合
// → 自作 UInputModifier クラスで実装
UCLASS()
class UInputModifierClampPitch : public UInputModifier
{
GENERATED_BODY()
protected:
virtual FInputActionValue ModifyRaw_Implementation(
const UEnhancedPlayerInput* PlayerInput,
FInputActionValue CurrentValue,
float DeltaTime) override
{
FVector2D V = CurrentValue.Get<FVector2D>();
V.Y = FMath::Clamp(V.Y, -1.0f, 1.0f);
return FInputActionValue(V);
}
};
First Person vs Third Person の違い
| 形式 | 推奨 Pitch 範囲 | 備考 |
|---|---|---|
| FPS | -89° 〜 +89° | 地面・天井ギリギリまで見られる |
| FPS スコープ | -30° 〜 +30° | 感度低下と組み合わせ |
| TPS (肩越し) | -60° 〜 +70° | カメラの突き抜けを考慮 |
| 俯瞰 (見下ろし) | -90° 固定 or -80° 〜 -60° | RTS / Diablo 風 |
| レーシング | -20° 〜 +20° | 視界中央を維持 |
マウス感度 (Sensitivity) と組み合わせ
// PlayerController の Input* Scale
APlayerController* PC = GetController();
PC->InputPitchScale_DEPRECATED = 1.0f; // (UE5 では非推奨、Enhanced Input 推奨)
// Enhanced Input で感度設定
// Input Modifier "Scalar" を 0.5 等にして感度低下
// スコープ時感度
const float ZoomSensitivity = 0.3f;
PC->InputModifiers.Apply(ZoomSensitivity);
マルチプレイヤーでの注意
サーバ・クライアント両方で Pitch 制限が同じである必要があります。PlayerController はクライアント側に存在しますが、Pawn の Rotation はサーバが権威を持つので、不一致でカメラが飛ぶことがあります:
// Pawn の ControlRotation を Replicate する場合
DOREPLIFETIME_CONDITION(AMyCharacter, RemoteViewPitch,
COND_SkipOwner);
// 制限値はクライアント・サーバ両方で同じに
AMyPlayerCameraManager::AMyPlayerCameraManager()
{
ViewPitchMin = -80.0f;
ViewPitchMax = 80.0f;
}
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| 制限が効かない | PlayerCameraManager 未差し替え | PlayerController で PlayerCameraManagerClass を設定 |
| 真上・真下を向ける | ViewPitchMax/Min がデフォルト 89° | BeginPlay で再設定 or PlayerCameraManager 派生 |
| SpringArm が回らない | Use Pawn Control Rotation off | true に |
| キャラ本体も上下に傾く | Pawn の Use Controller Rotation Pitch ON | false に |
| 感度がおかしい | Enhanced Input Modifier 未設定 | Scalar / DeadZone を追加 |
FAQ
Q: 動的に制限を変えるとカクッと飛ぶ
A: 現在の Pitch が新しい範囲外だと即クランプされます。Lerp で滑らかに補間してから制限を変えてください。
Q: 第三者視点で壁にカメラがめり込む
A: SpringArm の Do Collision Test を true、Camera Lag を有効化、Probe Channel を Camera に設定。
Q: スティック入力では制限したいが、シネマカメラでは制限なしにしたい
A: シネマ用は別 PlayerCameraManager または Set View Target with Blend で Cinematic Camera Actor に切り替え。