Splineで遊ぼう!~Splineでちょっとしたプロシージャルメッシュ作成~

ActorクラスのBPを作成。

名前は何でも。(自分は「BP_Spline」にした。)

 

~Splineコンポーネント追加~

f:id:Free_Gamer:20180719002709p:plain

「Spline」というコンポーネントを追加

 

~ConstractionScript~

f:id:Free_Gamer:20180719002752p:plain

~変数~(全部編集可能にする)

NumberOfMeshs・・・配置するメッシュの数

OrientToSpline・・・メッシュの向き(角度)をSplineの角度に合わせるか??

 

NumberOfMeshsで配置するメッシュの数を決める。

デフォルト値は「2」にした。

配置するメッシュの数が「0」、つまりNumberOfMeshsが「0」の場合、ブランチの条件によりFalseに処理が流れる。

f:id:Free_Gamer:20180719003000p:plain

NumberOfMeshsの値「2」から1引いた値をForLoopのLastIndexに渡す。

同時にNumberOfMeshsの値「2」から1引いた値をGetSplineLengthの値で割る。

 

GetSplineLength・・・Splineの長さを取得

 

ちなみに、Splineの長さはデフォルトだと「100」

つまり、NumberOfMeshsのデフォルト値には「2」を入れたので、

 

100÷1=「100」

 

になる。

「100」をIndexの値で掛け算する。

FirstIndex「0」

LastIndex「1」なので・・・

 

0×100=「0」

1×100=「100」

 

となる。

この値は、配置するメッシュの位置を決める値となる。

 

f:id:Free_Gamer:20180719003216p:plain

この値を、GetLocationAtDistanceAlongSplineでVector値に変換。

このVector値は、ワールド座標のVectorになる。

f:id:Free_Gamer:20180719004015p:plain

これを、InverseTransFormLocationで相対座標に変換。

f:id:Free_Gamer:20180719004243p:plain

相対座標に変換した値をMakeTransFormで一纏めにして、AddStaticMeshComponentノードのRelativeTransFormに繋ぐ。

これで、メッシュを指定した数の分だけ配置が可能になった。

f:id:Free_Gamer:20180719004656p:plain

最後に、GetRotationAtDistanceAlongSplineでSplineの角度をワールド座標の角度に変換。

Distanceには、先程の「Indexの値×100」の値を繋ぐ。

f:id:Free_Gamer:20180719010313p:plain

GetRotationAtDistanceAlongSplineでワールド座標に変換したSplineの角度を、SetWorldRotationに渡す。

その前に、ブランチを挟む。

ConditionがTrue・・・メッシュの角度をSplineの角度に合わせる。

ConditionがFalse・・・合わせない。

f:id:Free_Gamer:20180719005235p:plain

 

さてどうなっているか!?

youtu.be

見事!(自己満)

 

ここで整理しよう。

NumberOfMeshsの値が「2」だった場合。

f:id:Free_Gamer:20180719012153p:plain

相対座標、X「0」とX「100」の位置にメッシュが配置される。

「0」「100」は、先程やった「Indexの値×100」の奴だ。

 

0×100=「0」・・・1個目に配置するメッシュの位置

1×100=「100」・・・2個目に配置するメッシュの位置

 

となる。

 

まあ、Splineは昨日触ったばっかなので、色々違う部分はあるかもしれないw

その場合は遠慮なく指摘してほしい。

 

それではまた!^^ノシ

 

 

DestroyComponentの注意点!~なぜDestroyComponentを使ってるのに何も破壊されないのか??~

今回DestroyComponentで躓いた点があったので紹介する。

 

free-gamer.hatenablog.com

前回の記事とほぼ同じな為、ある程度説明を省く。

 

「落ちてる武器を拾って、プレイヤーにアタッチする」という処理なのだが、

 

落ちてる武器を拾った時

落ちてる武器と同じ武器をプレイヤーの指定したソケットにスポーン

スポーンした武器を、プレイヤーの指定したソケットにアタッチ

落ちてた武器を破壊(削除)

 

といった処理だ。

 

~処理~

f:id:Free_Gamer:20180717215209p:plain

武器を取得時、指定したソケットに武器をスポーン。

f:id:Free_Gamer:20180717215429p:plain

取得した武器のSphereコリジョンを破壊。落ちてた武器を破壊。

f:id:Free_Gamer:20180717215551p:plain

※変数「Rifle」と「WeaponMaster」と「Sphere」については先に載せた記事を参考ください。

 

これでプレイすると・・・

youtu.be

 

落ちてる武器は破壊されたものの、背中にアタッチされた武器はSphereコリジョンが残ったまま。

先程の画像の処理で確かにRifle(武器)に、コンポーネントとして追加してあるSphereコリジョン(オーバーラップコリジョンコンポーネント)を、破壊(Destroy)したはずなのに。

 

実はこの処理だと破壊されないのだ。

どういう事かと言うと・・・

 

DestroyComponent・・・そのアクター自身のコンポーネントを破壊するノード。

 

ここで言うアクター自身というのは、「操作キャラ」、つまり「サードパーソンキャラ」の事になる。

このサードパーソンキャラのコンポーネントには、Sphereコリジョンなんてものは存在しない。

f:id:Free_Gamer:20180717221236p:plain

「え??でもAttachtoComponentでRifle追加してるんでしょ??それで追加したRifleのコンポーネントSphereコリジョンがあるんだから、普通に存在してるんじゃねえの??」と思うかもだが。それは違う。

 

AttachtoComponentは、ただ単に「キャラに追従させてる」だけ。もっと簡単な言い方をすれば「くっつけてる」だけ。

だから、コンポーネントに追加」してるわけではないのだ。

 

つまり、DestroyComponentでサードパーソンキャラのSphereコリジョンコンポーネントを破壊しようとした所で、そもそもサードパーソンキャラにSphereコリジョンコンポーネントなんてものは無いから、何も変化が無かったのだ。

 

じゃあどうすればいいか??

 

WeaponMasterのイベントグラフに、Sphereコリジョンを破壊する為のカスタムイベントを追加すればいいのだ。

f:id:Free_Gamer:20180717221914p:plain

「DestroyComponent」という名のカスタムイベントを追加。(名前が一緒でややこしいかもだがw)

 

武器をアタッチさせた後に、「DestroyComponent」カスタムイベントを呼び出す。

f:id:Free_Gamer:20180717222250p:plain

 

これでプレイしてみよう!

youtu.be

 

武器を拾った後、アタッチされた武器のコンポーネントであるSphereコリジョンがしっかり破壊されていた!

 

今回はDestroyComponentの躓きポイントを紹介した。

もし同じようなことで悩んでいるならこの記事を読んでほしい。

 

それではまた!^^ノシ

アウトラインを表示する方法(金のかかるやり方だが)

今回は、アウトライン表示方法をやるのだが、

残念ながら僕はマテリアルはめっきりよく分かんない為、

アセットの力を借りることにした。

 

f:id:Free_Gamer:20180716000022p:plain

「OutLiner」という名のマテリアルアセットだ。

 

このアセットは確か2000円ぐらいだったはず。(16$ぐらいだったかな??)

このアセットを使って、アウトライン表示処理を実装しよう!

 

PostProcessVolumeの設定

PostProcessVolumeの詳細欄に画像のような項目がある。

Arrayの隣にある「+」をクリックすると、適用したいアウトラインマテリアルを設定できる。

f:id:Free_Gamer:20180716002227p:plain

アウトラインマテリアルは3つまである。(多分)

f:id:Free_Gamer:20180716002402p:plain

今回は、赤枠で囲った奴の一番左にあるやつを使う。

 

アクタークラスのBPを作成

コンポーネントにCubeを追加しただけのシンプルなアクター。

以下の処理を組む。

f:id:Free_Gamer:20180716001030p:plain

SetCustomDepthStencilValueにあるValueの数値は何を示しているかというと・・・

先程PostProcessVolumeに設定したマテリアルを見てみよう。

f:id:Free_Gamer:20180716002719p:plain

f:id:Free_Gamer:20180716002735p:plain

赤枠で囲ってある部分の数値の事だ。

つまり、Valueに「1」を入れた場合「OutLineClolor(S1)」に設定されてある色(画像だとオレンジ色)がアウトラインの色として設定される。

「2」は、ちょっと濃いオレンジ。

「3」は、青色。

というように、数字によってアウトラインの色が変えられるようだ。

 

プロジェクト設定

エンジン→RenderingのPostprocessingという項目にある赤枠で囲った部分を変更する。

恐らくデフォルトでは「Enabled」になってるはずなので、これを「EnabledWithStencil」に変更する。

f:id:Free_Gamer:20180716001219p:plain

 

これでプレイしてみよう!

youtu.be

 

しっかりアウトラインの表示がされていた!

このアセットがあれば、わざわざ自分でマテリアルを自作しなくても済むだろう!

 

それではまた!^^ノシ

 

落ちてるアイテムをピックアップ(取得)する処理!

1日ブログすっぽかした者です。(´・ω・)

 

今回は、シューティングゲームを作るという体で行くため、「落ちている『武器』を拾う」というシチュエーションにする。

 

やりたい事!

・武器を拾うためのBPの作成

・拾う武器の作成

・武器に近づいたら、武器名をスクリーンに表示

・武器の近くで指定したキーを押したら、キャラに装備

その他諸々・・・

 

※TPSテンプレート使用。アニメーションスターターパック使用。

 

・プレイヤーに武器をアタッチする為のソケットを追加

f:id:Free_Gamer:20180713201900p:plain

f:id:Free_Gamer:20180713201920p:plain

「Hand_r(右手)」にソケットを追加。

名前は任意で。(画像では「WeaponSocket」にした。)

 

・プレイヤーBP

f:id:Free_Gamer:20180713211835p:plain

カスタムイベント(PickUp)が呼び出された時、武器を指定したソケットに追加。

 

カスタムイベントの詳細。

f:id:Free_Gamer:20180713213012p:plain

 

・武器を拾うためのBPの作成

ActorクラスのBPを作成。

名前は任意で。(画像では「WeaponPickUp_Master」にしてある。)

以下のように、コンポーネントを追加。

f:id:Free_Gamer:20180713202301p:plain

f:id:Free_Gamer:20180713202422p:plain

Weapon・・・武器。スケルタルメッシュ。(スタティックメッシュでもいい)

Sphere・・・オーバーラップコリジョン

Widget・・・ウイジェットを表示するためのコンポーネント

 

これで、武器を拾うためのBPの作成は終了。

 

・武器に近づいたら、武器名をスクリーンに表示

武器に近づいたときに、武器の上に武器名を表示させる為のウイジェットを作成する。

武器名は何でも良い。(僕はライフルのアセットがあるので「Rifle」と明記)

f:id:Free_Gamer:20180713203209p:plain

階層にTextBlockを追加。

TextBlockに任意の武器名を入力。

フォントサイズは要調整。

f:id:Free_Gamer:20180713203315p:plain

 

・拾う武器の作成

僕のとこには「ライフル」と「ショットガン」のアセットがあるので、

2つの武器BPを作成する。

「Rifle」と「ShootGun」という名のBPだ。

2つともアクタークラスのBP。

作成した武器BPを開き、クラス設定を選択。

詳細パネルの親クラスを、作成した「WeaponPickUp_Master」に変更。

f:id:Free_Gamer:20180713204032p:plain

f:id:Free_Gamer:20180713204235p:plain

こうすることで、作成した「WeaponPickUp_Master」BPの機能(コンポーネント、BP)を継承(引き継ぐ)する事が可能。

 

例えば、武器BPを5個作成するとして、5個の武器BPすべてに「WeaponPickUp_Master」と全く同じ処理を1個づつ一々組まなきゃいけないのは面倒だし非効率。

 

ましてや、もし5個全ての武器BPの処理を変更する!ってなった時に、1個づつ同じように処理を変更するのはとても過酷。

これが10個、50個、100個となったら・・・個数は大げさかもだが、考えただけで全身の血の気が引く。

f:id:Free_Gamer:20180713205830p:plain

 

だったら、元となるMasterBP(WeaponPickUp_master)を作成して5個全ての武器BPに継承させれば、たとえ5個全ての武器BPの処理を変更するとなった時も、元となるMasterBPさえ変更すれば、後の5個全ての武器BPも変更されるという事になるのだ。

f:id:Free_Gamer:20180713205843p:plain

分かりづらいイラストで申し訳ない。だが、今の説明がしっかり理解できたなら幸いだ。

 

武器BPのWidgetコンポーネントを設定しよう。

f:id:Free_Gamer:20180713210414p:plain

Space・・・Screenにする。

WidgetClass・・・作成したウィジェットを指定。

 

後は、ウィジェットを表示させたい位置に調整する。

f:id:Free_Gamer:20180713210718p:plain

 

 

・武器の近くで指定したキーを押したら、キャラに装備

「WeaponPickUp_Master」に以下の処理を組む。

 

オーバーラップコリジョンにプレイヤーがオーバーラップしたら、ウィジェットを表示。武器を取得する為のキー入力を受け取るためEnableInputを実行。

オーバーラップコリジョンから出て行ったら、ウィジェットを非表示。そして、キー入力も無効にする。(DisableInput)

f:id:Free_Gamer:20180713210857p:plain

取得する為のキーが押されたら、プレイヤーBPのカスタムイベント(PickUp)を呼び出し、オーバーラップコリジョンを破壊する。

f:id:Free_Gamer:20180713210912p:plain

 

これでプレイしてみよう!

youtu.be

 

プレイヤーの接近による武器名の表示。武器のアタッチ。ピックアップ処理。

やりたいことが全部出来ていた!あっぱれ!><///

 

今回は、ピックアップ処理ともう1つクラスの継承の方法も知れたので、一石二鳥!

 

それではまた!^^ノシ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IK!~ずれてる手の位置を修正!~

とあるお方から教えてもらいました。本当に感謝です。

 

さて、今回シューティングもどきを作ってる時の事、非常に困ったことがあり・・・

f:id:Free_Gamer:20180711214934p:plain

明らかに左手の位置が合ってないのだ。

これでは違和感バリバリなので、これを修正する方法を紹介する。

 

TwoBoneIKを使おう!

f:id:Free_Gamer:20180711215041p:plain

EffectorLocation・・・修正するボーンの位置。

JointTargetLocation・・・今回は使わない。

 

Animグラフ

f:id:Free_Gamer:20180711223949p:plain

f:id:Free_Gamer:20180711224215p:plain

 

Hand_R

IKBone・・・実際に動かすボーンを指定

f:id:Free_Gamer:20180711224830p:plain

Hand_L

f:id:Free_Gamer:20180711224812p:plain

 

あとは、EffectorLocationの値を変えて手の位置を調整すればOK!

youtu.be

EffectorLocationの値を変えれば、ちゃんと右手の位置が変わっていた!

右手を動かせば、それに連なるボーン(肘、肩)もしっかり動いていた!

これで修正が楽になるというわけだ!

 

というか今回右手しか修正していなかったね・・・

 

でもIKの簡単な使い方が分かったんじゃあないだろうか。

自分自身IKは全然詳しくないから、興味があれば自分で色々調べてみるといい。

 

それではまた!^^ノシ

 

ショットガン!~散弾処理作成方法!~

使用してる物

・TPSテンプレート

・アニメーションスターターパック

・銃のアセット

 

※すでに銃をアタッチさせていて、ショットガンのアニメーションが出来ているという前提で説明する。

 

~プレイヤーBP~

・自身のAnimBP参照

プレイヤーのAnimBPをキャストして参照し、変数に格納。

f:id:Free_Gamer:20180710215435p:plain

・ショットガン処理

f:id:Free_Gamer:20180710215559p:plain

ボタン押した時、1回だけ射撃アニメーションを再生する。ShootEndカスタムイベントが呼び出されると、DoOnceのResetに処理が流れ、もう一度撃つことが可能。

連打してアニメーションが忙しなくならないようにする為にこうしてる。

f:id:Free_Gamer:20180710215637p:plain

・射撃モンタージュ

f:id:Free_Gamer:20180710220004p:plain

Notify通知

ShootEnd・・・射撃が終了した時に呼び出される通知

・AnimBP

プレイヤー情報を参照。

f:id:Free_Gamer:20180710220254p:plain

ShootEnd通知が来た時、プレイヤーBPの「ShootEnd」カスタムイベントを呼び出す。

f:id:Free_Gamer:20180710220207p:plain

 

ショットガンによる散弾処理はライントレースで行ってる。

ForLoopで何発弾を出すか定義する。

11発散弾させたければ、

 

FirstIndexに「0」

LastIndexに「10」

 

を入れればいい。

カメラから5000の距離までトレースを飛ばす。

トレースを飛ばす際、赤枠で囲った部分で散弾範囲を定義する。

f:id:Free_Gamer:20180710221051p:plain

Min・・・最小値

Max・・・最大値

f:id:Free_Gamer:20180710220950p:plain

今回は、

Min・・・‐200

Max・・・200

を入れている。

つまり、撃った時・・・

 

ワールド座標のXYZの方向に、-200~200の範囲で散弾する。

 

という事になる。

f:id:Free_Gamer:20180710221537p:plain

トレースが何かにヒットした場合、ヒットした場所(ImpactPoint)にエフェクトを出す。

何もヒットしなかったら、トレースの終端距離(TraceEnd)にエフェクトを出す。

という処理だ。

f:id:Free_Gamer:20180710221949p:plain

 

やってみよう!

youtu.be

 

見事にショットガンの如く散弾処理が行われていた!

ショットガンはかっこいいよねぇ~><///

ゼロ距離で顔面撃った時はもう最高にエクスタs

 

それではまた!^^ノシ

動的DOF!~リアルタイムぼかし処理~

近くに映ってる物はくっきり

遠くの物はぼやけるような処理の作成。

 

今回はFPSテンプレートを使用してる。

 

プレイヤーBP

f:id:Free_Gamer:20180709220924p:plain

カメラから5000の距離までトレースを飛ばす。

f:id:Free_Gamer:20180709221007p:plain

トレースが何かにヒットした時、ぼかし処理を行う。

f:id:Free_Gamer:20180709221123p:plain

 

ぼかし処理はPostprocessSettingsセット変数で処理する。

この変数は、プレイヤーのカメラコンポーネントからピンを引っ張って検索しないと出てこない。

PostprocessSettings変数をセット後、ピン引っ張り「PostprocessSettingsを作成」を出す。

f:id:Free_Gamer:20180709221915p:plain

 

PostprocessSettingsを作成を選択すると、詳細パネルに大量の設定項目が出てくる。

AsPinにチェックをつけると、チェックをつけた項目がPostprocessSettingsを作成に表示される。

f:id:Free_Gamer:20180709222401p:plain

以下の項目のピンを出す。

~Lens|Camera~

・Aperture(F-Stop)

~Lens|DepthOfField~

・MetHod

・FocalDistance

 

・Aperture(F-Stop)

調べてみたところどうやらこれはカメラに纏わる用語らしい。

絞り値(F)の事らしい。(多分)

専らカメラに詳しくないので、これ以上適当な説明しても混乱させるだけなので興味があれば調べてみるといい。

要は、

Aperture(F-Stop)の数値が大きい程、ぼかし加減が小さくなる。数値が小さい程、ぼかし加減が大きくなる。

というわけだ。

 

・MetHod

どのようにぼかすかの項目。

 

・FocalDistance

焦点距離の事。

この数値が大きい程、遠くのものがくっきり映る。

この数値が小さい程、近くのものがくっきり映る。

 

最終的にこうなったはずだ。

f:id:Free_Gamer:20180709224426p:plain

Aperture(F-Stop)・・・1.0

MetHod・・・CircleDOF

FocalDistance・・・トレースを飛ばしてる位置から、トレースがヒットした場所までの距離の差をFloatに変換し繋いでいる。

f:id:Free_Gamer:20180709224849p:plain

 

これで、リアルタイムにぼかし処理ができるようになった!

 

処理としては、

 

カメラから飛ばしてるトレースに何かがヒットした場合、

ヒットしたものが近ければ近い程、FocalDistance数値が減少し、遠くのものがぼやけやすくなる。

ヒットしたものが遠ければ遠い程、ぼかし効果は減少していく。

 

という感じだ。

youtu.be

 

ちょっと分かりづらいかもだが、近くの物が視界に入った時、遠くのものがぼけていた。

視界に何も入らなければ、遠くのものはくっきり映り、近くのものはぼやけていた。

 

その証拠に、遠くのものがぼやけた時、目の前で常に持っている銃のぼかし効果が若干薄くなっていたと思う。

 

ついでに、Aperture(F-Stop)の数値の違いをここで比較しておく。

 

Aperture(F-Stop)・・・4.0

FocalDistance・・・50

f:id:Free_Gamer:20180709230452p:plain

Aperture(F-Stop)・・・1.0

FocalDistance・・・50

f:id:Free_Gamer:20180709230609p:plain

これだけの違いが出るのだ。

 

Aperture(F-Stop)・・・どれぐらいぼかすか

 

という意味で覚えとくといいだろう。(多分)

 

これでリアルタイムDOF処理が出来た!

 

それではまた!^^ノシ