投稿

最低限のサウンド再生について

イメージ
今作っているゲームがようやくあとちょっとで完成になりました。 タイトルも『Black Obsidian』に決めました。 完成の折には無料で公開したいと思っておりますので皆さんぜひプレイしてみてください! 完成前の最後の実装で最低限の効果音とBGMを入れなくては、ということで… 効果音 最低限のということなので今回は音を発するアクターに効果音を紐づけてレベルに配置など凝ったことはせず、銃の発砲音とかエンカウント音とかドアの開く音とかだけにしました。 エンカウント音とかドア音は音が発するタイミングがBPから取りやすいので、BP上でそれが発するタイミングで皆さんご存知 Play Sound 2D ノードを使いました。 単発wavファイルを単純に発音するだけならコレ 銃の発砲音はアニメーションに紐づけると楽なので発砲アニメーションに効果音を埋め込む方法をとりました。 フレームの頭にPlaySoundを通知 詳細の所でwavファイル等を設定 BGM BGMも場面に合わせて効果音と同様にPlaySound2Dを叩く感じと似ているのですが、途中で再生・停止をする必要があるのでちょっと工夫しました。 曲の再生・停止はレベルBPでやると何かと便利なのでレベルBP上で… ステージ開始時はレベルBPのBeginPlayのところで Create Sound 2D ノードでwavファイル等を指定、ReturnValueを変数化してその変数を Play ノードで叩いて曲を再生開始! BGMという変数にReturnValueを代入してPlay この時、あらかじめ曲の方の設定でループをオンにしておきます。 画面下のLoopingをチェック CreateSound2DノードのAutoDestroyにはチェックが入っていても入っていなくてもループ曲に関しては変わらないみたいです。 途中で曲を変えたいときにはStopノードでBGMを止めて、別曲をさっきと同様にCreateSound2Dで指定してさっき作った変数に代入してPlayノードで再生開始。 変数「BGM」をターゲットにStop これで最低限のサウンド再生はできるんじゃないでしょうか? この程度なら簡単ですね! ちなみに結構重要ですが、

Akeytsuのここがイイ

イメージ
モーション作成やスキニング(って言うんですか?)にAkeytsuというソフトを使ってます。 Akeytsuの特徴は ・結構安い!(インディーズ用ライセンスが2万円くらい、私が買ったころは1万円しなかったような…) ・直感的にモーションが作れる(らしい) だそうですが、他のソフトをあまり使ったことが無いので実のところよくわかりません。 で、Akeytsuのどの機能が良いかというと、 スキニングデータを別のモデルにコピペできる ところがすごく便利で助かってます。 (他のソフトでもできるようでしたらスミマセン) 以下、スキニングまで済んでいるロボットのモデルを骨の入ってない他のモデルにコピペするやり方です。 ホントは全然違うモデルで紹介したかったのですが、作業の都合上似たような形のロボットになってしまいました。 1:コピー先のメッシュをインポート    ↓   コピー元のボーンをインポート(メッシュ付の時はメッシュを削除)    ↓   コピー先のメッシュをボーンのあるTREEにD&Dで入れる 必要であればBindPoseモードでボーンの位置等を修正 2:ボーン全身を選択    ↓   メッシュを選択    ↓   SKINATELIERの1を押してから2を押す これで取りあえずの自動スキニングが完了 3:コピー元をインポート こっちがコピー先のモデル こっちがコピー元のモデル(似ているモデルで参考になりづらくてスミマセン) 4:コピー元でSkin&Checkにてボーン全身を選択    ↓   全頂点を選択(Shift+左クリックでドラッグ)   この時SKINALTELIERの裏頂点も選択可能ボタンをオンにしておくと便利    ↓    Copy Weightsボタン を押す 5:コピー先の全身ボーンを選択    ↓   全頂点を選択    ↓    Paste Weightsボタ ンを押す 完了!! ちゃんとコピー元と同じようにスキニングがコピーされてます 結構形の違うモデル同士もイイ感じにコピペできるので重宝してるのですが、 調整いらずというわけではないので、でもそこはしょうがないですね。

ネームエントリー

イメージ
書くネタが無くなって更新頻度もだいぶ減ってしまいましたが、今作っているRPGでネームエントリーの処理を作ってみたので記事にしてみます。 ざっくりどんな流れの処理かは  こちら  を見てみてください。 やっていることは キャラクターのアクターにオーバーラップしてイベントを開始 ↓ 文字送りをしていき、仕込んでいたスクリプトからネームエントリーを起動 ↓ カーソルを表示し、文字(ネーム)入力 ↓ チェックボックスをクリックするとネームエントリーをフェードアウト ↓ カーソルを消してイベントを続行 とこんな感じで動いています。 まずネームエントリー部分について ネームエントリーはWidgetで作っています。 テキストボックスとチェックボックスを こんな感じに作って、これらの詳細よりOnTextCommittedやOnCheckStateChangedをにビューにしておき テキストボックスの方の詳細/イベントOnTextCommitted Widgetのイベントグラフで出てきた2つのノードに こんな感じに ・テキストボックスの方には入力されたテキストを表示 ・チェックボックスの方にはインスタンスに作っておいたMyNameという変数に入力されたテキストを代入するようにします。(CastInstanceは独自マクロです) で、ネームエントリーが始まったらWidget上でマウスやキーボードが使えるようにするために イベントConstrustノードに マウスカーソル表示 と インプットモードをこのUIのみに絞る ノードを繋げます。 これでWidgetが表示されると同時にマウスカーソルが表示され、文字入力しても裏で動いているゲームが操作できちゃったりしないようにできます。 ネームエントリーが終わってチェックボックスを押されたら上に書いたOnCheckStateChangedのMyNameに代入した後ろに こんな感じで マウスカーソルをオフ にさせて インプットモードをゲームだけにする とカーソルが消えてゲームが再開できるようになります。 これ、ShowMouseCursorのオンオフだけだとオフった時に1クリックしないとゲーム操作に移ら

パッケージ化

パッケージ化ってだいたい最初は失敗しますよね。 そしてエラーログの意味がよくわからなくて絶望する。 ググっても日本語の情報があんまりなくて英語のアンサーハブをなんとか読んで、解決することもあればしないこともあり、これは無理なんじゃないか?と思ってるとなぜかパッケージ化成功とか… というわけで今回は今作っているゲームのα版パッケージ化でつまずいたところを書いていきます。(もう2か月前のことかー) パッケージ化について書いてあるサイトを参考に(皆さんありがとうございます!) 容量圧縮方法を試みながらおもむろにパッケージ化してみる。 ↓ 失敗! ですよねー。 エラーログにディレクトリー名が長いからアカンと出てる。 わかりやすいエラーで助かった!と思いマケプレで買ったローディングシステムのやつのフォルダ名とかをリネームしてみる。 ↓ 失敗! というか、なんかさっきリネームしたフォルダとリネームしてないフォルダが両方あるんですが…、大丈夫なんでしょうか?? そうこうしているうちに、なんか消したはずのフォルダが出てきたり、そこに入れてないはずのファイルが入ってたり入ってなかったり、どんどん泥沼にはまっていって… ダメだ…、このプロジェクト、破棄しよう… 仕切り直し。 バックアップからクローンを作成してパッケージ最初からやり直し。 ディレクトリ名が長いのは C:\Users\XXXX\Documents\Unreal Projects にプロジェクト作ってるため、出だしから既に長いので、もっと浅いディレクトリにプロジェクトを作ることにしました。 さておもむろにパッケージ化 ↓ 失敗! ですよねー。 さっきも出てたかもしれないエラー。 [Script/Engine.RecastNavMesh]found in the DefaultEngine.ini file.This class has been moved.Plaese rename that section to[/Script/NavigationSystem.RecastNaviMesh] だと? 英語だ…(あたりまえ) 絶望しつつググってみるとアンサーハブにあった! 英語だ…(あたりまえ)

Level Streaming完全に理解した(わかってない)

イメージ
今作っているゲームのアルファ版ではロード画面の制御にマーケットプレイスで売っていたブループリントを使っていたのですが、バトルとかイベントの部屋はサブレベルにすれば管理が楽だなぁなどと思っていて、マケプレで買ってきたやつはドキュメントも英語だからよくわからないなぁと思っていて、やはりレベルストリーミングとかちゃんと覚えて自分で作ってみよう!と勉強しなおしました。 やりたいことは ・マップ移動の時Now Loadingを入れたい ・作戦中のマップを『フィールド』『バトルフィールド』『イベント部屋』『ボス部屋』などをサブレベルで分け、作戦ごとに必要なものを入れ替えパッキングしたマップを作りたい。 ・GameModeは作戦に入ったら(Loadしたら)クリア状態にしたい。 というわけで… ネットでは「ロード画面を入れるにはどうしたらよいですか?」的な質問に 「マップは全部サブレベルで管理してサブレベルを読んでるときにパーシスタントレベルでロード画面を出すのがよい」的な回答をよく見かけるのですが…、 やっぱり【待機場所マップ】⇔【本チャンゲームマップ】の行き来はキレイさっぱりOpenLevelしたい!ということで 【本チャンゲームマップ】には パーシスタントレベルに 「ロード画面ウィジェット」 サブレベルに 「本チャンゲームマップ」 を置いて パーシスタントレベルのBegin Playに ロード画面 を表示してから 本チャンマップ を読み込む という形をとって、【待機場所マップ】からOpenLevelで【本チャンゲームマップ】を読み込む方法を試してみました。 具体的には TPSテンプレートを作り、そこにデカめのマップ(ここではSoul:City)を入れて パーシスタントレベルに ロード画面 サブレベルに Soul:City を入れた【LoadAndMap】レベルを作り、待機場所マップから【LoadAndMap】をOpenLevelして ロード画面 からの~ Soul:City をがうまく動くかやってみました。 うまくいけばNowLoadingで待たされてSoul:Cityにつながるはずですが、懸念点はこの方法だと最初のNowLoadingが出るまでも微妙に時間がかかっちゃってロード画面の意味をなさない可能性があるというこ

Lightmass完全に理解した(わかってない)

イメージ
Lightmass…、難しいですよね。 複雑な光の計算を事前にやってくれる、と。 公式のサンプルを見ても劇的な違いがあるわけでもなく、実際にやってみても何が変わったのかわからない…。 さて、今作っているゲームですが、フィールドは自動生成でブロック化したモジュールをスポーンさせてます。 屋内をフィールドにしているので閉ざされた空間にディレクションライトなどが届きません。 なのでポイントライトを置いて建物内を照らすようにしています。 が、ライトの配置がすごい難しい!! ステーショナリーライトは重複回数が限られているのでスタティックライトを多用したいところですが自動生成でブロックをスポーンさせるとスタティックライトが焼き付けられません。(焼き付ける方法あるの??) ステーショナリーライトだけで頑張っても部屋の隅とかがすごく暗い。 ライトを増やすと重複が増えるし、照らす範囲を広げても重複が増えるし…。 ということでライトマス。 色々実験してみてわかりました。 あーそーゆーことね。(たぶんわかってない) スタティックライトはムーバブルなオブジェクトに効きません。 なのでスポーンさせたアクターにももちろんスタティックライトは効きません。 ステーショナリライトで 左からムーバブルの椅子、スタティックの椅子、椅子アクターのスポーンポイント スタティックライトに変えてライトをビルドして実行すると… ムーバブル椅子とスポーン椅子が真っ黒! ここで、オブジェクトのある範囲をライトマスで囲ってライトをビルドすると… この空間をライトマスで囲ってライトをビルドして実行 なんということでしょう! ムーバブルメッシュやスポーンさせたアクターに光が当たってます!(ただし影は入りません) なるほどそういうことなんですねー。 そういう理解でいいんですかね? でもこれでざっくりと全体のライトの雰囲気を調整できるようになりました!

PS4コントローラーに対応する2

イメージ
昨日の PS4コントローラーに対応する ではうまくいかなかったのですが、いろいろ調べてみるとkatzeさんの作った DirectInputPadPlugin というプラグインがいい感じにDirectInputに対応するみたいなので試してみました。 UE4に入っているWindows RawInputのプラグインと比べてみると… ・各種設定はちゃんと揃っていて不具合は無し、導入後はあまり調整の必要はなさそう ・プラグインをソースからビルドする必要あり ビ、ビルドだと…!? 一気に難易度上がった!! ただUE4に入ってるプラグインのままだとオフセット値の設定やデッドゾーンの設定、キーボード入力時とパッド入力時で処理を変える必要もありそうだしXinputとDirectInputのパッドでも処理を変える必要がありそう(プラグイン設定の中ででも完結しそうではあるが)、なによりボタンが効きが悪いし上下左右方向ボタンが対応してない。 やるしかないか…、ビルド… というわけでやってみました! ビルドの方法も こちら に書いてあります。 いきなりVisualStudioのインストールから始まりますが、説明が十分ですごくわかりやすく、書いてる通りにやれば…、できました!! 注意点は特にないですが、DuakShock4を接続してからUE4を立ち上げないと認識しないというところくらいですかね。 さて、そのままTPSテンプレートで動かしてみましたが、スティックの動作はインプット設定をいじらずそのままいけました。 凄い!! ABXYボタンはXinputのものとは違ってるようですが、BPのSetKeyMapというノードで設定すればOK。 凄い!! LRトリガーの数値はXinputは0~1でしたがDS4では0.5~1が返ってきていたのでこちらもSetKeyMapで設定。 若干トリガー中央付近の0.5範囲が広いですが、射撃ボタン的な利用方法では問題ないかと。 インプット設定はテンプレートのままでOK AのジャンプボタンとRトリガーをリマップ というわけでこれをもとに今作成中のRPGに組み込んでみます。 Katzeさんありがとうございました!!