UE4で一本出してみて困ったこと (えーでるわいす なる)

update : 2015/1/27

こういうゲームつくった


 
ゲームのHPはこちら。
 
UE4でリリースまで一本やってみて、ここどうにかならんかなーと思ったとこなど書いてみます。
なお、使用バージョンは4.2~4.4です。 既に解決されてたり、こちらの勘違いもあるかもしれません。

 
・15/1/27更新: UE4開発元のEpicさんからコメントを頂いたのと、ヒストリア佐々木さんのTL補足を追記

ブループリント

BP全体

・変数や関数、コラプト名の小文字、大文字の変更が効かない
  一度打ち込んでしまうと、確定しなくても小文字、大文字は変更できなくなる。
  例えば、"amema" と一度打つと、消して "Amema" と打ち直しても確定すると "amema" に変わる。

>Rob(Epic):4.5版でこの現象は修正されました。

・クラス内のメンバ変数は並びを入れ替えできるが、メンバ関数はできない(作った順になる)
  せめてアルファベット順で並べたりしてくれれば、set や get などが並ぶのですっきりするんですが。

>Jun(Epic):こちらは今後の課題ですね。

・構造体のメンバの並べ替えができない(作った順になる)
  後からの変更や追加に弱い (メンバ追加したら構造体アクセスしてるノードが外されてたりする。
  あとメンバ追加するとよくプロジェクト自体が壊れる) ので、何のための構造体かよくわからん。

>Shun Sasaki @s_ssk13:今は出来る様子。BP構造体はVer4.2くらいから入った機能なので、
  多分この頃は安定してなかった。確かその後もちょくちょくBugFix入っていたはず。

・同じクラス内だと全ての関数でローカル変数名の重複ができない
  つらい。

>Rob(Epic):4.3版まで。4.4版から問題ない。

・ローカル変数に初期値が設定できない
  したい。

>Rob(Epic):ローカル変数はDefaultの値がありませんが、関数を呼ぶときに、
  最初にローカル変数に値をAssignするとだいたい同じことじゃない?
>Jun(Epic):4.7から対応予定です。

・コラプトだとローカル変数が使えず、関数だとタイムラインが使えない
  これは仕方ない気もする。
 
・処理優先度を指定したい
  並列なのかなんなのか分からないですが、4.2から4.3に上げた時に
  キャラクターBPとアニメーションBPの処理順が逆転したことがあった。
  処理順は決まってないと困る箇所がいくらかあるので優先度を指定したい。

>Shun Sasaki @s_ssk13:TickGroupというので操作できる。のだけど、
  今見たらBPには公開されてなかった。これBPからいじれても良い気がする。。。
  特にここで挙げているように、AnimBPとの処理順はパッと反転しないように出来る方法ないものかな。
>Jun(Epic):現状のUE4ではできないです、タスクやスレッド的なものは現状検討中ですが、
  まだ確定的な情報をお伝えできるレベルにはなっておりません。

継承

・途中でクラスの継承を変えようと思った時にしんどい
  あるクラスを、基底とその下の2つに分けようとした時とか。

>Shun Sasaki @s_ssk13:BPのクラスもBPエディターのBlueprintPropsをクリックしたとき
  Details(詳細ウィンドウ)に表示されるParent Classで変更できる。
  バイナリーだから途中で変えるのは怖いというのは分かる。
>Jun(Epic):これは他の言語でもしんどいような気もしますが、
  どのようなクラスにどのように分けられるかわからないので簡単な対応は難しいかと思います。
  場合によっては逆に基底側を分離・変更した方がやりやすいかもしれません。

・仮想関数がない
  カスタムイベントで代用できるけど、かなり面倒なことになったケースがあった気がする。

>Jun(Epic):ブループリントインターフェースは仮想関数のように利用可能です。

データテーブル

・CSVのデータテーブルが、C++で定義しないと使えない
  C++介さなくてもできないもんでしょうか?

>Rob(Joeからの情報)(Epic):4.6版でCSVをインポートできます。
  1.User Defined Structureを作って、データの形を定義する。
  2.CSVをブラウザーにドラッグするとダイアログが出る。
  3.作ったStructureを選択すると、Data Tableとしてインポートされます。

・テーブルが作れないので、パラメータ定義とかしようとすると大変なことになる
  ゲームの調整段階になるとしんどい。

>Shun Sasaki @s_ssk13:分かる! このプラグイン、いつか作りたい。しかし手が回らない;;
  CSVのを参考にすればパッと作れそうなんだけどなあ。
>Jun(Epic):CSVやJSONの情報にアクセスできるので、それで代用できないでしょうか?

デバッグ

・#ifdef DEBUG的なものがない
  デバッグ用、開発用の機能を作る時につらい。
  せめてパッケージングの Development, Shipping が判定できたりすると助かる。

>Shun Sasaki @s_ssk13:欲しい! デバッグ用の機能をまとめておく
  CheatManager(そもそもBPに公開されてない?)というのがあるが、それだけじゃ足りない。
>Jun(Epic):今後の課題として検討させていただければと思います。
>alwei @aizen76:Is Packaged for Distributionノードで開発中かパッケージングされたものかの判定はできますね。

・ブレークポイントで止めても変数の中身が表示されないものが多い
  これはよく分からない。 (選択されてるオブジェクトは正しいと思うんですが)

>Jun(Epic):具体的にAnswerHubやForum等にどのような変数が
  どのような手順で表示されなかった等の情報をいただけると助かります。
>なる:花咲妖精UEのプロジェクトでは後半BPのコンポーネント詳細が表示されないなど、
  そもそも破損してるっぽいデータを含んでいましたので、そのせいもあるかもしれません。

運用

・BP変更したら、呼び出してるBP全ても実際に変更されてしまう
  例えばC++であれば変更ソースだけの変更で済むわけですが、
  BPの場合は参照側も全て変更かかってしまうため、複数人で開発してればコンフリクト起こすし、
  ちょっとした変更でほぼ全てのBPがコミットされるのが大きくなってくるとつらい。
  設計が悪いとか言われそうですが。 どう作ればいいのかっていうとよく分からない。

>Shun Sasaki @s_ssk13:同じく困る。大体の場合、変更したファイル以外は
  UPしないでも動作はする気がするけど。何やってるか解析した人いたら、ぜひ。
  BPInterfaceを噛ませれば多分大丈夫なのだけど、それはめんどくさいw
>alwei @aizen76:自分はBPインターフェース使ってます。
  いやC++でもそういうもんだと思ってやってるんですがw
  インターフェースはもっと活用されるべきだと思ってます。
>Shun Sasaki @s_ssk13:関数の引数等、Interfaceが変わった時は仕方ないですが、
  変わる必要性の無い時まで変更かかってる気がするんですよねー。
  ちなみに自分はキャスト使いまくりですw
  C++でも、実装全く無いインターフェイスだけが実装されているクラスはあまり使わなかったり。
>Jun(Epic):alweさんの仰る通り、そのような場合はインターフェースが有用かと思います。

入力

機能

・XInputにしか対応してない
  残念ながらDirectInputのパッドは多いため、対応するべきかなと思います。

>Jun(Epic):現状は対応できておりませんが、対応や対策を検討してみたいと思います。

・キーコンフィグの概念が無い
  UE4だと例えばAttackとかJumpとかボタンは開発者が設定するので、
  その判定自体がエディットされた状態で届くならそれで開発側としては問題なさそう。
  (副次的に発生する問題はありそうですが)
  
  あとはユーザー向けのエディットする機能もサポートが必要かと思われます。
  Unityは起動ランチャーに標準で用意されてますが、機能も分からなければ推奨位置も分からないので、
  無いよりマシではあるものの下策かなという感じ。
  

>Jun(Epic):これは基本的にプロジェクトのAxis MappingsとAction Mappingsと同じではないですか?
>Shun Sasaki @s_ssk13:内部的にはセーブデータ的に保存できるiniファイル
  (プレイヤーが変更したパラメータはSaved/Config以下に保存)がある。
  このiniをテキストエディタで変えちゃえば可能なはずだけど、まだBPだけでその機能は使えないかも。
>なる:開発中の話ではなくて、製品でユーザーがキーエディットすることを想定した構造が欲しいという話ですね。
  ある程度標準化できる部分ではないかなぁと。

・デバッグ機能の任意割り当てがしたい
  具体的にはポーズとコマ送りをパッドに割り振りたい。
  デバッグ用なので、Shippingでは無効になる様にしたい。

>Shun Sasaki @s_ssk13:したい。せめてConfigurationによるSwitchノードがあれば。。。

・コマ送り時に押している入力をちゃんと反映させてほしい
  フレーム単位での調整やデバッグをする場合に必須。
 

BP

・任意タイミングで入力を判定できない
  「押した瞬間」と「離した瞬間」のイベントでの入力判定しかできませんが、
  これだと 「今押されているか」 と 「今離されているか」 が分かりません。 非常にまずい。
  最低限、任意タイミングでの「押している・押した瞬間・離した瞬間」の3つの取得が必要かと思います。
 
  欲を言うと、「任意時間押し続けている」(メニュー等で選択項目を動かす時とか)
  「押した瞬間から任意時間trueになる」(同時押し判定用) なんかもあると素敵。

>Rob(Epic):押した瞬間にBoolをTrueにセットし、離した瞬間にFalseにする手があります。
  あるいはPlayer Controllerからキーやボタンが押しているかをクエリする関数を使うと出来ます
  (IsInput Key Down)
>Shun Sasaki @s_ssk13:これは可能。GetPlayerController>GetInputAnalogKeyStateで今押しているか。
  同じくPC>GetInputKeyTimeDownでそのキーを何秒押しているかが取得できる。

・入力が取れないBPが多い
  メニューや、ゲームフローの入力待ち、デバッグ機能などで
  GameModeやレベルBPから入力を取りたいこともある。

>Shun Sasaki @s_ssk13:これも設定変更可能。DefaultsのAutoReceiveInputを変更すればOK。

モデル

・パーツの表示On, Offがしたい
  末端の飾りを付けたり消したりすることは現状でもやりようがありますが、
  例えばキャラクターの状態によって胴体部分だけ差し替えたいとかは無理なので、
  モデル以下のパーツ区分、Maya上で言うメッシュ的な単位で表示On, Off等のアクセスをしたい。
  (花咲か妖精UEではマテリアルのアルファで対応しましたが、マテリアル分けないといけない)
 

アニメーション

・1つのアニメーションアセットを複数のスケルトンに適用できない
  共通骨を持つスケルトンには同じアニメーションを流せないとちょっと困る。
  例えばダメージモーションなどが人間共通だったりする場合、
  キャラが増える度にアニメーションアセットをコピーしていくのかとか、
  元モーションが修正されたらコピーした分全部またコピーし直すのかとか。
  投げ技のやられ側モーションも全スケルトンにコピーしていくのかとか…。

>Shun Sasaki @s_ssk13:これはホントに困る! 自分もまだ有効な解決方法が見つかってない。
>Jun(Epic):アニメーションの共有に関しましては4.5、4.6と向上してきておりますが、
  これからも向上させたいと考えています。

・アニメーションBPの継承ができない
  例えば全キャラクター共通のアニメーション制御があった場合どう共通化すればいいのか分からない。

>Jun(Epic):アニメーションBPの継承はできていると思うのですが、
  具体的な問題点をお伺いできると助かります。

・ステートマシンの現在ステートをBP等外部から変更したい
  ダメージ遷移や空中制御(落下とか)、デモに入った時のリセットとか、
  繋がってないステートへ強制的に飛ばしたい時は結構あるのでできないと困る。
  花咲か妖精UEではダメージ遷移はAnim Graphでダメージ用のステートマシンを用意し
  通常のステートマシンを上書きしたが、これではダメージからの戻り先などが制御できないしやっぱり困る。
 
・ステートマシンからのイベント通知は即時やってほしい
  イベント通知が後で処理される様なので、正確な遷移に1フレームずつ要してしまう。
  A, B, Cの3つのステートがあったとして、
  イベント通知が即時であったなら A→B→C とCまで行くべきなのに
  B で1フレーム止まってしまったりするケースがある
 
・Anim Notify, Anim Notify Stateにパラメータが追加できない
  例えば Anim Notify State で攻撃判定を設定したが、通知にパラメータが仕込めないため
  これでは攻撃の種類の数だけ Anim Notify State を作らなければならない。
  IDが1つ設定できるだけでも非常に便利になります。

>Shun Sasaki @s_ssk13:おそらく残念ながらC++拡張。
  ただ、AnimNotifyは拡張前提の作りになっているから、そこまで難しくはい。

・アニメーションに仕込んだ通知等を、ループモーション時初回にしぼりたい
  例えばループ時に通知タイミングへ来る度にエフェクトやSEを鳴らしたくない。初回だけにしたい。みたいな。
 
・ペルソナの表示を任意fps(60fpsとか)ベースにできる様にしてほしい
  和製アクション(特に格ゲー)はやはりフレームベースな方が作りやすい。
  ※表示単位をフレーム基準にしたいだけなので可変のままで良い。
  エンジン自体が秒ベースなのは変えようがない…ですよね。
 

エフェクト

・ジョイントにアタッチした時の方向やスケールの影響の仕方がよく分からない
  エフェクトの正面が何軸で、ジョイントの正面が何軸か…という辺りがもしかして決まってるのか
  どうでもいいのか分からなかったというか、うまく生成方向を制御しきれないので
  仕方なく全方位に出してごまかしたエフェクトがちょくちょくあった。

  花咲か妖精UEは右向き時スケール-1になってるのが原因な気がしますが、
  それがあるないに関わらず、スケールの影響無効オプションは欲しい。
 
・Vector Fieldをランダム回転させたい
  回転機能はあるのにランダム回転は無いので、パーティクルが全て同じ出方をしてしまって悲しい。
 
・ペルソナから区間発生させた場合、区間から外れた時全てパッと消えてしまう
  エフェクトの生成を止めるだけにもできる様にしてほしい。
 

UI

メニューなどサポートする仕組みが導入されるそうなので、あまり参考にならないかも。
 
・HUDクラスが同時に1つしか使えない
  複数使える様にしてほしい。
 
・HUDクラスで3Dオブジェクトが使えない
  とは思ったもののどうすればいいのか。
  コンポーネント登録したものがUIカメラに描画されるとか。

>Jun(Epic):UIと3Dの組み合わせは、将来的には何らかの提案ができればと思います。

・メニューを作るのがあまりにもしんどい
  今後の新たな仕組みに期待。

>Jun(Epic):4.4以降から実装されているUMGというシステムで、
  UIとブループリントの組み合わせでメニューが組めるようになっています。

サウンド

・BGMのイントロループ対応
  途切れないイントロループを実現するのが現状不可能。正直あり得ないレベルの問題なので本当にどうにかしてほしい。
  Wavのループ情報のインポートに対応してくれるだけでいい。

>Shun Sasaki @s_ssk13:残念ながら。サウンド系はUE3時代から弱かった。
  「音を鳴らす」以外のことをしたければCRIやWWiseなどのミドルウェア導入がオススメ。
  いまはどちらもインディーライセンスあったはず。
  でもまだプラグイン形式でのインテグレートがなかったか?
  補足、プラグイン形式でなければ、CRI(ADX2) / WWiseともにインテグレートあったはず。

その他

・コマ送りで進む時間を指定したい
  現状可変フレームで最短時間が進みますが、進まなすぎて正直あんま意味ないので、
  60fpsベースで1フレーム進める(16.667msec)とかができる様にしてほしい。
 
・Exeの階層が深い
  Exeはルートに出してほしいなぁ…。
  

>ver.4.6で改善された

・多言語対応
  こちら側で日本語か英語かの変数作って、各テキストをBPから変更して対応した。
  できればロケールなりユーザー設定値なりで切り替えられる様になっててほしいので、
  UE4のシステム側に言語設定値を用意してほしい。

>Shun Sasaki @s_ssk13:Ver4.1から「Translation Editor」というのが搭載されているが、
  ずっとExperimental(実験的)のまま。。。あれどうなったんだろう。使えるのかな。
>Jun: エディタの翻訳にTranslation Editorを使っています。

・固定フレーム

>@Eagle966:UE4はフレームベースにできないものかな~ 秒ベース絶対イヤやねん…
>Shun Sasaki @s_ssk13:プロジェクトセッティングスのどこかに
  フレームレートを固定するパラメーターがあったような気がしますー
 
>なる補足:これは確か固定フレームにしたいわけではなく、可変フレームでいいけど
  表示単位を秒ではなくフレーム(60fps基準で1.2frmとか)にしたいという話だったはず。
  自分もそうしたい。