日記帳

プログラミングのことをつぶやく日記です。

ぷちコンの実装で参考文献そのまま実装した機能

概要

ぷちコンに応募したときに参考にした記事を列挙する。ここで列挙したものは基本的にはあまり改変せずゲームに実装した。

leokun0210.hatenablog.com

戦艦のビーム

レーザートラップを応用して動かして実装した。

[UE5] レーザーのトラップをつくってみよう|株式会社ヒストリア

バリアエフェクト

九里江めいくさんにはめちゃくちゃお世話になった。この通りに実装し、BPでScaleを変更して調整した。

www.youtube.com

チャージエフェクト

パワーチャージエフェクトが欲しかったので、動画の通りに作成した。

www.youtube.com

【UE5】Ovarlay用にMeshが点滅するMaterialを作成する

概要

キャラクターのチャージ完了を状態を視覚的に分かりやすいように点滅するMaterialを作成した。

ActorのOverlayに作成したMaterialを適用した例

調査

点滅するMaterialを作成している動画を見つけた。UE4のものになるが基本は変わらないため、これを参考にして作成する。

youtu.be

実装

MaterialのBlend ModeをTranslucentに変更してOverlayしたときにMeshの元の色が塗りつぶされないようにする。上記の動画の通りにBlend Modeを設定するとMeshのMaterialが塗りつぶされてしまう。

Blend Mode

BPの実装は画像にした。Time関数を作成して点滅間隔を実現、Divideのノードの数値を大きくするほど光るフチが小さくなる。

作成したMaterialは以下の感じで点滅する。

UE5ぷちコン#24に参加した

概要

先日、第24回 UE5ぷちコンに制作したゲームを応募した。以下コンテストサイトより引用 1

UE5ぷちコンとは? UE5ぷちコンとは、株式会社ヒストリアが主催するUnreal Engineを学習する事を目的とした、 ゲーム制作中心の作品制作コンテストです。

Unreal Engineを触ったことがない方でも気軽に勉強できる機会を作りたいという思いから 「2、3日でサクッと作ってサクッと応募」をコンセプトに定期開催しております。

参加者は短期間(約1か月半)でテーマに沿った作品を制作・投稿し、入賞を目指します。

本コンテストは学習目的なのでプロもアマチュアも関係ありません!ぷちコンに応募してUnreal Engineを覚えちゃいましょう!

応募作品

youtu.be

端的に言うと戦艦を強化しながら突撃(ダッシュ)して敵を倒しまくるゲーム、ローグライトから着想を得ており、今回のUEぷちコンのテーマである「スピード」と合致するようにプレイヤーである戦艦の攻撃手段をダッシュにした。ただダッシュして敵を倒すだけだと面白くないので、パワーチャージしてから解放してダッシュという形にすることでチャージ中は無防備になったりと駆け引きが生まれるようにしたかった。

実装するモチベーション

最近、石黒版銀河英雄伝説本伝をずっと観ていた。それっぽいゲームを作りたいと考えたのだがスピードという要素と組み合わせるのが非常に難しかった。ただ猛ダッシュで敵に突っ込むだけだと面白さが生まれないのでローグライト風にしてダッシュ力や攻撃範囲を強化したりするようにした。ローグライトの着想はエルデンリング ナイトレインから得た。私は、競技プログラミングのようなコンテストよりも実際に遊んだりして楽しめるものを作るコンテストのほうが実は向いているのではないかと最近思い始めた。私にとってゲーム制作があまり苦にならなかった。

今後のブログの予定

このゲームを開発するにあたって学んだことをまとめておく。英語のYouTubeなどを参照して作った部分もあるので、それを日本語での文章にしたら幾分かは誰かの助けになるのかもしれない。

結果

2025年10月3日にYouTube Liveで発表される。

UE C++のデリゲートの実装

概要

Unreal C++にてマルチキャストデリゲートを実装して別のオブジェクトの関数を動的に呼び出し、Tick処理の肥大化を避ける。

実装するモチベーション

UEぷちコンに応募するためにアクションを作成している。アクションゲームで敵を撃破したときしか実行してほしい処理があり、当初はTick処理で実装しようと考えたが処理をするタイミングは敵撃破時以外は必要ないので、できればそのタイミング以外は処理の実行判定をしないことで実行速度を少しでもあげることができる方法がないか調査した。

前提

解決策

解決策は、必要なタイミングでのみ関数を実行できるようにデリゲートを使用する。1 シングルキャストデリゲートとマルチキャストデリゲートがあるが、将来関数を複数バンドルする可能性を考えてマルチキャストデリゲートで実装した。2

Enemy.h

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemyDied, AEnemy*, DeadEnemy);

/// <summary>
/// エネミークラス
/// </summary>
UCLASS()
class AEnemy : public ACharacter
{
public:
  UPROPERTY(BlueprintAssignable, Category = "Enemy")
  FOnEnemyDied OnEnemyDied;

EnemyManager.h でバインドされる関数の定義

  /// <summary>
  /// バインドされる関数
  /// </summary>
  /// <param name="DeadEnemy"></param>
  UFUNCTION()
  void HandleEnemyDeath(AEnemy* DeadEnemy);

EnemyManager.cpp でのバインド

    AEnemy* NewEnemy;
//-----略-----
    NewEnemy->OnEnemyDied.AddDynamic(this, &AEnemyManager::HandleEnemyDeath);

    }

Enemy.cpp でのBroadcast

OnEnemyDied.Broadcast(this);

結果

OnEnemyDied.Broadcast(this);が実行されたとき、AEnemyManager::HandleEnemyDeathを実行する。このとき第1引数はthisであるためAEnemy自身への参照が割り当てられる。

参考文献

最近ゲーム作りで見たサイト

円周率を定数で使用する

角度とラジアンの変換で円周率が必要になった。

hayakute.kantan-sakusaku.com

learn.microsoft.com

三角関数を使った楕円軌道のアニメーション

縦移動のオブジェクトの作り方を完全に忘れていたので、この辺で復習した。

gihyo.jp

wakariyasui.sakura.ne.jp

2点の物体間の直線的な移動方法

2点の物体間の移動での移動方法は知恵袋の実装をよく観察して、自分のプログラムに落とし込んで使った。

2Dゲームのプログラミングシューティングアクションを作っているのですが、... - Yahoo!知恵袋

cos - cpprefjp C++日本語リファレンス

2点のラジアンが必要なのでarttan関数を使用した。

atan2 - cpprefjp C++日本語リファレンス

構造体の要素の比較

構造体の要素Aの文字列Bを持つものはVectorの中でいくつあるのか数える必要があった。

www.appsloveworld.com

DXライブラリのαブレンド

αブレンドのイメージが湧かなかったが、パラメータを徐々に変化させる例があり参考になった。

https://dixq.net/g/39.html