ドアのコリジョン
今回はサークルでお話した内容の復習会となります。
前回、ドアが開いてもフレームに引っかかって入れない問題があったのでそれを解消します。解消法は単にドアとフレームを大きくさせるだけなので簡単に説明します。
ドアの拡大は、スイッチを作成した時の縮小方法と同じです。
ブループリントを開いて、ビューポートからStaticMeshComponentの詳細パネルからドランスフォームの値をいじります。
ストレスレスかつ大きすぎなければ、どのような値でもいいと思います。
次に、フレームの大きさを設定します。
レベル画面から、フレームを選択してトランスフォームを設定します。
ブループリントを作ってしまってドアと同じ要領で大きさを変えてもいいかもしれません。
さて、ドアの作成が完了したので実行してみます。ドアが開くと中に入れるようになれば成功です。
成功した・・・といえるのでしょうか。
ドアが開く前から中に入れてしまっています。
原因は、ドアにコリジョンがついてない事です。
では、コリジョンを付けていきましょう。
今回はドアのブループリントではなく、元の素材であるSM_Doorを変更します。
SM_DoorをAnimStarterPack>Propsから選択します。
コリジョンタブから、「ボックス単純化コリジョンを追加」を選択しましょう。
コリジョンの大きさが気になるときは個人で調節して、保存し実行してみましょう。
ドアを透過しなければ成功です。
おつかれさまです。
サンプルマネキンを操作する
マネキンを使ったゲームはFPS等のテンプレートからゲームを作成するといきなり操作可能状態で始まるのですが、今回のようなテンプレを使用しない場合、マネキンを操作する為にはどうすればいいのか。
いくつか方法はありますが、今回は(個人的に)一番楽な方法をとります。
まず、ワールドセッティングを開きます。Game Mode>GameMode Overrideがあるので、+ボタンから新しいゲームモードを作成します。
名前と保存先を指定し、保存すると選択したゲームモードが編集可能状態になります。ここで、Default Pawn ClassをUe4ASP_Characterに選択します。
この状態でプレイをすると、Player Startの位置にマネキンが配置されます。
ただ、まだこのままでは操作ができません。
ASP_Characterを動かす為には、Bingingsという設定をする必要があります。
まず、編集タブからプロジェクト設定を選びます。
プロジェクト設定を開くと、左に選択欄が並んでいるので、エンジン>インプットを選択します。ここで、BindingsのAction Mappings、Axis Mappingsに項目を追加していくことでマネキンを操作できるようにしていきます。
まず、ActionMappingの+ボタンをクリックして、名前をJumpに、キー配置をスペースバーにします。
この状態でプレイしてみると、スペースバーが押されるとマネキンがジャンプすることが確認できます。
同様に、以下の画像のように設定をします。
スケールはMoveforwardの場合前が正の値、Moverightの場合右が正の値となるので、負の値を代入するとそれぞれ後、左の移動を指します。
また、MoverightをTurnに変えると、マネキンが移動方向に向きを変えるような動きを取ります。
ASP_Characterではこの操作のみでプレイヤーの指示で操作できるようになりますが、自作のキャラを動かす際には別途設定およびプログラムが必要となることを忘れないでください。
また、最近のバージョンのマネキンではゲームモードUe4ASP_Characterでコリジョン判定が表示されるようになっていますが、あった方が何かと便利なのでそのままにしておくことをオススメします。
これで自分でスイッチを押し、ドアを開けることが出来るようになりました。
おつかれさまでした。
入れない・・・
カスタムイベントについて
ブループリントを使っていて、「BiginPlayとかティックとか、元々入ってるイベント以外の作り方はどうするのか?」と思っている人もいると思います。
そこで、今回は自作のイベントノード=カスタムイベント作成方法について記述します。
前回の タイムラインを使ってアクタの状態を変化させる - ゆきメも で作成した、ドアを改変して、スイッチが押されるとOpenというイベントが開始されるようにし、Openイベントが開始されるとドアが開くように作り変えてきます。
まず下準備のスイッチの作成から。
モードからCylinderをクリック&ドロップで表示させます。
そして、表示されたCylinderを選択しブループリント編集からブループリントを作成します。名前はCylinder_BPとし、保存先は各自指定してください。
はじめに見た目や判定の設定をするので、ビューポートを選択してください。
まず、今のままではスイッチが大きすぎるので、適切な大きさに設定します。
画面左上のコンポーネントから、StaticMeshComponentを選択します。詳細にトランスフォーム欄があるので、拡大縮小のX,Y,Zをそれぞれ(0.5,0.5,0.1)と設定し、スイッチらしい形にします。
次に、あたり判定を置くために、コンポーネントからStaticMeshComponentの直下にBoxCollisionを設定します。名前はTriggerとしておきます。
Triggerの位置や大きさはこのままでも問題なく動作するのですが、スイッチの上にトリガーがある方が好ましいのでロケーションのZ座標を100cmとしておきます。
これで準備は終わりました。あとはOpenイベントを作成し、流れにそってノードを繋げると完成となります。
カスタムイベントの作成はとても簡単です。
一度Cylinder_BPを離れ、doorのブループリントを開きます。
①イベントグラフの何もない箇所を右クリックし、カスタムイベントを追加をクリック。
②名前をOpenにする。
これだけです。あとはBeginPlayとタイムラインノードのPlayを切断し、OpenとタイムラインノードのPlayを接続してdoorでの操作は終了です。コンパイルを忘れないようにしてください。
次に、レベルブループリントから、スイッチが押される(Cylinderに物がOverlapする)とOpenイベントが開始されるようにイベントグラフをいじって完成となります。
レベルビューからCylinderを右クリックし、イベントを追加>OnActorBeginOverlapを選択することでレベルブループリントに簡単にOverlapノードを作成できます。次にもう一度レベルビューからDoorを選択した状態でレベルブループリントに行き、何もない箇所で右クリックしDoorのリファレンスを作成を選択します。(状況に合わせた表示にチェックがないと表示されない恐れがあります)doorからピンを伸ばし、カスタムイベントであるOpenを開きます。あとはOverlapイベントとOpenの実行ピンをつなぐとおしまいです。(doorのコンパイルを忘れているとエラーが出る恐れがあります。)
スイッチの上から物理エンジンとオーバーラップイベントを発生させるにチェックを入れたボックス等を落として、ちゃんとドアが開くようになっていれば成功です。
おつかれさまでした。
ドアを開ける要領で、スイッチが押されると沈むようにしても面白いかもしれません。興味があれば作成してみてください。
タイムラインを使ってアクタの状態を変化させる
タイムラインは簡単なアニメーションを作る際に役立つ機能です。
今回はこのタイムラインを用いてドアの開閉のアニメーションを作成してみたいと思います。
はじめに注意点ですが、このタイムライン操作では、時間経過によって値を変化させる動作しか行わないので、複雑なアニメーションはCGツールやsfmを使って作成するようにしてください。
UE4を立ち上げてコンテンツブラウザを開くと、StarterContents>Props内にSM_DoorとSM_DoorFrameがあるのでこれをいい感じに配置します。
ドアフレームとドアが被ってしまう際は、詳細タブからトランスフォームで手入力を行うか、ビュー右上から一グリッドスナップ値を細かくして設置してみてください。
ドアフレームは(置いておいてなんですが)ドアの開閉には全く関係がないので、SM_Doorのブループリントのみをいじります。SM_Doorを選択して詳細タブからブループリントを開きます。この際、ブループリントの保存先は各自指定するようにしてください。
イベントグラフのBeginPlayの近くに「タイムラインを追加する」を置き、名前をOpenDoorにでもしておきます。
OpenDoorをダブルクリックすると、タイムラインエディタが開かれます。
まだ、トラックがないのでトラックを追加します。長さを1(秒)にして、左上にあるf+からFloatトラックを追加します。
名前が新規Trackになってるので、新規Trackと書かれている箇所をクリックして、RotateDoorとでも名前を変更しておきます。
タイムラインでは横軸が秒で縦軸が変化の値になっています。(0,0),(1,1)付近にキーを追加します。キーの追加方法はキーを付けたい箇所でShift+左クリックか、右クリックからAdd keyでつけられます。
キーの位置が気になるので、キーをクリックして時間、値をそれぞれ(0,0),(1,1)と入力しておきます。
このままでは角速度が一定でドアが開いてしまい少し不自然なので、(0,0)キーを右クリックし、自動を選択します。
これでタイムラインの編集は終わりです。
イベントグラフに戻り、BeginPlayとOpenDoorのPlayピンをつなぎます。
後はSetRelativeRotationとLerp(Rotator)のノードを用意しておきます。
このとき、SetRelativeRotationにStatic Mesh componentがターゲットとしてついていることを確認します。ついていなければコンポーネントタブからドラッグして繋いでおきます。
また、LeapのReturn ValueピンにSetRelativeRotationのNew Rotationピンをつなぎます。
SetRelativeRotationは相対的角度を入力する箇所で、最終何度回転させるかを決めるものだと思っておいてください。
LerpノードはAlphaが0の時はA,1の時はBの値を返し、0から1の間ではAとBの割合から算術します。
今回、始めを0としたとき、ゴール(ドアが開くとき)はzが90度回転した時となるので、LeapのBのzに90を入力しておきます。
最後に、OpenDoorのUpdateピンとSetRelativeRotationの実行ピンを、RotateDoorピンとLeapのAlphaピンをつなげば完成となります。
コンパイルし実行した時、ドアが開くようなアニメーションになると成功です。
お疲れさまでした。