続 UE4 ラグドール化してから元に戻す方法
前に投稿したブログで無理やり実装した箇所の解決策がわかったので、これもまた残しておこうと思います。
前回の記事↓
今回できること↓
①Meshのコリジョン設定を見直す
- 初期設定のままだと床をすり抜けてしまいますのでコリジョンプリセットをCustomにします。
- CollisionEnabledをCollisionEnabledに設定します。
- CapsuleCollisionに反発されると困るので、Pawnは無視に設定します。
②ラグドール化する
- ラグドール化したいBPに処理を追加します。
- FlipFlopは実行されるたびにAとBを切り替えてくれるノードです。
- Aが実行されたときはMeshのSimulatePhysicsをTrueに設定してMeshをラグドール化します。
- Bが実行されたときはMeshのSimulatePhysicsをFalseに設定します。
- MeshをCapsuleComponentにアタッチします。(Transformは全てKeepWorldです。)
- MeshのLocationとRotationを初期値(Local)に戻すため、SetWorldLocationAndRotationでCapsuleComponentとの相対位置に設定します。
- LocationとRotationにそれぞれ引いている数はComponentのMeshに設定したLocationとRotationです。
UE4 ”もっと楽に”ゲームパッド、マウス、キーボード全てでUIを操作する
UE4 ゲームパッド、マウス、キーボードすべてでUIを操作する
今回は表題の通り、ゲームパッド、マウス、キーボードすべてで入力を受け付けるようにしてみます。
追記
先にこちらをご覧ください。
↓今回のサイトでできること↓
Ver.4.26.2
①Widgetを用意する
- Widgetを作成し、Imageを3つ設置しておきます。
- 今回は仮にStart、Option、Endとしておきます。
②列挙体を作る
- 順番、内容は①で作った選択肢と同様のものにします。
③Widgetに関数を追加する
- SelectColorは現在選択しているか判定します。選択していれば白、選択していなければ黒です。
- 引数ターゲットにはImageのオブジェクト参照、引数AにはE_UISelectを指定します。
④Widgetにノードをつないでいきます
- 上が入力されたとき、Enumは1つ上、つまり-1します。
- 選択するノードではEnumの1番目であるか判定をしています。1番目である場合、Enumの一番最後に飛ぶようにしています。
- 下が入力されたとき、上記の逆をします。
- 選択するノードではEnumの末番であるか判定をしています。末番である場合、Enumの1番初めに飛びます。
- カスタムイベントSelectChangeでは③のSetImageColor関数をImage分実行します。Aには対応した選択肢を入れます。
- 決定処理は列挙体によって処理を分岐するだけです。
- ConstではSelectChangeを実行し、初期値(この時はStart)が選択されているようにします。
⑤インプットセッティングを登録する
- プロジェクト設定のインプットから登録をしていきます。
- 登録方法は初期にキーボートマークが書かれている四角い箱を押してから登録したいキー、もしくはボタンを入力すると簡単に登録できます。 ここです。
⑥PawnクラスのBlueprintを作る
⑦カメラとBP_Sampleをレベルに設置する
⑧BP_Sampleの詳細設定を変更する
- AutoPossessPlayerをPlayer0にすればGameModeに設定しなくてもPlayer、つまり入力を受け付け、操作可能になります。
⑧実行時のカメラを指定する
- LevelBlueprintにノードを追加します。
- CameraActorはLevel上のカメラアクターを選択した状態で 右クリックを押すと出せます。
- Set View Target With Blendノードは右上の「状況に合わせた表示」のチェックと外さないと出てきませんので注意です。
とりあえずここまででWSキー、ゲームパッドの左スティックの上下で選択はできるはずです。
⑨Widgetにボタンを追加する
- Canvas下の末端に置き、アンカーは四隅に設定
- オフセットは0,0,1,1
- アピアランスのColor and Opacity、Background ColorのAlphaを0に設定し透明にします。(画像では構造がわかりやすいようにColor and Opacityのみ透明にしています。)
⑩ボタンのイベントを追加する
- 必要なイベントはOnClickedとOnHovered、On Unhoveredです。
- 各イベントは下記のようにつなぎます。 BoolのOnHovered変数を新規追加。OnClickedは決定OnHoveredは選択、On UnhoveredはOnHoveredをfalseです。
⑪マウスで選択しているときの不具合を直す
- マウスカーソルでボタンにオーバーラップしていない状態でも選択できる不具合を解消します。
- IsGamePadは新規変数です。 PawnクラスでWidgetの新規変数の値を設定します。
⑫マウスカーソルを表示する
- PawnクラスのBeginPlayに上記を追加します。
これでゲームパッド、マウス、キーボードすべてでの入力ができます。
UE4 GamePadとKeyboardどちらの入力かを判定する
UIの切り替えをしたくていろいろ調べてたんですけどC++じゃないとできないと出てきて諦めてたんですけど、できました!
GamePadとKeyboardどちらの入力か取得ができればこんなことができちゃいます。
これだけ!
超簡単!すごい!
UE4 Material Parameter Collections が超便利
今回はMaterial Parameter Collectionsを使ってみますよ。
こんなことができるようになります。
Material Parameter Collections
スライダーの値を複数のマテリアルParameterに入れて一斉編集しています。
公式ドキュメント↓
Material Parameter Collections | Unreal Engine Documentation
①マテリアルパラメータコレクションを作成する
- このマテリアルパラメータコレクションで値を編集していく感じです。
②パラメータを追加
③マテリアル内でMPCの変数を使用します
- ノードはCollectionParameterで出せます。
④MaterialParameterCollectionの使い方
- Parameter NameでCollectionに作成したもののうち一つを選択し使用します。
これを使うと以下の動画のように使用できます。
UI部分の一斉フェードやポストプロセスマテリアルの値も編集できちゃいます。
Unity UIアニメーションを使いまわしたい
今回はUnityでUI演出を作成するときに、よく使う演出(テキストの点滅とか)を使いまわす方法です。
①それぞれのAnimationを設定する
ColorパラメータはRGBAをそれぞれ選択、Deleteで削除することができます。
こうすることで色の違うUIのAlpha値のみアニメーションさせたりできます。
②実験用にAnimationを再生するスクリプトを書く
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CallAnimation : MonoBehaviour { private void Start() { //赤色を点滅させる transform.Find("ImageRed").GetComponent<Animator>().Play("ColorAnim"); //青色を回転させる transform.Find("ImageBlue").GetComponent<Animator>().Play("RotationAnim"); //緑色を拡大、縮小させる transform.Find("ImageGreen").GetComponent<Animator>().Play("ScaleAnim"); //黄色を中央で上下させる transform.Find("ImageYellow").GetComponent<Animator>().Play("PositionAnim"); } }
このコードをCanvasにアタッチすると動くようになります。
こんな感じ↓
【わかゲームスタジオ】Unity UIAnimationSample
クリックで切り替わるようにしてみると、
【わかゲームスタジオ】Unity UIAnimationSampleChange
別のImageが同じAnimationを再生しても問題なく動作しているのがわかりますね。
こんな感じで、Animationから変更している値を持ったComponentを意識することでAnimationを使いまわし、同じようなAimationを作成する必要がなくなりますね。
UE4 ラグドール化してから元に戻す方法
かなり前に作成したゲームで、ダメージ表現にラグドール化を使い一定時間後に復帰する仕様を実現しました。
その時に少し悩んだことがあったので備忘録として残しておきます。
使用したゲームはこちら↓
↓今回できること↓
これでふにゃふにゃ化完成 pic.twitter.com/YQUIQS7kbt
— わかです (@wakaGameStudio) 2020年12月4日
ではやっていきます。
①通常通りラグドール化、復帰を書く
すると
ラグドール化は簡単にできるけど元に戻すのは簡単じゃない pic.twitter.com/vSP9BBfaNs
— わかです (@wakaGameStudio) 2020年12月4日
復帰した時に軸が曲がっていたりCapsuleComponentがずれていたりと不具合が多いです。
これを解消していきます。
②CapsuleComponentの位置を調整する
こうすることで、CapsuleComponentがメッシュに付随するようになりました。
Capsuleはついていくようになった pic.twitter.com/y3G1hjrZEe
— わかです (@wakaGameStudio) 2020年12月4日
③復帰後のメッシュのずれを解消する
- 非ラグドール時、メッシュのRotataionとLocationをCapsuleComponentの値から代入し続けます。
この方法はきっと非効率なので、もっと良い方法を知っている方がいれば教えてください。
これでラグドール化してから非ラグドールに戻っても問題なく動作するようになりました。
これでふにゃふにゃ化完成 pic.twitter.com/YQUIQS7kbt
— わかです (@wakaGameStudio) 2020年12月4日
以上です。
ラグドール化から戻ってもメッシュがCapsuleComponentに付随しない原因はわからず。何か知っている方がいらっしゃれば教えていただけると幸いです。