main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

C++

【UE5】SaveGameを使ってみよう!(C++編)

概要 環境 実装 クラス定義 生成 データをセーブする(非同期) データをロードする(非同期) データをセーブする(同期) データをロードする(同期) 概要 SaveGameは、ゲームの状態を保存し、読み込むためのシステムです。 SaveGameを使用することで、プ…

【UE5】ダイス(サイコロ)クラスを作成してみよう!

概要 環境 クラス実装 動作確認 概要 3d6(6面ダイスを3個)やd20、d8+2等のダイスロールを行うクラスです。 文字列として"3d6"なども渡すこともできます。 "3D6"など大文字でも指定することができます。 "d6"などの最初のダイスの個数の省略や、"d6 + 1"な…

【UE5】BlueprintFunctionLibraryを使ってみよう!

概要 BlueprintFunctionLibraryはC++で作成した関数をブループリントで呼び出す場合に使用します。 ちょっとしたユーティリティクラスなどの関数をブループリントで呼び出すことができます。 環境 UnrealEngine 5.4.2 実装 ソースファイルの作成 ツール → 新…

【UE5】DataTableを使ってみよう!(C++編)

概要 環境 実装 構造体定義 DataTableの作成 データ入力 C++でデータの参照 BPでデータの参照 CSVにエクスポート CSVからインポート 概要 データテーブルは、構造化データを整理するためのテーブル形式のデータ構造です。 行と列からなり、各行は一つのレコ…

【UE5】Subsystem(サブシステム)を使ってみよう!

概要 特定のタイミングで管理(生成/破棄)されるインスタンスを作る仕組みです。 Enigne、Editor、GameInstance、World、LocalPlayerと同じライフサイクルで管理が可能です。 〇〇Managerを作りたい!という時に有用な機能です。 基底クラスによってランタ…

【UE5】ImGuiを使ってみよう!

概要 環境 導入手順 確認 実装 参考 概要 ImGuiはC++でシンプルなGUIを構築できるGUIフレームワークです。 ゲームのデバッグ用のUIを作成するのに大変有用なフレームワークです。 github.com UEでデバッグUIを実装するのにUMGなどで実装すると追加、拡張、メ…

【Metal】mtlppで始めるC++でMetalプログラミング入門

はじめに 動作環境 サンプルコード セットアップ 空のプロジェクトの作成方法 フレームワーク、ライブラリの設定 mtlppをプロジェクトに追加 ARCの設定 ウィンドウの表示 三角形の描画 コマンドキューの生成 シェーダーの初期化 頂点バッファの生成 レンダー…

【Metal】mtlppをビルドしてみる

mtlppとはAppleのOSで動作するオーバーヘッドの小さいローレベル(low level)のグラフィックスAPIのMetalのC++ラッパーである。 github.com MetalはObjective-CかSwiftのAPIは用意されているが、C++でのAPIは用意されていない。 mtlppはObjective-Cで実装し…

ゲームエンジンのプログラム構成の比較

はじめに ゲームエンジンや物理エンジン、ミドルウェアのコーディング規約やファイル命名規則など比較してみる。 論理構成(フォルダ構成やリソースの命名規則等も含めて)においても問題になってくる話。 以下の項目について確認していく。 バージョン ファ…

バグを出さないプログラマになるための「心得」

1.はじめに 長年コンシューマゲーム開発に携わってきた中で毎回思うことがある。 開発の終盤には必ずテストプレイが行われ、毎回大量のバグと闘っている。 なぜ大量のバグが出ているのか、どうしたら大量のバグが出なくなるのかについて考え、まとめてみるこ…

【バグ】マスターまで残り4日!1バイトのメモリ破壊を追え!

はじめに 過去のプロジェクトでマスター直前に出たメモリ破壊のバグを調査した時の方法を公開します。 はじめに 報告内容 調査開始 調査方法 最後に 報告内容 プラットフォーム:コンシューマ 言語:C++ 症状: メモリアロケート時に門番の情報が破壊されて…

【UE4】ファイルスコープで宣言した変数、関数でビルドエラー

ファイルスコープや無名名前空間で変数や関数を宣言した場合、 異なるファイルで同名の変数や関数を宣言すると場合よってはビルドエラーになります。 Hoge1.cpp static const FText VFXSocktNamePrefix = FText("VFX_"); namespace { const float EnemyCheck…