Unreal Engine ゲーム開発完全教科書(初級~中級)まとめてみました。
目次
Unreal Engineの基礎知識
開発環境のセットアップ
エディタの使い方とインターフェース
Blueprint プログラミング入門
C++ プログラミング基礎
レベルデザインの基本
マテリアルとテクスチャ
アニメーションシステム
UI/UXデザイン
パフォーマンス最適化
プロジェクトの完成と公開
1. Unreal Engineの基礎知識
Unreal Engineとは
Unreal Engine(UE)は、Epic Gamesが開発したゲームエンジンです。プロレベルのゲーム開発から個人の趣味まで、幅広く利用されています。
主な特徴
無料で利用可能:商用利用でも一定の売上まで無料
高品質なグラフィックス:リアルタイムレイトレーシング対応
Blueprint システム:プログラミング不要でゲームロジックを作成
C++ サポート:本格的なプログラミングも可能
マルチプラットフォーム:PC、Console、Mobile、VR対応
バージョンについて
現在の最新版はUE5です。この教科書では主にUE5を基準に説明しますが、UE4でも応用できる内容となっています。
2. 開発環境のセットアップ
システム要件
最小要件:
OS: Windows 10 64-bit / macOS 10.14.6 / Ubuntu 18.04
メモリ: 8GB RAM
ストレージ: 100GB以上の空き容量
GPU: DirectX 11対応
推奨要件:
メモリ: 32GB RAM
GPU: RTX 3070以上
SSD ストレージ
インストール手順
Epic Games Launcherのダウンロード
Epic Games公式サイトからダウンロード
アカウント作成(無料)
Unreal Engineのインストール
Launcherから「Unreal Engine」タブを選択
最新版をインストール(約15GB)
追加コンポーネント
Visual Studio(C++開発用)
Android Studio(モバイル開発用)
初回起動とプロジェクト作成
1. Epic Games Launcherを起動
2. 「Unreal Engine」→「起動」
3. 新規プロジェクト作成
- テンプレート:Third Person(初心者推奨)
- プロジェクト設定:Blueprint
- プロジェクト名:MyFirstGame3. エディタの使い方とインターフェース
メインインターフェース
Unreal Editorは以下の主要なパネルで構成されています:
ビューポート(Viewport)
3Dシーンの表示・編集エリア
カメラの移動:右クリック+WASD
オブジェクトの選択:左クリック
複数選択:Ctrl+左クリック
アウトライナー(World Outliner)
レベル内のすべてのオブジェクトのリスト
階層構造の管理
オブジェクトの表示/非表示切り替え
詳細パネル(Details Panel)
選択したオブジェクトのプロパティ表示
パラメータの調整
コンポーネントの追加/削除
コンテンツブラウザ(Content Browser)
アセットの管理
マテリアル、テクスチャ、サウンドなどの保存場所
インポート/エクスポート機能
基本操作
オブジェクトの配置
コンテンツブラウザからアセットを選択
ビューポートにドラッグ&ドロップ
Transform ツールで位置・回転・スケールを調整
Transform ツール
移動(Move):W キー
回転(Rotate):E キー
スケール(Scale):R キー
ビューポートナビゲーション
・カメラ移動:右クリック + WASD
・ズーム:マウスホイール
・パン:中クリック + ドラッグ
・フォーカス:F キー(選択オブジェクトにフォーカス)4. Blueprint プログラミング入門
Blueprintとは
Blueprintは、ビジュアル スクリプティング システムです。プログラミングの知識がなくても、ノードを繋げることでゲームロジックを作成できます。
Blueprint の種類
Level Blueprint:特定のレベル専用のロジック
Class Blueprint:再利用可能なオブジェクトクラス
Function Libraries:共通関数の集合
Macros:複雑なノード群をまとめたもの
最初のBlueprint作成
Player Controllerの作成例
1. コンテンツブラウザで右クリック
2. 「Blueprint Class」を選択
3. 「Pawn」を選択
4. 名前を「MyPlayer」に設定基本的な移動システム
Event Graph での設定:
Event BeginPlay
└─ Set Max Walk Speed (600.0)
InputAxis MoveForward
├─ Scale: Axis Value
└─ Add Movement Input
└─ World Direction: (1, 0, 0)
InputAxis MoveRight
├─ Scale: Axis Value
└─ Add Movement Input
└─ World Direction: (0, 1, 0)変数とイベント
変数の作成
1. Variables セクションで「+」をクリック
2. 変数名:Health
3. 変数タイプ:Float
4. デフォルト値:100.0
5. 「Instance Editable」にチェック(インスペクターで編集可能)カスタムイベント
Event Graph での Health システム例:
Custom Event: TakeDamage
├─ Input: Damage (Float)
└─ Set Health
├─ Health - Damage
└─ Branch
├─ Condition: Health <= 0
├─ True: Destroy Actor
└─ False: Print String ("Health: " + Health)実践例:シンプルなジャンプ機能
InputAction Jump
├─ Pressed: Jump
└─ Released: Stop Jumping
Component: Character Movement
├─ Jump Z Velocity: 600.0
├─ Air Control: 0.2
└─ Gravity Scale: 1.755. C++ プログラミング基礎
C++開発環境の準備
Visual Studioの設定
1. Visual Studio 2019/2022をインストール
2. C++によるゲーム開発ワークロードを選択
3. Windows 10 SDKを含める新しいC++クラスの作成
1. エディタで「Tools」→「New C++ Class」
2. 親クラスを選択(例:Pawn)
3. クラス名:MyPawn
4. 「Create Class」をクリック基本的なC++クラスの構造
ヘッダーファイル(MyPawn.h)
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "MyPawn.generated.h"
UCLASS()
class MYFIRSTGAME_API AMyPawn : public APawn
{
GENERATED_BODY()
public:
AMyPawn();
protected:
virtual void BeginPlay() override;
// コンポーネント
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class UStaticMeshComponent* MeshComponent;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class UCameraComponent* CameraComponent;
// 変数
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float MovementSpeed = 100.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Health")
float MaxHealth = 100.0f;
UPROPERTY(BlueprintReadOnly, Category = "Health")
float CurrentHealth;
public:
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// カスタム関数
UFUNCTION(BlueprintCallable, Category = "Health")
void TakeDamage(float DamageAmount);
UFUNCTION(BlueprintPure, Category = "Health")
float GetHealthPercentage() const;
private:
void MoveForward(float Value);
void MoveRight(float Value);
};CPPファイル(MyPawn.cpp)
#include "MyPawn.h"
#include "Components/StaticMeshComponent.h"
#include "Camera/CameraComponent.h"
#include "Components/InputComponent.h"
#include "Engine/Engine.h"
AMyPawn::AMyPawn()
{
PrimaryActorTick.bCanEverTick = true;
// コンポーネントの作成
MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
RootComponent = MeshComponent;
CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));
CameraComponent->SetupAttachment(RootComponent);
CameraComponent->SetRelativeLocation(FVector(-200.0f, 0.0f, 100.0f));
// 初期化
CurrentHealth = MaxHealth;
}
void AMyPawn::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogTemp, Warning, TEXT("MyPawn has spawned!"));
}
void AMyPawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 入力バインディング
PlayerInputComponent->BindAxis("MoveForward", this, &AMyPawn::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AMyPawn::MoveRight);
}
void AMyPawn::MoveForward(float Value)
{
if (Value != 0.0f)
{
FVector Direction = GetActorForwardVector();
AddMovementInput(Direction, Value);
}
}
void AMyPawn::MoveRight(float Value)
{
if (Value != 0.0f)
{
FVector Direction = GetActorRightVector();
AddMovementInput(Direction, Value);
}
}
void AMyPawn::TakeDamage(float DamageAmount)
{
CurrentHealth = FMath::Clamp(CurrentHealth - DamageAmount, 0.0f, MaxHealth);
if (CurrentHealth <= 0.0f)
{
UE_LOG(LogTemp, Warning, TEXT("Pawn destroyed!"));
Destroy();
}
else
{
UE_LOG(LogTemp, Log, TEXT("Health: %f"), CurrentHealth);
}
}
float AMyPawn::GetHealthPercentage() const
{
return MaxHealth > 0.0f ? CurrentHealth / MaxHealth : 0.0f;
}BlueprintとC++の連携
UPROPERTY マクロの活用
// エディタで編集可能
UPROPERTY(EditAnywhere, Category = "Settings")
float JumpHeight = 500.0f;
// Blueprintから読み取り専用
UPROPERTY(BlueprintReadOnly, Category = "Status")
bool bIsAlive = true;
// Blueprintから読み書き可能
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
int32 ItemCount = 0;UFUNCTION マクロの活用
// Blueprintから呼び出し可能
UFUNCTION(BlueprintCallable, Category = "Actions")
void PerformAction();
// Blueprintで実装可能(C++では空実装)
UFUNCTION(BlueprintImplementableEvent, Category = "Events")
void OnItemCollected();
// C++とBlueprint両方で実装可能
UFUNCTION(BlueprintnativeEvent, Category = "Events")
void OnDamageReceived(float Damage);
virtual void OnDamageReceived_Implementation(float Damage);6. レベルデザインの基本
レベルデザインの考え方
基本原則
プレイヤーの導線:自然な流れでゲームを進められる設計
視覚的階層:重要な要素を目立たせる
バランス:難易度とリワードの適切な配置
一貫性:統一されたアートスタイルとルール
ジオメトリとBSP
BSP(Binary Space Partitioning)の使用
1. モードパネルで「Geometry」モードを選択
2. BSPブラシを選択(Box、Cylinder、Sphere等)
3. ビューポートにドラッグ&ドロップ
4. スケールや形状を調整基本的なレベル作成手順
1. 床の作成:Box BSPを薄く伸ばして床にする
2. 壁の作成:縦長のBox BSPで境界を作る
3. 天井の追加:必要に応じて
4. ライティング:Directional Lightで全体照明
5. 詳細の追加:Static MeshでディテールアップStatic Meshとアクター
Static Meshの配置
1. コンテンツブラウザでStatic Meshを選択
2. レベルにドラッグ&ドロップ
3. Transform ツールで配置調整
4. 詳細パネルでマテリアル設定コリジョン設定
// C++でのコリジョン設定例
MeshComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
MeshComponent->SetCollisionObjectType(ECollisionChannel::ECC_WorldStatic);
MeshComponent->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Block);ライティング基礎
光源の種類
Directional Light:太陽光のような平行光線
Point Light:電球のような点光源
Spot Light:懐中電灯のようなスポット光
Sky Light:環境光の再現
ライティング設定例
Directional Light の設定:
- Intensity: 3.0
- Light Color: 薄いイエロー (255, 248, 220)
- Cast Shadows: True
- Rotation: (-45°, 30°, 0°)マテリアルとテクスチャの適用
マテリアルの作成
1. コンテンツブラウザで右クリック
2. 「Material」を選択
3. 名前:M_MyMaterial
4. マテリアルエディタが開く基本的なマテリアル設定
Material Graph:
- Texture Sample → Base Color
- Constant (0.5) → Metallic
- Constant (0.8) → Roughness
- Normal Map → Normal7. マテリアルとテクスチャ
マテリアルエディタの基本
PBR(Physically Based Rendering)
Unreal Engineでは、物理ベースレンダリングを採用しています。
主要なパラメータ:
Base Color:基本色
Metallic:金属性(0-1)
Roughness:表面の粗さ(0-1)
Normal:法線マップ
Emissive:発光色
マテリアル作成の実践例
木材マテリアル:
1. Texture Sample ノード追加
2. Wood_Albedo テクスチャを設定
3. Base Color に接続
4. Constant ノード追加(値:0.0)
5. Metallic に接続
6. Constant ノード追加(値:0.8)
7. Roughness に接続
8. Texture Sample ノード追加
9. Wood_Normal テクスチャを設定
10. Normal に接続テクスチャの最適化
テクスチャ解像度の指針
- キャラクター:2048x2048 or 4096x4096
- 環境オブジェクト:1024x1024 or 2048x2048
- UI要素:512x512 or 1024x1024
- タイリング テクスチャ:512x512圧縮設定
// テクスチャインポート設定
Compression Settings: TC_Default(通常)
Texture Group: TEXTUREGROUP_World(環境用)
Generate Mip Maps: True
Power of Two Mode: PadToPowerOfTwo動的マテリアル
Blueprint での動的マテリアル操作
Event BeginPlay
└─ Create Dynamic Material Instance
├─ Source Material: M_MyMaterial
└─ Store in Variable: DynamicMaterial
Custom Event: ChangeColor
└─ Set Vector Parameter Value
├─ Target: DynamicMaterial
├─ Parameter Name: "BaseColor"
└─ Value: New ColorC++での動的マテリアル操作
// ヘッダーファイル
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
UMaterialInstanceDynamic* DynamicMaterial;
// CPPファイル
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// 動的マテリアルインスタンスの作成
if (MeshComponent && MeshComponent->GetMaterial(0))
{
DynamicMaterial = UMaterialInstanceDynamic::Create(
MeshComponent->GetMaterial(0), this);
MeshComponent->SetMaterial(0, DynamicMaterial);
}
}
void AMyActor::ChangeColor(FLinearColor NewColor)
{
if (DynamicMaterial)
{
DynamicMaterial->SetVectorParameterValue("BaseColor", NewColor);
}
}マテリアル関数とマスター マテリアル
マテリアル関数の作成
1. コンテンツブラウザで「Material Function」を作成
2. 名前:MF_Noise
3. 入力:UV (Vector2)
4. 出力:Result (Scalar)
5. ノイズ生成ロジックを作成マスター マテリアルの活用
マスター マテリアル設計例:
- パラメータ:BaseColor, Metallic, Roughness
- Switch Parameter:UseNormalMap
- テクスチャ スロット:Albedo, Normal, RMA
- バリエーション:Material Instance で調整8. アニメーションシステム
アニメーション ブループリント
Animation Blueprintの作成
1. コンテンツブラウザで右クリック
2. 「Animation」→「Animation Blueprint」
3. Skeleton を選択(SK_Mannequin等)
4. 名前:ABP_CharacterState Machine の基本構造
State Machine Example:
- Idle State
- Walk State
- Run State
- Jump State
Transitions:
- Idle → Walk: Speed > 0.1
- Walk → Idle: Speed <= 0.1
- Walk → Run: Speed > 300
- Any → Jump: Is Falling = Trueアニメーション シーケンス
アニメーション インポート
1. FBXファイルをコンテンツブラウザにドラッグ
2. Import Options:
- Skeleton: 既存のSkeletonを選択
- Animation: Import Animations をチェック
- Material: Import Materials をチェックBlend Space の作成
1. コンテンツブラウザで「Animation」→「Blend Space 1D」
2. Horizontal Axis: Speed (0-600)
3. Sample Points:
- 0: Idle Animation
- 150: Walk Animation
- 600: Run Animationキャラクター アニメーション実装
C++でのアニメーション連携
// Character クラス
UCLASS()
class AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
AMyCharacter();
UPROPERTY(BlueprintReadOnly, Category = "Animation")
float Speed;
UPROPERTY(BlueprintReadOnly, Category = "Animation")
bool bIsInAir;
UPROPERTY(BlueprintReadOnly, Category = "Animation")
bool bIsAccelerating;
protected:
virtual void Tick(float DeltaTime) override;
void UpdateAnimationProperties();
};
void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
UpdateAnimationProperties();
}
void AMyCharacter::UpdateAnimationProperties()
{
FVector Velocity = GetVelocity();
Velocity.Z = 0.0f;
Speed = Velocity.Size();
bIsInAir = GetMovementComponent()->IsFalling();
FVector Acceleration = GetCharacterMovement()->GetCurrentAcceleration();
bIsAccelerating = Acceleration.Size() > 0.0f;
}Animation Blueprint EventGraph
Event Blueprint Update Animation
└─ Try Get Pawn Owner
└─ Cast to MyCharacter
├─ Get Speed → Set Speed
├─ Get Is In Air → Set Is In Air
└─ Get Is Accelerating → Set Is AcceleratingIKシステム
Foot IK の実装
// Animation Blueprint C++ Class
UCLASS()
class UMyAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float LeftFootEffectorLocation;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float RightFootEffectorLocation;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FRotator LeftFootRotation;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FRotator RightFootRotation;
private:
void UpdateFootIK();
float GetIKOffsetForFoot(FName SocketName);
};9. UI/UXデザイン
UMG(Unreal Motion Graphics)基礎
Widget Blueprint の作成
1. コンテンツブラウザで右クリック
2. 「User Interface」→「Widget Blueprint」
3. 名前:WBP_MainMenu
4. Widget Designer が開く基本的なUIレイアウト
Hierarchy Example:
Canvas Panel
├─ Vertical Box (MainContainer)
│ ├─ Text Block (Title)
│ ├─ Spacer
│ ├─ Button (StartButton)
│ ├─ Button (SettingsButton)
│ └─ Button (ExitButton)
└─ Image (Background)レスポンシブデザイン
アンカーシステム
UI Element Settings:
- Position: アンカーからの相対位置
- Anchors: 画面上の基準点 (0-1範囲)
- Size to Content: コンテンツに合わせてサイズ調整
- Auto Size: 自動サイズ調整画面解像度対応
Common Anchor Presets:
- Top Left: (0,0) - (0,0)
- Top Center: (0.5,0) - (0.5,0)
- Top Right: (1,0) - (1,0)
- Center: (0.5,0.5) - (0.5,0.5)
- Fill: (0,0) - (1,1)インタラクティブ UI
ボタン イベント処理
// Widget C++ Class
UCLASS()
class UMainMenuWidget : public UUserWidget
{
GENERATED_BODY()
protected:
virtual void NativeConstruct() override;
UPROPERTY(meta = (BindWidget))
class UButton* StartButton;
UPROPERTY(meta = (BindWidget))
class UButton* SettingsButton;
UPROPERTY(meta = (BindWidget))
class UButton* ExitButton;
UFUNCTION()
void OnStartButtonClicked();
UFUNCTION()
void OnSettingsButtonClicked();
UFUNCTION()
void OnExitButtonClicked();
};
void UMainMenuWidget::NativeConstruct()
{
Super::NativeConstruct();
if (StartButton)
{
StartButton->OnClicked.AddDynamic(this, &UMainMenuWidget::OnStartButtonClicked);
}
if (SettingsButton)
{
SettingsButton->OnClicked.AddDynamic(this, &UMainMenuWidget::OnSettingsButtonClicked);
}
if (ExitButton)
{
ExitButton->OnClicked.AddDynamic(this, &UMainMenuWidget::OnExitButtonClicked);
}
}データバインディング
プロパティバインディング
Health Bar Example:
Progress Bar
├─ Percent: Get Health Percentage (Function Binding)
├─ Fill Color and Opacity:
│ └─ Bind to Function → GetHealthColor()
└─ Is Enabled: Get Is AliveBlueprint でのデータバインディング
Function: GetHealthColor
├─ Get Player Character
├─ Get Health Percentage
└─ Lerp (Vector)
├─ A: Red Color (1,0,0,1)
├─ B: Green Color (0,1,0,1)
└─ Alpha: Health Percentageアニメーション
Widget アニメーション
Animation Track Example:
Timeline: 0.0 - 1.0 seconds
Fade In Animation:
- Render Opacity: 0.0 → 1.0
- Translation: (0, 50) → (0, 0)
- Scale: (0.8, 0.8) → (1.0, 1.0)C++ での Widget アニメーション
UCLASS()
class UMyWidget : public UUserWidget
{
GENERATED_BODY()
protected:
UPROPERTY(Transient, meta = (BindWidgetAnim))
UWidgetAnimation* FadeInAnimation;
UPROPERTY(Transient, meta = (BindWidgetAnim))
UWidgetAnimation* SlideOutAnimation;
public:
UFUNCTION(BlueprintCallable)
void ShowWidget();
UFUNCTION(BlueprintCallable)
void HideWidget();
};
void UMyWidget::ShowWidget()
{
SetVisibility(ESlateVisibility::Visible);
if (FadeInAnimation)
{
PlayAnimation(FadeInAnimation);
}
}10. パフォーマンス最適化
プロファイリング ツール
Stat コマンド
// コンソールコマンド例
stat fps // フレームレート表示
stat unit // CPU/GPU使用率
stat memory // メモリ使用量
stat rhi // レンダリング統計
stat scenerendering // レンダリング詳細Unreal Insights
1. エディタで「Tools」→「Session Browser」
2. 「Start Recording」でプロファイリング開始
3. ゲームプレイ後「Stop Recording」
4. データ解析でボトルネック特定レンダリング最適化
LOD(Level of Detail)設定
// Static Mesh LOD設定
LOD 0: 100% detail (0-50m)
LOD 1: 75% detail (50-100m)
LOD 2: 50% detail (100-200m)
LOD 3: 25% detail (200m+)
// 自動LOD生成設定
Reduction Settings:
- Percent Triangles: 0.75, 0.5, 0.25
- Max Deviation: 1.0, 2.0, 4.0カリング(Culling)最適化
// Frustum Culling
r.ViewDistanceScale = 0.8 // 描画距離を80%に
// Occlusion Culling
r.HZBOcclusion = 1 // HZB Occlusion 有効
// Distance Culling
Static Mesh設定:
- Max Draw Distance: 5000
- Min Draw Distance: 100メモリ最適化
テクスチャストリーミング
// テクスチャ設定
Texture Streaming:
- Never Stream: False
- Mip Gen Settings: FromTextureGroup
- Texture Group: TEXTUREGROUP_World
// ストリーミングプール設定
r.Streaming.PoolSize = 2000 // 2GB
r.Streaming.MaxEffectiveScreenSize = 1.0ガベージコレクション最適化
// C++でのメモリ管理
UCLASS()
class AMyActor : public AActor
{
// UPROPERTY でGC対象に
UPROPERTY()
TArray<UObject*> ManagedObjects;
public:
// 手動でGCをトリガー(注意して使用)
UFUNCTION(BlueprintCallable)
void ForceGarbageCollection()
{
GetWorld()->ForceGarbageCollection(true);
}
};
// オブジェクトプール実装例
class ObjectPool
{
private:
TArray<APooledActor*> AvailableObjects;
TArray<APooledActor*> UsedObjects;
public:
APooledActor* GetPooledObject()
{
if (AvailableObjects.Num() > 0)
{
APooledActor* Object = AvailableObjects.Pop();
UsedObjects.Add(Object);
return Object;
}
return CreateNewObject();
}
void ReturnToPool(APooledActor* Object)
{
UsedObjects.Remove(Object);
AvailableObjects.Add(Object);
Object->Reset();
}
};ゲームプレイ最適化
Blueprint 最適化
最適化のベストプラクティス:
1. Event Tick の使用を最小限に
→ Timer を使用して更新頻度を制御
2. Cast の最小化
→ Interface の使用を検討
3. 配列操作の最適化
→ For Each Loop より For Loop with Break を使用
4. 文字列操作の最小化
→ Name や Text 使用時は注意
5. 複雑な計算は関数化
→ Pure Function としてキャッシュ活用Tick 最適化
// C++での Tick 最適化例
AMyActor::AMyActor()
{
// 必要ない場合は Tick を無効化
PrimaryActorTick.bCanEverTick = false;
// Tick 間隔の調整
PrimaryActorTick.TickInterval = 0.1f; // 10fps
}
// 条件付き Tick
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// プレイヤーとの距離に応じて Tick 制御
GetWorldTimerManager().SetTimer(
DistanceCheckTimer,
this,
&AMyActor::CheckDistanceToPlayer,
1.0f, // 1秒間隔
true // ループ
);
}
void AMyActor::CheckDistanceToPlayer()
{
APawn* Player = GetWorld()->GetFirstPlayerPawn();
if (Player)
{
float Distance = FVector::Dist(GetActorLocation(), Player->GetActorLocation());
// 距離に応じてTick頻度を調整
if (Distance < 1000.0f)
{
SetActorTickEnabled(true);
PrimaryActorTick.TickInterval = 0.016f; // 60fps
}
else if (Distance < 2000.0f)
{
SetActorTickEnabled(true);
PrimaryActorTick.TickInterval = 0.1f; // 10fps
}
else
{
SetActorTickEnabled(false);
}
}
}11. プロジェクトの完成と公開
ビルド設定
Development vs Shipping Build
Development Build:
- デバッグ情報付き
- コンソールコマンド有効
- プロファイリング可能
- ファイルサイズ大
Shipping Build:
- デバッグ情報なし
- コンソールコマンド無効
- 最適化済み
- ファイルサイズ小プラットフォーム別設定
Windows:
- Target Platform: Win64
- Configuration: Shipping
- Archive Directory: 指定
Android:
- Android SDK/NDK設定
- Package Name: com.yourcompany.gamename
- Minimum SDK Version: 21
- Target SDK Version: 30
iOS:
- Development Team設定
- Bundle Identifier設定
- Provisioning Profile設定パッケージング
プロジェクト設定の確認
Project Settings チェックリスト:
✓ Game Name, Description, Version
✓ Icon設定(各解像度)
✓ Splash Screen設定
✓ Input Settings(キー配置)
✓ Rendering Settings(品質設定)
✓ Platform specific settingsコンテンツの最適化
// 未使用アセットの削除
1. Edit → Project Settings
2. Packaging → Packaging
3. "Use Pak File" をチェック
4. "Create compressed cooked packages" をチェック
// アセット参照チェック
Reference Viewer:
1. アセットを右クリック
2. "Reference Viewer" を選択
3. 依存関係を確認
4. 未使用アセットを特定デバッグとテスト
自動テスト
// Automation Test例
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
FMyGameTest,
"MyGame.Functional.PlayerMovement",
EAutomationTestFlags::ApplicationContextMask |
EAutomationTestFlags::ProductFilter
)
bool FMyGameTest::RunTest(const FString& Parameters)
{
// テストワールドの作成
UWorld* TestWorld = UWorld::CreateWorld(
EWorldType::Game,
false
);
// プレイヤーキャラクターのスポーン
AMyCharacter* TestCharacter = TestWorld->SpawnActor<AMyCharacter>();
// 移動テスト
FVector InitialLocation = TestCharacter->GetActorLocation();
TestCharacter->AddMovementInput(FVector::ForwardVector, 1.0f);
// 1秒待機
ADD_LATENT_AUTOMATION_COMMAND(
FWaitLatentCommand(1.0f)
);
// 結果検証
FVector FinalLocation = TestCharacter->GetActorLocation();
TestTrue(
"Character should move forward",
FinalLocation.X > InitialLocation.X
);
return true;
}パフォーマンステスト
// Blueprint Performance Test
Custom Event: PerformanceTest
├─ Start Time: Get Game Time in Seconds
├─ Heavy Calculation Loop (1000 iterations)
├─ End Time: Get Game Time in Seconds
└─ Print String: "Execution Time: " + (End - Start)配信とマーケティング
Steam配信
Steam Partner準備:
1. Steamworks アカウント作成
2. App ID取得
3. Store Page作成
4. Achievement/Trading Card設定
5. ビルドアップロード(Steamworks SDK)モバイルストア配信
Google Play:
1. Google Play Console アカウント
2. APK/AABアップロード
3. Store Listing作成
4. Content Rating設定
5. Release Management設定
App Store:
1. Apple Developer Program参加
2. App Store Connect設定
3. IPA作成・アップロード
4. App Review対応
5. Release準備継続的な開発
バージョン管理(Git)
# .gitignore 設定例
Binaries/
DerivedDataCache/
Intermediate/
Saved/
*.tmp
*.log
# LFS設定(大容量ファイル用)
git lfs track "*.uasset"
git lfs track "*.umap"
git lfs track "*.jpg"
git lfs track "*.png"アップデートとパッチ
// バージョン管理システム
UCLASS()
class UVersionManager : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
FString CurrentVersion = "1.0.0";
UPROPERTY(BlueprintReadOnly)
int32 BuildNumber = 1;
UFUNCTION(BlueprintPure)
static FString GetGameVersion()
{
return FString::Printf(
TEXT("%s (Build %d)"),
*CurrentVersion,
BuildNumber
);
}
UFUNCTION(BlueprintCallable)
bool CheckForUpdates();
};まとめ
この教科書では、Unreal Engineでのゲーム開発の基礎から応用まで、実践的な内容を体系的に解説しました。
学習のポイント
段階的な学習:基礎→応用の順序で進める
実践重視:理論だけでなく、実際にプロジェクトを作る
コミュニティ活用:公式ドキュメントやフォーラムを活用
継続的な改善:プロファイリングとテストを習慣化
今後の学習
Advanced Topics:マルチプレイヤー、VR/AR、AI
専門化:プログラマー、アーティスト、デザイナーの道
ポートフォリオ:作品集の作成と公開
業界参画:ゲーム業界への就職・転職
Unreal Engineは非常に奥深いツールです。この教科書をベースに、ぜひ自分だけのゲームを作ってください。継続的な学習と実践を通して、必ずスキルアップできるでしょう。
参考リンク:
Happy Game Development! 🎮
