わかゲームスタジオ

ゲーム制作初心者専門学生の備忘録

続 UE4 ラグドール化してから元に戻す方法

前に投稿したブログで無理やり実装した箇所の解決策がわかったので、これもまた残しておこうと思います。

 

前回の記事↓

wakagamestudio.hatenablog.jp

 

今回できること↓

youtu.be

①Meshのコリジョン設定を見直す

f:id:WakaiGames:20210604170028p:plain

  • 初期設定のままだと床をすり抜けてしまいますのでコリジョンプリセットをCustomにします。
  • CollisionEnabledをCollisionEnabledに設定します。
  • CapsuleCollisionに反発されると困るので、Pawnは無視に設定します。

ラグドール化する

f:id:WakaiGames:20210604173903p:plain

  • ラグドール化したい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です。

    f:id:WakaiGames:20210604173038p:plain

UE4 ”もっと楽に”ゲームパッド、マウス、キーボード全てでUIを操作する

 

wakagamestudio.hatenablog.jp

 前回の記事ですが、、、もっと楽に実現する方法が投稿後1分で見つかりました。

Widgetを作成、表示する

f:id:WakaiGames:20210512012926p:plain

  • PawnクラスでWidgetの作成、表示、マウスカーソルの表示をします。

Widgetにボタンを設置する

f:id:WakaiGames:20210512013402p:plain

  • 必要イベントは下記のとおりです

f:id:WakaiGames:20210512013219p:plain

これだけでできました。

はい、以上です。

UE4 ゲームパッド、マウス、キーボードすべてでUIを操作する

今回は表題の通り、ゲームパッド、マウス、キーボードすべてで入力を受け付けるようにしてみます。

追記

先にこちらをご覧ください。

wakagamestudio.hatenablog.jp

 

↓今回のサイトでできること↓

youtu.be

Ver.4.26.2

 

Widgetを用意する

f:id:WakaiGames:20210512000428p:plain

  • Widgetを作成し、Imageを3つ設置しておきます。
  • 今回は仮にStart、Option、Endとしておきます。

②列挙体を作る

f:id:WakaiGames:20210511224553p:plain

  • 順番、内容は①で作った選択肢と同様のものにします。

Widgetに関数を追加する

f:id:WakaiGames:20210511230023p:plain

  • SelectColorは現在選択しているか判定します。選択していれば白、選択していなければ黒です。
  • 引数ターゲットにはImageのオブジェクト参照、引数AにはE_UISelectを指定します。

Widgetにノードをつないでいきます

f:id:WakaiGames:20210512001705p:plain

  • 上が入力されたとき、Enumは1つ上、つまり-1します。
  • 選択するノードではEnumの1番目であるか判定をしています。1番目である場合、Enumの一番最後に飛ぶようにしています。
  • 下が入力されたとき、上記の逆をします。
  • 選択するノードではEnumの末番であるか判定をしています。末番である場合、Enumの1番初めに飛びます。
  • カスタムイベントSelectChangeでは③のSetImageColor関数をImage分実行します。Aには対応した選択肢を入れます。
  • 決定処理は列挙体によって処理を分岐するだけです。
  • ConstではSelectChangeを実行し、初期値(この時はStart)が選択されているようにします。

⑤インプットセッティングを登録する

f:id:WakaiGames:20210512003032p:plain

  • プロジェクト設定のインプットから登録をしていきます。
  • 登録方法は初期にキーボートマークが書かれている四角い箱を押してから登録したいキー、もしくはボタンを入力すると簡単に登録できます。

    f:id:WakaiGames:20210512003130p:plain

    ここです。

⑥PawnクラスのBlueprintを作る

f:id:WakaiGames:20210511232721p:plain

  • Widgetの表示はいつも通りです。
  • インプットアクションからWidgetの関数を呼びます。

⑦カメラとBP_Sampleをレベルに設置する

f:id:WakaiGames:20210511233313p:plain

⑧BP_Sampleの詳細設定を変更する

f:id:WakaiGames:20210511233604p:plain

  • AutoPossessPlayerをPlayer0にすればGameModeに設定しなくてもPlayer、つまり入力を受け付け、操作可能になります。

⑧実行時のカメラを指定する

f:id:WakaiGames:20210511234601p:plain

  • LevelBlueprintにノードを追加します。
  • CameraActorはLevel上のカメラアクターを選択した状態で

    f:id:WakaiGames:20210511234257p:plain

    右クリックを押すと出せます。
  • Set View Target With Blendノードは右上の「状況に合わせた表示」のチェックと外さないと出てきませんので注意です。

f:id:WakaiGames:20210511234051p:plain

 

とりあえずここまででWSキー、ゲームパッドの左スティックの上下で選択はできるはずです。

youtu.be

Widgetにボタンを追加する

f:id:WakaiGames:20210512000634p:plain

  • Canvas下の末端に置き、アンカーは四隅に設定
  • オフセットは0,0,1,1
  • アピアランスのColor and Opacity、Background ColorのAlphaを0に設定し透明にします。(画像では構造がわかりやすいようにColor and Opacityのみ透明にしています。)

⑩ボタンのイベントを追加する

f:id:WakaiGames:20210512005640p:plain

  • 必要なイベントはOnClickedとOnHovered、On Unhoveredです。
  • 各イベントは下記のようにつなぎます。

    f:id:WakaiGames:20210512010735p:plain

    BoolのOnHovered変数を新規追加。OnClickedは決定OnHoveredは選択、On UnhoveredはOnHoveredをfalseです。

⑪マウスで選択しているときの不具合を直す

f:id:WakaiGames:20210512011140p:plain

  • マウスカーソルでボタンにオーバーラップしていない状態でも選択できる不具合を解消します。
  • IsGamePadは新規変数です。

    f:id:WakaiGames:20210512011401p:plain

    PawnクラスでWidgetの新規変数の値を設定します。

⑫マウスカーソルを表示する

f:id:WakaiGames:20210512004928p:plain

  • PawnクラスのBeginPlayに上記を追加します。

これでゲームパッド、マウス、キーボードすべてでの入力ができます。

youtu.be

 

 

UE4 GamePadとKeyboardどちらの入力かを判定する

UIの切り替えをしたくていろいろ調べてたんですけどC++じゃないとできないと出てきて諦めてたんですけど、できました!

 

GamePadとKeyboardどちらの入力か取得ができればこんなことができちゃいます。


GamePadかKeyboard

 

これだけ!

f:id:WakaiGames:20210213185626p:plain

超簡単!すごい!

UE4 Material Parameter Collections が超便利

今回はMaterial Parameter Collectionsを使ってみますよ。

こんなことができるようになります。


Material Parameter Collections

スライダーの値を複数のマテリアルParameterに入れて一斉編集しています。

 

公式ドキュメント↓

Material Parameter Collections | Unreal Engine Documentation

 

①マテリアルパラメータコレクションを作成する

f:id:WakaiGames:20210213175116p:plain

  • このマテリアルパラメータコレクションで値を編集していく感じです。

 

②パラメータを追加

f:id:WakaiGames:20210213175536p:plain

 

③マテリアル内でMPCの変数を使用します

f:id:WakaiGames:20210213175516p:plain

  • ノードはCollectionParameterで出せます。

 

④MaterialParameterCollectionの使い方

f:id:WakaiGames:20210213180425p:plain

  • Parameter NameでCollectionに作成したもののうち一つを選択し使用します。

 

これを使うと以下の動画のように使用できます。

UI部分の一斉フェードやポストプロセスマテリアルの値も編集できちゃいます。


MPCSample

Unity UIアニメーションを使いまわしたい

今回はUnityでUI演出を作成するときに、よく使う演出(テキストの点滅とか)を使いまわす方法です。

とりあえずCanvasを作成し、AnimatorControllerをアタッチしたImageを4個作成しておきます。

f:id:WakaiGames:20201210070454p:plain

AnimatorControllerの中身はこんな感じです。
f:id:WakaiGames:20201210070806p:plain
 

①それぞれのAnimationを設定する

f:id:WakaiGames:20201210071653p:plain
ColorパラメータはRGBAをそれぞれ選択、Deleteで削除することができます。
こうすることで色の違うUIのAlpha値のみアニメーションさせたりできます。
f:id:WakaiGames:20201210071905p:plain
f:id:WakaiGames:20201210072238p:plain
f:id:WakaiGames:20201210072432p:plain

②実験用に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 ラグドール化してから元に戻す方法

かなり前に作成したゲームで、ダメージ表現にラグドール化を使い一定時間後に復帰する仕様を実現しました。

その時に少し悩んだことがあったので備忘録として残しておきます。

使用したゲームはこちら↓

wakagamestudio.hatenablog.jp

 

↓今回できること↓

 

ではやっていきます。

①通常通りラグドール化、復帰を書く

f:id:WakaiGames:20201205023539p:plain

すると

復帰した時に軸が曲がっていたりCapsuleComponentがずれていたりと不具合が多いです。

これを解消していきます。

②CapsuleComponentの位置を調整する

f:id:WakaiGames:20201205021803p:plain

  • Bool変数を追加し、現在ラグドール化しているかを保存します。
  • Tickでラグドール化中ならCapsuleComponentの位置をpelvisの位置に上書きし続けます。

こうすることで、CapsuleComponentがメッシュに付随するようになりました。

③復帰後のメッシュのずれを解消する

f:id:WakaiGames:20201205024452p:plain

  • ラグドール時、メッシュのRotataionとLocationをCapsuleComponentの値から代入し続けます。

この方法はきっと非効率なので、もっと良い方法を知っている方がいれば教えてください。

これでラグドール化してから非ラグドールに戻っても問題なく動作するようになりました。

以上です。

ラグドール化から戻ってもメッシュがCapsuleComponentに付随しない原因はわからず。何か知っている方がいらっしゃれば教えていただけると幸いです。