プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【UE5】Play As Clientについて学習

※誤っている可能性が非常に高いです。自分の考えをまとめることを目的としているため、それなりに順序不同・支離滅裂です。

 

 

Unreal Engineのサーバーについて

Net Modeでサーバーモードを選択できます。

「Play Standalone」はサーバーを用いないものと思ってください。

 

クライアントのいずれかをゲームサーバーのホストとするような考えが「Play As Listen Server」です。

クライアントとは別にサーバーがある状態を「Play As Client」となります。

 

「Play As Listen Server」では、ホストが終了されると全クライアントも終了されます。

ですが、「Play As Client」では、ホストが存在しないのでどのクライアントが終了されてもゲームは終了されません。

 

 

オブジェクト

オブジェクトを各クライアントで認識するためには、基本的にオブジェクトはサーバーで生成するようにする必要があります。

クライアントで生成したとしても、そのクライアントのみで描画され、ほかのクライアントでは描画されません。

仕組みとしては、サーバーで生成し、各クライアントにコピーされるという考えです。

 

レベル上に配置。サーバーで生成し、各クライアントと同期

オブジェクトを同期するため、アクターの詳細から「Replicates」を有効にします。

これにより、アクターの生成はサーバーと各クライアントで同期されます。

 

 

Actor Spawnでゲームに生成。サーバーで生成し、各クライアントと同期

アクターをスポーンする場合、スポーンはサーバーのみで行わせます。

そのため、UEC++の場合「UKismetSystemLibrary::IsDedicatedServer(this);」という関数を用い、これがtrueの時のみ生成をさせます。

BPの場合は以下のノードがtrueの時のみ生成処理を呼びます。

そうしなければ、サーバー+各クライアント数のアクターが生成され、判定が不正確になってしまいます。

 

 

オブジェクトの同期

ゲーム中、アクターに変化を与え、全クライアントに同期させたくなります。

 

オブジェクトは基本的にサーバーで生成します。そのため、そのオブジェクト内で処理を行うと、サーバーには影響しますが各クライアント上では見た目的な変化は起きません。

 

サーバーのみの実行ではなく、各クライアントでも処理をさせるように対応させます。

UEC++では、処理をさせたい関数は以下のように宣言させます。

UFUNCTION(NetMulticast, Reliable)
void DoFunction();
void DoFunction_Implementation();

void AAA::DoFunction_Implementation()
{
    // サーバーと各クライアントで実行する処理
}

DuFunctionは定義する必要ありません。緑波線はほっときましょう。

 

 

サーバーかクライアントか確認

オブジェクトのTickなどで適当に「PrintString」を接続させます。

そうすると出力表示に「Server: 」や「Client1: 」などと表示されます。これによりどこで生成され、どこで呼ばれているのか確認ができます。

 

 

生成した対象内のみで処理を実行

UEC++の場合は「HasAuthority()」という関数で判断できます。

BPの方でも「Has Auhority」というノードがあります。

 

 

 

ゲームから学ぶ - スパイダーマン2からいろいろ

 

オプションの手話ナレーションについて

youtu.be

手話のみの人に対して、ボイスを追加して再生するオプションのようです。

ムービー中、字幕を見ないで声だけを聴く人にとっては便利ですね。

 

 

 

ミッションの敵全部倒したときにスローモーション

youtu.be

敵を見失ってもミニマップに出るので困らないですが、

倒し終わったかどうかの判断としてスローモーションされるのは分かりやすくていいなと思いました。

 

 

 

敵撃破時にSE

youtu.be

  • 撃破時にSE
  • 同じスパイダーマンでも顔アイコンで字幕を分けている
  • 水掛かったら画面濡れる

 

 

 

車上移動

youtu.be

スローだと見やすいかも、移動キー入力時に移動先の車を決めて移動してるのかな

 

 

 

目的地に柱

youtu.be

サーチを行うと、目的地に柱が立つようになって分かりやすくなってました。

 

 

 

電話途中で戦闘に入ると途切れ、戦闘が終わると途中から会話が開始

youtu.be

この仕組み当たり前になってきたよなっていう感覚。

 

 

 

オプションの明るさ

 

UIの文字とか見にくくはなるけど、明るさ調整の確認のためにオプションの開閉の手間が減って便利だなって。

 

Empathを試してみた

概要

この記事で気になっていたので少し試してみました。

prtimes.jp

 

 

参考

感情解析API「Empath」の実力はいかに?実際に試してみた結果をレビュー - Qiita

EmpathをVisual Studio(C++)で使ってみた - Qiita

 

 

 

検証環境

pythonの環境が整っているので、pythonで行います。

 

 

 

準備

Empathの準備

Empath

公式サイトより、登録する必要があります。

APIに使用制限がありますが、無料でも登録して利用できます。

私は、「フリープラン (音声ファイル保存あり)」で行いました。

 

 

音声の準備

声 | 無料 BGM・効果音のフリー音源素材 | Springin’ Sound Stock

感情解析をする音声の準備が必要となります。

無料のものでも自前でも良いですが、私は上記の「はじまるよ」を利用しました。

 

解析可能な音声データ

Empathのドキュメントに記載はありますが、音声データに制約があります。

  • PCM WAVE形式、16bitであること。
  • データサイズが1.9MB以下であること。
  • フォーマットがPCM_FLOAT、PCM_SIGNED、PCM_UNSIGNED のいずれかであること。
  • 録音時間が5.0秒未満であること。
  • サンプリング周波数が11025Hzであること。
  • チャンネル数が1(モノラル)であること。

 

先ほどのサイトの「はじまるよ」はモノラル、32bit、mp3、44100Hzなので調整をする必要があります。

 

audacity

Audacity ® | Free, open source, cross-platform audio software for multi-track recording and editing.

audacityで調整を行います。

 

  1. mp3をD&Dで入れます。
  2. 左下の「プロジェクトのサンプリング周波数」を11025に変えます。
  3. 左上の「ファイル(F)」から「書き出し(E)」を選択し、「WAVとして書き出し(W)」を選択し、以下の形で保存します。

 

44010から11025に変更するだけでこれだけ変わります。

youtu.be

 

pythonの記載

参考にある記載をそのままですが、「empath_test.py」というのを用意して以下のように記載します。

※はじまるよ.wavはempath_test.pyを同じ階層に置いた状態です。


import requests

url ='https://api.webempath.net/v2/analyzeWav'

apikey = 'Empathにログイン -> API Key設定 -> API Keyの文字をここにコピペ'
payload = {'apikey': apikey}

wav = "はじまるよ.wav"
data = open(wav, 'rb')
file = {'wav': data}

res = requests.post(url, params=payload, files=file)
print(res.json())

 

実行・確認

実行すると以下のような結果が得られました。


D:\mine\py>python empath_test.py
{'error': 0, 'calm': 0, 'anger': 34, 'joy': 7, 'sorrow': 7, 'energy': 34}

 

それぞれが以下のようなパラメータです。

  • calm: 平常
  • anger: 怒り
  • joy: 喜び
  • sorrow: 悲しみ
  • energy: 元気

 

「はじまるよ」という単語からこの結果となります。

 

 

思ったこと

解析可能な長さ

5秒ということで短いように感じていましたが、FORSPOKENでは0.32秒ということでした。

全ての単語の一言一句ではなく、一つのwavから一つの結果として得られるものなので、0.32秒程度の短い解析をたくさんするのが正しいように感じました。

 

実用

少なくとも無料版では、APIコール数が有限のため使用は厳しいように思いました。

解析する際のみ11025Hzに変更するような仕組みをすれば実用は出来そうに思いますし、利用しても面白そうに感じました。

 

 

 

ゲームから学ぶ - チャンスでBGM切り替え

  • 敵が徘徊しているときのフレーズ
  • 敵が倒れて攻撃のチャンスの時のフレーズ
  • 倒しきった時の終わりのフレーズ

 

 

配信聞きながら気づいたので

www.youtube.com

ゲームから学ぶ - 16の色々(検索避け)

Final Fantasy 16を遊びつつ、気になったりちょっとしたものをまとめました。

 

 

チュートリアル(Tips)

youtu.be

 

 

ビジュアライゼーション

youtu.be

  • FF14にもあったやつと同じはず

 

 

すれ違いNPC会話UI

youtu.be

  • チームとの会話は真ん中下に表示され、すれ違いNPCの会話は左下に表示
  • 二つ目のセリフ以降は少しずれて表示
  • 今のセリフが終了されたら、次のセリフ開始とともにUIも表示
  • 途中で離れたら会話も途中で止まる
    • 今再生していた会話は距離減衰的なあれで聞こえなくなる

 

 

ガイドへの注視

youtu.be

  • Lスティック長押しでガイドへ注視
  • カメラ外になっても画面上にガイドが表示される
  • ガイドが左右どちらに振り切っているかで、注視の際のカメラ移動の方向が決まっているよう

 

 

メニューに表示されるキャラクター

youtu.be

  • 動きは反映されてるけど、顔の向きは反映されていないみたい
  • ステータスタブとか装備タブとかでカメラの向きが変わっている

 

 

火に近づいた時の手

youtu.be

 

 

レーニングでの入力表示

youtu.be

 

フィールドのBGM切り替え

youtu.be

  • 敵からの発見、またはプレイヤーから敵への攻撃ヒットがトリガーとなり、戦闘BGMへ切り替わっている
  • ダンジョンのようなエリアやムービーによる戦闘切り替えでは演出されない(ように思えた)

 

 

テイクダウンゲージ関係でBGM切り替え

youtu.be

  • ゲージの半分やゲージ切れ近くでBGMが切り替わっているように思います
  • 基本的にフレーズ切り替えのように思います
  • ムービー切り替え時には、ムービー側の尺の関係でBGMを即座にフェードアウトフェードインしているように思います

 

 

回避スロー

youtu.be

youtu.be分かりやすいのを狙って撮るのも難しかったので二つ。

  • 回避でBGMを止めているかスローにしているように思える。
    • 正直自分も熱入って遊んでたのでちゃんと聞けてない…

 

 

ボス戦闘の一連の流れ

youtu.be

  • ムービー中にBGMを再生し、そのまま戦闘
  • 戦闘終了で強制的にBGMを消してクリア

 

 

https://www.youtube.com/playlist?list=PL_nPzHJUOloKjSdSuIwT3UC_8Xz5TcKHi

 

ゲームから学ぶ - 釣りBGMの盛り上がり

 

 

youtu.be

 

  • 釣り開始からキャッチまでの間で釣れそうという具合から盛り上がりが増している
  • 釣ったらBGMの終わりに切り替えてる