実装方法について質問させてください。
例えばフィールド(レベル)でNPCに話し掛けた際に、フィールドを背景に会話シーンWidgetを重ねて表示し、WidgetにはプレイヤーとNPCの顔を表示するような処理があるとします。
このような場合、Widgetに表示するキャラクターの顔はSceneCapture2Dを使って顔を撮影し、それをUserInterfaceマテリアルとして表示する実装をしています。
このような処理を実装する場合、私は会話シーンを管理する為のBP(以降、「会話BP」)を作成し、会話BPにSceneCapture2Dカメラを2台設置、それぞれのカメラの正面にSkeletalMeshを2つ配置することで、SkeletalMeshのキャラクターを入れ替えながら会話シーンを撮影するような手法を取っています。(キャラクターをAnimMontageで動かしたり、口パクをさせたりすると、それっぽく見えるので・・・)
今まではこの手法で会話シーンを実装してきて、何も疑問を抱かなかったのですが、いつも不満に思っていたのは、レベル上のどこかに「会話BP」を配置しないといけないという事です。
GameModeのBeginPlayでプレイヤーが移動できない遠くの座標に「会話BP」をスポーンさせ、会話シーンを表示する度に上記で配置した会話BPに処理を委ねるという感じになっております。
会話だけに限らず、戦闘シーンや、カットインなどでもSceneCapture2Dを使いたい事があるかと思いますが、一般的に上記のような「プレイヤーが移動できない遠くの座標にレベルとは関係ないBPをスポーンする」ような手段は使うものなのでしょうか?それとも、もっとスマートなやり方があるのでしょうか?
理想を言えば、フィールドのレベルの中で会話用のレベルに配置したSceneCaptureが使えれば良いのですが、レベルは同時に複数開けないという認識ですので、このような処理となっています。
皆様の実装方法等を含め、もっと良いやり方があるなどの情報を頂けると助かります。
宜しくお願いいたします。
1 Like
kiruru002
(kiruru002)
2
キャラクターたちの会話シーンを実現している中で
「SceneCapture2Dカメラ」x2
「キャプチャー用のSkeletalMesh」x2
「会話BP」
の配置が必要ということですね
「会話BP」というものがActor継承なのであれば座標込みで配置が必須です
しかしObjectを基底にすれば配置する必要はなくなります
その際、WorldContextが必要なノード(Delayなど)も使いたければ、こちらで解説されている手法もあります
それかWorldSubsystemもObject系なので利用できます
フィールドのレベルの中で会話用のレベルに配置したSceneCaptureが使えれば
レベルインスタンスという機能が新たに出てきたので、それがあれば、「配置する」代わりにレベルインスタンスの読み込み&アクター探索で処理ができそうですね
1 Like
@kiruru002
ご回答頂き有難うございます。
こちらの説明が分かりにくくて申し訳ありません。
「会話BP」の中に「SceneCapture2Dカメラ×2」と「キャプチャー用のSKeletalMesh×2」を含んでいる構成になっておりまして、具体的には
で解説している通りの構成となっております。
ご回答頂けた事で気付いたのですが、今回質問させて頂いている内容は2つの意味を含んでいたのかもしれません。
1つ目はSceneCapture2Dを使って、UMG上でアニメーションする会話シーンやカットイン(格闘ゲーム等で必殺技を放つと画面横からスライドしてくるようなイメージ)を作成したい場合、キャラクター画像キャプチャの為にレベル上にSceneCapture2DとSkeletalMeshを配置するしか方法は無いのでしょうか?(レベルとは関係ないバックグラウンドでキャプチャする事は出来ないのでしょうか?)
レベル上に配置が必須だとすると、様々なゲームではレベル上の見えない所で色々動いているのかな?と思い、2つ目の質問に繋がる事になります。
2つ目はレベル上には、上記のような理由で「仕方なくレベル上に置かなければならない要素」が置かれる事が普通なのでしょうか?という質問になります。
今回「会話BP」を例に回答を頂けたことで、ロジックだけでしたらObjectノードやWorldSubsystemを使用することでレベル上に配置する必要は無いという事を理解しましたので、こちらは解決致しました。
余談になってしまうかもしれませんが、「会話BP(Actor)」の中に「SceneCapture2Dカメラ×2」と「キャプチャー用のSKeletalMesh×2」を含めている理由については、SceneCaptureするのに結局レベル上にゴミを置かないといけないなら、会話処理を管理するBPとして「会話BP」を作り、これをレベル上に置いた方が管理的に簡単だったからという理由になります。
(レベル上にゴミを置く以外の方法があれば、このような構成にはしなかったと思います)
再度の質問になってしまい申し訳ありません。もし、良い方法がありましたら教えて頂ければと思います。
1 Like
T_Sumisaki
(T_Sumisaki)
4
レベルとは関係ないバックグラウンドでキャプチャする事は出来ないのでしょうか?
下記の記事が参考になるかと思います
記事で扱っているのはStaticMeshですが、SkeletalMeshに変更すれば実装は可能でしょう
上記のような理由で「仕方なくレベル上に置かなければならない要素」が置かれる事が普通なのでしょうか?
既存のComponentのみで実現できるシステム、と考えればそう悪くはないと思います
同一のLevelに存在することによるメリット、というのも少なからず存在するかと(今回のケースにはあまり当てはまらないようですが)
それを余分と見るか、必要と見るかは実装する人の心持ちと仕様次第ではないでしょうか?
2 Likes
seiko_dev
(seiko_dev)
5
※ほぼ雑談です
ざっくり言うと「同World型」と「別World型」のニ種類があって、それぞれメリットデメリットがある感じでしょうか。
同じ作品内で両方使う場合もあるかもしれません。会話カットインでは現場のライトやポスプロを借用したいので同World型、必殺カットインでは専用の仕立てが必要なので別World型にする等です。(作品によってはこの逆が求められるかもしれません)
例えば、おかずさんの作品は(今のところ)同World型かも。このツイートの仕組みですとか、replyにある会話(等の演出)に入る瞬間にゲームWorldを撮影して背景画像とし、ゲームカメラの描画も停止して負荷軽減…という技も参考にしたい所です。
同World型の「撮影スタジオをどこに確保するか問題」については、レベルデザイン時に撮影スタジオ確保用バミりCubeをパーシスタントに置く決まりにしておき、同座標にレベルインスタンスなりスタジオActorを出す…みたいなやり方が一つあるかもしれません。
もちろん「原点の地下や上空が常に安全」とか「サイドスクローラーなのでカメラの背後が常に安全」といった仕様が定まっている場合はそこで良いかと思います。
また、『SCARLET NEXUS』の手法も参考になるかもしれません。
2 Likes
@T_Sumisaki さん @seiko_dev さん 丁寧な回答ありがとうございます。
紹介して頂いたすとんりばーさんのブログに私の悩みと全く同じ事が書いてあったので、興味深く読ませて頂きました。
ここで紹介されている"PreviewScene"というものを知らなかったので、とても勉強になりました。
また、「レベル上の(プレイヤーから認識できない座標等に)マップとは関係ないActorを置く」という事についても、そこまで否定的ではない意見が聞けたので、とても参考になりました。
紹介して頂いた、おかずさんのツイートですが、まさに私が会話シーンを作るキッカケとなったものでした。当時は、これに似せた機能を実装しようと試行錯誤した結果「会話BP」を作成し、レベル上に配置するに至ったのですが、今になってその実装が不安になり質問させて頂いたという感じです。
SCARLET NEXUSの講演についても、UEを触り始めたばかりの頃に拝見した覚えがあったのですが、改めて講演を見てみたところ、当時とは違い解説している内容がすんなり頭に入ってきたので、こちらも参考にさせて頂きます。
まずは、すとんりばーさんのブログで紹介されているPreviewSceneを使った方法に挑戦してみて、自分の作品に活かせそうか検討してみようと思います。
回答を下さった皆様ありがとうございました。
1 Like
system
(system)
Closed
9
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.