Nearly Equalって??

値同士が同じかどうかを判定する「=」ノード

2つの値のどちらが大か小かは「>」「≧」「≦」「<」を使って判定を行う。

恐らくこれらのノードはよく使うと思う。

 

だがこれは多分あまり使ったことがないんじゃないんだろうか?

f:id:Free_Gamer:20181106213844p:plain

Nearly Equalノード

AとBの値がほぼ等しい場合Trueを返すノードだ。

だが、一体どの程度の差を「ほぼ等しい」というのか。

それは自分で設定できる。

 

例えば・・・

 

f:id:Free_Gamer:20181106215147p:plain

Aに「10」、Bに「9」を入れた。

まあ感じ方に個人差はあれど、ほぼ等しいと言えるだろうw

実際にプレイしてみると・・・

f:id:Free_Gamer:20181106215610p:plain

Falseと判定された。

等しくないと判定されたのだ。

 

今度はAに「10」、Bに「9.9」と入れてみる。

f:id:Free_Gamer:20181106215835p:plain

f:id:Free_Gamer:20181106215910p:plain

またもFalseだ。

全然等しくないらしい。

 

A「10」B「9.9」のまま、Error Toleranceに「0.5」を入れてやってみよう。

f:id:Free_Gamer:20181106221558p:plain

f:id:Free_Gamer:20181106221709p:plain

今度はTrueが出た。「ほぼ等しい」と判定されたのだ。

 

しかし何故、

A「10」B「9.9」を入れた状態で、Error Toleranceに「0.5」を入れたら「ほぼ等しい」と判定されたのか?

 

重要なのは「Error Tolerance」だ。

Error Toleranceは訳すと、「エラー耐性」

」と思うかもだが、Error Toleranceとは「ほぼ等しい」と判定される許容範囲を指定できる部分なのだ。

 

例えば・・・

A「10」B「9」にし、Error Toleranceに「1」を入れてみよう。

f:id:Free_Gamer:20181106222630p:plain

f:id:Free_Gamer:20181106221709p:plain

Trueと判定された。

 

理由は、AとBの差が「1以内」に入っていたからだ。

A「10」‐B「9」=「1(Error Toleranceの値)」

確かにAとBの差は「1」以内だ。

 

A「10」B「9.5」にしても同じ。

f:id:Free_Gamer:20181106223038p:plain

f:id:Free_Gamer:20181106221709p:plain

AとBの値の差が「1(Error Toleranceの値)以内」に入っているのでTrueになる。

 

逆にAとBの値の差がError Toleranceの値を超えるようなら当然Falseになる。

 

※ここで注意※

これは仕様なのか何なのか分からないが、Error Toleranceの値に「0.1」以下の値を入れると、たとえAとBの値の差が「0.1」以内だとしてもFalseと判定されてしまう。

例)

f:id:Free_Gamer:20181106223907p:plain

f:id:Free_Gamer:20181106215910p:plain

A「10」‐B「9.9」=「0.1」

明らかに「0.1」以内のはずなのだが、False扱いされてしまう。

 

何でぇ??詳しい方求ム!!!!!!!!

 

それではまた!^^ノシ

タイマー処理!(十の位とか一の位とかそんな感じの)

今回は、

f:id:Free_Gamer:20181022231821p:plain

この表記でのタイマー処理をする。

 

これがなかなか複雑で難しかった。(もっと効率的な方法があるのかな?)

 

イベントグラフ(僕はGameModeBaseに処理を組んだが、別にレベルBPでもなんでもいいです)

f:id:Free_Gamer:20181022232145p:plain

用意する変数

f:id:Free_Gamer:20181022232346p:plain

変数名の解説

Minute・・・分

Second・・・秒

TensPlace・・・十の位

OnePlace・・・一の位

 

まず「1・2・3・・・・・」と1秒おきにカウントするようにする。

f:id:Free_Gamer:20181022232237p:plain

1秒おきに「TimerSecondOnePlace(秒の一の位)」に「1」を足していく。

「TimerSecondOnePlace」が「10」、つまり「10秒」に達したら「TimerSecondTensPlace(秒の十の位)」に「1」を足す。

そして「TimerSecondOnePlace」の値を「0」にセット。

これで、

「TimerSecondTensPlace(1)」と「TimerSecondOnePlace(0)」で「10秒」になったわけだ。

f:id:Free_Gamer:20181022232533p:plain

 

↓これはタイマーが「9分60秒」に達した時、つまり「10分」になる瞬間の処理。

まず先に「10分」に達する前のFalseに繋がってる処理を見よう。

f:id:Free_Gamer:20181022233000p:plain

 

「TimerSecondTensPlace」が「6」、「TimerSecondOnePlace」が「0」、つまり「60秒」に達した時、「TimerMinuteOnePlace(分の一の位)」に「1」を足す。

そして、「TimerSecondTensPlace」を「0」にセット。

この時点で「TimerMinuteOnePlace(1)」と「TimerSecondTensPlace(0)」「TimerSecondOnePlace(0)」なので、「1分」経ったことになる。

f:id:Free_Gamer:20181022233450p:plain

 

次にTrueに繋がる処理を見よう。

「9分60秒」、つまり「10分」に達した時、処理はTrueを通る。

f:id:Free_Gamer:20181022233000p:plain

 

「TimerMinuteTensPlace(分の十の位)」に「1」を足す。そして「TimerMinuteOnePlace」の値を「0」にセット。

その後、「TimerSecondTensPlace」「TimerSecondOnePlace」の値を「0」にセットする。

これで、「10分」経ったことになる。

f:id:Free_Gamer:20181022233948p:plain

 

あとは、タイマーを表示するための処理を作って完成だ。

(UMGによるテキスト表示の説明は省きます・・・泣)

f:id:Free_Gamer:20181022231821p:plain

f:id:Free_Gamer:20181022234406p:plain

f:id:Free_Gamer:20181022234436p:plain

f:id:Free_Gamer:20181022234546p:plain

 

これでプレイ!

 

10秒に到達した時

youtu.be

 

1分に到達した時

 

10分に到達した時

youtu.be

 

しっかりタイマー処理が行われていた!

 

それではまた!^^ノシ

ライトのSourceLengthとは??

UE4を始めたばかりの頃、ライトの詳細パネルに「SourceLength」という設定項目を見つけた。

f:id:Free_Gamer:20181011233157p:plain

適当にSourceLengthの値をいじってみて、ライトの形状を長くすることが可能だというのが分かった。

f:id:Free_Gamer:20181011233244p:plain

f:id:Free_Gamer:20181011233305p:plain

が、「ライトの形状を長くしたところでどういう場面に使うのだろう??」というしょぼい疑問が頭に浮かび、それ以降は全くSourceLengthの設定をいじってこなかった。

使えるような場面が想像できなかったからだ。

 

だが最近SourceLengthの事について色々ggっていたら、ようやく使いどころが分かったので紹介する。

それは・・・

 

蛍光灯の光に使える!

(または長い形状の光源に使える!)

 

という事だ!

 

SourceLengthの値を「0」にした状態のライトを蛍光灯につけると、

f:id:Free_Gamer:20181011235417p:plain

f:id:Free_Gamer:20181011233818p:plain

蛍光灯のライトの光が床に丸く反射してるのが分かる。

 

では、SourceLengthの値を「100」にしてライトの形状を蛍光灯の長さに合わせたらどうなるか・・・

f:id:Free_Gamer:20181011235451p:plain

f:id:Free_Gamer:20181011234215p:plain

 

おわかりいただけただろうか。

SourceLengthの値「0」のやつよりも、

f:id:Free_Gamer:20181011234401p:plain

SourceLengthの値「100」にしたやつのほうが、

f:id:Free_Gamer:20181011234444p:plain

蛍光灯感(?)があると思う。

 

もし、あなたの作る作品で蛍光灯のような長い光源の物が出てくるときは、ぜひこのライトの「SourceLength」を活用してみてほしい。

 

それではまた!^^ノシ

物理シュミレーションに合わせた音の発生方法!

最近UE4

 

どうやったら物理シュミレーションに合わせて音を鳴らすことが出来るんだろう??

 

という悩みを抱えていた。

 

例えば、サッカーボールがあったとして

サッカーボールを蹴り飛ばすと、当然ですが「ポーン」と音を鳴らしてすっ飛んでいく。

f:id:Free_Gamer:20181007184333p:plain

すっ飛んだ先で何度もバウンドするだろう。その時もバウンドする度に「ポンッ」「ポンッ」と音が鳴る。動きが止むと音も当然出ない。

f:id:Free_Gamer:20181007185922p:plain

つまり、僕がしたいのは

 

物理シュミレーション中の物体が何かにヒットする度に音を鳴らす!

 

という事をしたいのである!

 

音を鳴らしたいアクターの作成。

「BP_SimulatePhysicsActor」という名前にした。

f:id:Free_Gamer:20181007201518p:plain

SimulatePhysicsはチェックを入れておく。

f:id:Free_Gamer:20181007201706p:plain

 

イベントグラフ

f:id:Free_Gamer:20181007202346p:plain

SetNotifyRigidBodyCollisionで物理シュミレーション中に何かにヒットしたかのどうかの通知をオン。

Google翻訳

SetNotifyRigidBodyCollision・・・剛体衝突の通知を設定する

f:id:Free_Gamer:20181007202541p:plain

実際物理シュミレーション中に何かにヒットした時、通知が行われているかを確かめてみた。

何かにヒットする度に「1」ずつ画面左上にカウントされていく。

youtu.be

しっかりカウントされてるので、間違いないだろう。

 

このアクターが何かに衝突した時の力(A)が、(B)に入れた数値より小さい場合に音を鳴らす処理を行う。

f:id:Free_Gamer:20181007203840p:plain

このアクターが何かに衝突した時の力は、NormalImpulseに格納されている。

f:id:Free_Gamer:20181007204108p:plain

 

実際にやってみた。

youtu.be

 

アクターが跳ねる度にしっかりと音が鳴っていた。

 

やっていること自体は単純だが、覚えておいて損は無いだろう。

 

それではまた!^^ノシ

 

 

小ネタ!~LightFunctionって何??~

ライト系のアクター(ポイントライトやスポットライト)の詳細パネルでこのようなものがある。

f:id:Free_Gamer:20180912002108p:plain

LightFunction

 

いったいこれは何かというと・・・

 

光の形状をマテリアルで好きなように設定できるのだ。

 

例えばスポットライトだと光の形状が円錐状になっているが

f:id:Free_Gamer:20180912002314p:plain

LightFunctionを設定すると・・・

f:id:Free_Gamer:20180912002458p:plain

このような表現が可能だ。

 

~やり方~

まずペイントツールで表現したい光の形状を作成しよう。

自分は手裏剣型にした。

f:id:Free_Gamer:20180912002601p:plain

作成した光の形状を、UE4に直接ドラッグ&ドロップでインポートしよう。

f:id:Free_Gamer:20180912002953p:plain

 

マテリアルを作成。名前はとりあえず「M_LightFunction」にした。

f:id:Free_Gamer:20180912003543p:plain

中身はこう。

f:id:Free_Gamer:20180912003221p:plain

詳細パネルは以下のように。

f:id:Free_Gamer:20180912003253p:plain

 

レベル上にスポットライトを配置し、詳細パネル内のLightFunctionに作成した「M_LightFunction」を設定すると・・・

f:id:Free_Gamer:20180912003518p:plain

 

このようになったはずだ。

f:id:Free_Gamer:20180912002458p:plain

シンプルでとても面白い機能だと思う。

 

今のところ使い道はあまり思いつかないが、ナイトクラブとかそういうパーティー系のレベルを作る時にこのLightFunctionを使えばなかなかいい表現が出来るのではないだろうか??

 

もちろんスポットライトだけでなくポイントライトでも設定が可能だ。

ぜひ、自由に試して遊んでみてほしい。

 

それではまた!^^ノシ

 

 

ハイスコア処理で苦労した事!

ハイスコア処理で苦労した点。それは・・・

 

なぜかハイスコアが保存されない(デフォルト値のまま)

 

僕が最初にやっていた処理を見せる。

f:id:Free_Gamer:20180907181140p:plain

処理の内容としては・・・

・Boxコリジョンにプレイヤーがオーバーラップ。現在のステージのセーブデータが存在するかチェック。

f:id:Free_Gamer:20180907181454p:plain

・1回目のプレイはセーブデータが存在しないので、Falseへ。

f:id:Free_Gamer:20180907181422p:plain

・ゲームモードからスコア(タイム)を参照。CreatSaveGameObjectで新規セーブデータを作成し、変数に格納。

f:id:Free_Gamer:20180907181622p:plain

・ハイスコアにも格納。最後にセーブ。

f:id:Free_Gamer:20180907181702p:plain

 

・2回目以降のプレイ。Trueの処理。

f:id:Free_Gamer:20180907181804p:plain

・CreatSaveGameObjectで新規にセーブデータを作成。ゲームモードからスコア(タイム)を参照。変数に格納

f:id:Free_Gamer:20180907181622p:plain

・セーブデータをロード。

f:id:Free_Gamer:20180907182016p:plain

・ハイスコア判定。現在のクリアータイム(スコア)と前回のハイスコアを比較。

f:id:Free_Gamer:20180907200159p:plain

・ハイスコアならTrueへ行き、ハイスコアを上書き。ハイスコアじゃなければFalseへ。

f:id:Free_Gamer:20180907200301p:plain

 

 

 

さて、なぜ

 

なぜかハイスコアが保存されない(デフォルト値のまま)

 

↑のような問題が起きたのか。原因は、

 

 

ステージをクリアーする度、新規にセーブデータを作成していたから。

 

1回目のプレイで、CreatSaveGameObjectで新規に現在のステージのセーブデータを作成。

スコアが保存され、ハイスコアも保存される。

 

もう一度プレイした時、

f:id:Free_Gamer:20180907212752p:plain

またCreatSaveGameObjectで新規にセーブデータを作成しているのだ。

そうなると、前回ハイスコアに保存していた値がリセットされてしまう。

 

セーブデータを記録用紙に例えるなら・・・

 

1回目のプレイの記録用紙が

f:id:Free_Gamer:20180907213454p:plain

ぺらっと新しい記録用紙に変えられて記録されるようなもの。(分かりにくい絵かも・・・)

f:id:Free_Gamer:20180907213602p:plain

 

しかも2回目以降の処理は、

・現在クリアーした時のスコアを保存。

・前回のハイスコアと現在のクリアータイムを比較

 

という流れだ。

 

この時点で

ハイスコアには何も値(スコア)が格納されていない。

 

何故なら、前回のハイスコアの記録が先程の↓イラストのように無くなってしまっているからだ。

f:id:Free_Gamer:20180907213602p:plain

だからハイスコア配列はデフォルト値を返すしかないのだ。

 

ハイスコア配列のデフォルト値は「0」

「0秒」以下でクリアーなど出来るはずもないからどんなに早くクリアーしても一生ハイスコアという事にはならないのである。

 

自分なりに分かりやすく解説したつもりだがどうだっただろう・・・

 

何かの役に立てれば幸い。

 

それではまた!^^ノシ

 

 

 

 

 

 

レベル別でのハイスコア処理!

前回の続きのようなもの。

 

以下の記事で書いたが、

free-gamer.hatenablog.com

 

ステージ数が3つあるゲーム。という体で話を進めてきた。

 

前回まではStage1のみでのハイスコア処理を語ってきたので、今回からは残りの2ステージ、つまり

 

レベル別でのハイスコア処理!

 

を解説していく。

 

レベルはちゃんと3つ作ってあるはずなので、

f:id:Free_Gamer:20180904180616p:plain

「Stage2」レベルを開こう。

 

「Stage2」のレベルBPには、このような処理があるはずだ。

f:id:Free_Gamer:20180904181305p:plain

 

前回でも言ったが、

 

StageID・・・何ステージ目かを示す番号

 

なので、「Stage2」をクリアーした時には・・・

f:id:Free_Gamer:20180906185205p:plain

↑この名前でセーブデータが作成される。

 

「Stage3」は、レベルBPでStageIDを以下のようにセットしてるから、

f:id:Free_Gamer:20180904181321p:plain

↓以下の名前でセーブデータが作成される。

f:id:Free_Gamer:20180906185430p:plain

 

あとの処理は一緒。

レベル(ステージ)が変わり、それによってStageIDが変わって現在のレベル(ステージ)ごとにセーブデータが作成されるだけ。

 

↓赤枠で囲った部分が変わるだけ。あとは変わらない。

f:id:Free_Gamer:20180906185738p:plain

 

これによりレベル別のハイスコア判定ができるわけだ。

 

実際にプレイ。

 

Stage1を「10秒」でクリアー

Stage2を「15秒」でクリアー

Stage3を「20秒」でクリアーしてみる。

 

Stage1

youtu.be

Stage2

youtu.be

Stage3

youtu.be

 

次に全ステージを、前回よりも早くクリアーする。

 

Stage1

youtu.be

Stage2

youtu.be

Stage3

youtu.be

 

左上の文字を見ればわかるが、

「ハイスコア!」と表示されていた。

 

しっかりとレベル別にハイスコア判定が行われてることが分かる。

 

ここまで長々と書き連ねてきたから、色々雑な説明があるかもしれない。

 

だが、画像は比較的多く出してるつもりなので、とりあえず画像の通りにやってみれば、しっかりとハイスコア処理が出来るはずだ。

 

それではまた!^^ノシ