プログラマーの卵の日記

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

【UE4】CRI ADXのチュートリアルの完全まとめ備忘

CRI ADX(Unreal Engine4) - CRIWARE for Games

 

 

概要

上記のものを1から触ってみて、「この情報は常に覚えたい!」「この情報のあるページをする参照できるようにしたい!」といった感じで完全に自分用の備忘

実務のおかげで理解しやすくなった…!

 

 

 

サウンドデータとインポート内容と設定

 

データ内容

準備編00 はじめに知っておきたいCRIのUE4プラグイン基礎知識 - CRIWARE for Games

.acfファイル->Atom Craftで設定したAISAC設定などが記録されている

.acbファイル->メモリ再生用の波形データ

.awbファイル->ストリーム再生用の波形データ

 

インポート

入門編02 ADX2のデータをインポートする - CRIWARE for Games

.acfファイル->AtomConfigが生成される

.acbファイル->AtomCueSheetとAtomCueが生成される

.awbファイル->インポート不要(同名の.acbファイルのおかげかな)

 

設定

入門編03 CRIプラグインの設定を行う - CRIWARE for Games

入門編05 ストリーミング再生する - CRIWARE for Games

.acfファイル->Project Setting=>Plugins=>CriWare=>AtomConfigに設定

.acbファイル->

.awbファイル->パッケージに含めるよう設定(英語だと「Additional Non-Asset Directories to Packege」)

 

 

 

UE4の設定

無償版サウンドミドルウェアCRI ADX LE - CRIWARE for Games

入門編01 CRIのUE4プラグインを導入する - CRIWARE for Games

UE4.27.2で行いましたが問題なし。

ただ、UE5.0.1で試したらおそらくWin32が設定されていないもしくは使用しないために怒られた。

 

 

 

デバッグ

音源の位置を見る

初級編07 3Dサウンドを再生する(1) - CRIWARE for Games

「@」キーを押してコンソールウィンドウを出し「cri.ShowSoundLocation 1」と入力

 

 

 

ブループリント上からの音の制御

中級編15 Blueprintによる基本的な音声制御6連発 - CRIWARE for Games

 

カテゴリごとの制御

EnemyとかVoiceとかBGMとか…ね。カテゴリすると設定からの音量設定でやりやすいね

中級編16 カテゴリに分類されたサウンドの再生を制御する - CRIWARE for Games

 

AISACのパラメータ設定

中級編17 ゲーム内の状況に応じて変化するサウンド - CRIWARE for Games

 

DSPバスの設定

プレイヤーの状況によってエフェクトをするものかね

中級編18 DSPバスによるエフェクト制御 - CRIWARE for Games

CRI ADX2 Tools マニュアル: DSPバスによるエフェクト設定

 

 

 

3D音源の再生

初級編07 3Dサウンドを再生する(1) - CRIWARE for Games

初級編08 3Dサウンドを再生する(2) - CRIWARE for Games

初級編09 壁の向こうから聞こえる音 - CRIWARE for Games

 

リスナーの設定(簡単すぎぃ)

初級編10 三人称視点ゲームの自然な音の聞こえ方 - CRIWARE for Games

 

足音の設定(簡単すぎぃ)

初級編11 3Dモデルのモーションに音をつける - CRIWARE for Games

 

オブジェクトに設定

中級編14 移動する物体から音を鳴らす - CRIWARE for Games

 

 

 

そのほか

中級編19 音を鳴らしたままパーシスタントレベルを切り替える - CRIWARE for Games

中級編20 大量のキューを含むキューシートの取り扱い - CRIWARE for Games

中級編23 ヘッドフォン・イヤホン使用時の自然な3Dサウンド - CRIWARE for Games

 

ロード関係

中級編21 キューシートについて知ろう - CRIWARE for Games

中級編22 キューシートのロードタイミングを制御してみよう - CRIWARE for Games

 

 

【C++】続else ifでnullチェック漏れ

【C++】else ifでnullチェック漏れ - プログラマーの卵の日記 の次

 

 

 

こんな書き方出来るんだなって

 


#include "iostream"

class A
{
public:
	A() { std::cout << "コンストラクタ\n"; }
	~A() { std::cout << "デストラクタ\n"; }

	void Print() { std::cout << "null回避\n"; }
};

int main()
{
	if (A* a = new A())
	{
		// ここが通ります。
		a->Print();
	}
	else if(A* b = new A())
	{
		// え?aが作れなかった時に来ます~
		a->Print();	// このaは怪しい
		b->Print();
	}
	else
	{
		// え?aとbが作れなかったときに来ます~
		a->Print();	// このaは怪しい
		b->Print();	// このbも怪しい
	}

	return 0;
}

 

 

 

でも、実際にnullだった場合どうなるのか分からない…たぶんクラッシュしそうな気はする

ので気をつけよう…!(というかこんな書き方しないっしょ)

 

 

 

【UE】ぷちコンやりつつサイト見つつAIやってみた結果と課題

参考記事

二つの記事からAIっぽいのをやってみました。

素直~に両方とも作ってみましたが、素直にそのまま作るだけでは完成しません。当たり前っちゃ当たり前ですが。

そのうえで何が足らなくてどうすればもっと良くなるのかまとめます。備忘として。

 

 

実際にやってみた記事

 

やってみようとした参考

AIコントローラーによる追跡と攻撃 | 未来派図画工作のすすめ

 

 

 

 

[UE4] ランダムに移動するキャラクターを簡単に実装する方法|株式会社ヒストリア 

こちらはどんな感じになるかというと、

 

f:id:yutateno:20220403214921g:plain

 

足りない点
  • 発見から追尾する機能⇒発見即終了なら不要

 

簡単に追加できること
  • 目線のようなものを自前で用意して制御できる
  • 移動エリアをある程度狭めればそれらしく動き敵にできる

 

利点
  • すんごい簡単にそれっぽい敵が作れる!

 

 

 

 

【UE4】パトロールをする敵AIの作り方 - Qiita

こちらはどんな感じになるかというと、

f:id:yutateno:20220403220441g:plain

 

 

足りない点
  • 追跡が一瞬でも阻害されると元に位置に戻る⇒発見即終了なら不要
  • 目線が不明瞭

 

簡単にいじれるもの

 

利点
  • UE4のブラックボードとかビヘイビアツリーの扱い方を学べる
  • わりと優秀な敵AIが作れる

 

 

 

 

 

【C++】else ifでnullチェック漏れ

とある本読んでたら「えっ、この書き方どうなんの…?」と思ってやってみたら「nullチェックすり抜けるや~ん」っていう。


int main()
{
	const char* strA = nullptr;
	const char* strB = "aiueo";

	if (strA != nullptr)
	{
		// strAがnullptrでなかったら通る
		std::cout << ((strA != nullptr) ? strA : "nullptr") << std::endl;
		std::cout << ((strB != nullptr) ? strB : "nullptr") << std::endl;
	}
	else if (strB != nullptr)
	{
		// strBがnullptrでなかったら通る
		// ということでここ通りまぁす
		std::cout << ((strA != nullptr) ? strA : "nullptr") << std::endl;
		std::cout << ((strB != nullptr) ? strB : "nullptr") << std::endl;
	}
	else
	{
		// strAとstrBがnullptrだったら通る
		std::cout << ((strA != nullptr) ? strA : "nullptr") << std::endl;
		std::cout << ((strB != nullptr) ? strB : "nullptr") << std::endl;
	}

	return 0;
}

 

 

 

この書き方すれば問題ないねぇっていう。

まぁそうそうelse ifみたいな書き方しないと思うけど、内容次第では楽だと思って書きそうだけれども。


int main()
{
	const char* strA = nullptr;
	const char* strB = "aiueo";

	if (strA && strB)
	{
		// 両方nullチェックして通らさない
		std::cout << ((strA) ? strA : "nullptr") << std::endl;
		std::cout << ((strB) ? strB : "nullptr") << std::endl;
	}
	else
	{
		// 両方nullチェックしてダメだったら
		std::cout << ((strA) ? strA : "nullptr") << std::endl;
		std::cout << ((strB) ? strB : "nullptr") << std::endl;
	}

	return 0;
}

 

ゲームから学ぶ - ずっと気になってたアトリエのソート

アトリエシリーズでなんやかんや気になってた

 

 

①個数順のソート

⇒品質はバラバラ

②品質順のソート

⇒品質重視のソート ここで通常ソート?

③個数順のソート

⇒品質順のソートを保持して個数順 ここでstable系ソート?

 

 

youtu.be

 

 

なんでstable系って書いたかって?それしか知らないからだよーん

【C++】複数要素のソートがしたいのでstable_sortを使ってみた - プログラマーの卵の日記

 

 

なんで②のとき個数順のソートリセットされてるん?

リセットしているように見えるだけで正常だったりするん?

 

 

てか個数順のソートってどうやるんやろか…個数を保持してたりするのかな…ソートのタイミングでチェック保持してるのかな…

ということで宿題!

 

 

 

ゲームから学ぶ - 戦闘への予測動作

 

敵へある程度近づくと武器を手に持ち戦う姿勢を出している。

あと、ハイライトの変更時のカメラの移動と、それに関係するUIがいろいろと近いのは良いなぁと思ったりした。

 

 

ちなみに茂みに入るとコントローラーが振動するので隠れているかどうかが操作感として分かりやすくていいなぁと感じたり。

 

 

 

youtu.be

ゲームから学ぶ - あれ?ソフィー2でアトリエの戦闘変わりましたね

 

(ちょうど良い動画無かったんですが)これまでのアトリエって専用の戦闘エリアへ移動して戦ってたんですが、その場で戦闘するようなシームレスに変わりましたね。

 

 

 

youtu.be

 

 

 

 

 

 

と!

いうことはこのバグ起きるんじゃないかとワクワクしてました。

 

テイルズオブゼスティリア炎上騒動とは (テイルズオブゼスティリアエンジョウソウドウとは) [単語記事] - ニコニコ大百科

壁近くで戦闘すると壁にカメラが埋まって見えなくなるんですよねぇ…場所によっては木とかで全くプレイヤー見えないとか

 

 

そう思って敵を頑張って壁に近づけようとしたりしたんですが、そもそも敵の移動が変わってました。

・移動エリアが敷かれているようで壁に近づかない

・そもそもプレイヤーに近づいてくる敵が減った

・逆にプレイヤーから逃げる敵がいる

 

こいつなんて後ろに目がある…

youtu.be

 

ちなみに敵に追われると右下マップの周りが赤くなります。全然気づかなかった…。