Nearly Equalって??
値同士が同じかどうかを判定する「=」ノード
2つの値のどちらが大か小かは「>」「≧」「≦」「<」を使って判定を行う。
恐らくこれらのノードはよく使うと思う。
だがこれは多分あまり使ったことがないんじゃないんだろうか?
Nearly Equalノード
AとBの値がほぼ等しい場合Trueを返すノードだ。
だが、一体どの程度の差を「ほぼ等しい」というのか。
それは自分で設定できる。
例えば・・・
Aに「10」、Bに「9」を入れた。
まあ感じ方に個人差はあれど、ほぼ等しいと言えるだろうw
実際にプレイしてみると・・・
Falseと判定された。
等しくないと判定されたのだ。
今度はAに「10」、Bに「9.9」と入れてみる。
またもFalseだ。
全然等しくないらしい。
A「10」B「9.9」のまま、Error Toleranceに「0.5」を入れてやってみよう。
今度はTrueが出た。「ほぼ等しい」と判定されたのだ。
しかし何故、
A「10」B「9.9」を入れた状態で、Error Toleranceに「0.5」を入れたら「ほぼ等しい」と判定されたのか?
重要なのは「Error Tolerance」だ。
Error Toleranceは訳すと、「エラー耐性」
「?」と思うかもだが、Error Toleranceとは「ほぼ等しい」と判定される許容範囲を指定できる部分なのだ。
例えば・・・
A「10」B「9」にし、Error Toleranceに「1」を入れてみよう。
Trueと判定された。
理由は、AとBの差が「1以内」に入っていたからだ。
A「10」‐B「9」=「1(Error Toleranceの値)」
確かにAとBの差は「1」以内だ。
A「10」B「9.5」にしても同じ。
AとBの値の差が「1(Error Toleranceの値)以内」に入っているのでTrueになる。
逆にAとBの値の差がError Toleranceの値を超えるようなら当然Falseになる。
※ここで注意※
これは仕様なのか何なのか分からないが、Error Toleranceの値に「0.1」以下の値を入れると、たとえAとBの値の差が「0.1」以内だとしてもFalseと判定されてしまう。
例)
A「10」‐B「9.9」=「0.1」
明らかに「0.1」以内のはずなのだが、False扱いされてしまう。
何でぇ??詳しい方求ム!!!!!!!!
それではまた!^^ノシ
タイマー処理!(十の位とか一の位とかそんな感じの)
今回は、
この表記でのタイマー処理をする。
これがなかなか複雑で難しかった。(もっと効率的な方法があるのかな?)
イベントグラフ(僕はGameModeBaseに処理を組んだが、別にレベルBPでもなんでもいいです)
用意する変数
変数名の解説
Minute・・・分
Second・・・秒
TensPlace・・・十の位
OnePlace・・・一の位
まず「1・2・3・・・・・」と1秒おきにカウントするようにする。
1秒おきに「TimerSecondOnePlace(秒の一の位)」に「1」を足していく。
「TimerSecondOnePlace」が「10」、つまり「10秒」に達したら「TimerSecondTensPlace(秒の十の位)」に「1」を足す。
そして「TimerSecondOnePlace」の値を「0」にセット。
これで、
「TimerSecondTensPlace(1)」と「TimerSecondOnePlace(0)」で「10秒」になったわけだ。
↓これはタイマーが「9分60秒」に達した時、つまり「10分」になる瞬間の処理。
まず先に「10分」に達する前のFalseに繋がってる処理を見よう。
「TimerSecondTensPlace」が「6」、「TimerSecondOnePlace」が「0」、つまり「60秒」に達した時、「TimerMinuteOnePlace(分の一の位)」に「1」を足す。
そして、「TimerSecondTensPlace」を「0」にセット。
この時点で「TimerMinuteOnePlace(1)」と「TimerSecondTensPlace(0)」「TimerSecondOnePlace(0)」なので、「1分」経ったことになる。
次にTrueに繋がる処理を見よう。
「9分60秒」、つまり「10分」に達した時、処理はTrueを通る。
「TimerMinuteTensPlace(分の十の位)」に「1」を足す。そして「TimerMinuteOnePlace」の値を「0」にセット。
その後、「TimerSecondTensPlace」「TimerSecondOnePlace」の値を「0」にセットする。
これで、「10分」経ったことになる。
あとは、タイマーを表示するための処理を作って完成だ。
(UMGによるテキスト表示の説明は省きます・・・泣)
これでプレイ!
10秒に到達した時
1分に到達した時
10分に到達した時
しっかりタイマー処理が行われていた!
それではまた!^^ノシ
ライトのSourceLengthとは??
UE4を始めたばかりの頃、ライトの詳細パネルに「SourceLength」という設定項目を見つけた。
適当にSourceLengthの値をいじってみて、ライトの形状を長くすることが可能だというのが分かった。
↓
が、「ライトの形状を長くしたところでどういう場面に使うのだろう??」というしょぼい疑問が頭に浮かび、それ以降は全くSourceLengthの設定をいじってこなかった。
使えるような場面が想像できなかったからだ。
だが最近SourceLengthの事について色々ggっていたら、ようやく使いどころが分かったので紹介する。
それは・・・
蛍光灯の光に使える!
(または長い形状の光源に使える!)
という事だ!
SourceLengthの値を「0」にした状態のライトを蛍光灯につけると、
蛍光灯のライトの光が床に丸く反射してるのが分かる。
では、SourceLengthの値を「100」にしてライトの形状を蛍光灯の長さに合わせたらどうなるか・・・
おわかりいただけただろうか。
SourceLengthの値「0」のやつよりも、
SourceLengthの値「100」にしたやつのほうが、
蛍光灯感(?)があると思う。
もし、あなたの作る作品で蛍光灯のような長い光源の物が出てくるときは、ぜひこのライトの「SourceLength」を活用してみてほしい。
それではまた!^^ノシ
物理シュミレーションに合わせた音の発生方法!
最近UE4で
どうやったら物理シュミレーションに合わせて音を鳴らすことが出来るんだろう??
という悩みを抱えていた。
例えば、サッカーボールがあったとして
サッカーボールを蹴り飛ばすと、当然ですが「ポーン」と音を鳴らしてすっ飛んでいく。
すっ飛んだ先で何度もバウンドするだろう。その時もバウンドする度に「ポンッ」「ポンッ」と音が鳴る。動きが止むと音も当然出ない。
つまり、僕がしたいのは
物理シュミレーション中の物体が何かにヒットする度に音を鳴らす!
という事をしたいのである!
音を鳴らしたいアクターの作成。
「BP_SimulatePhysicsActor」という名前にした。
SimulatePhysicsはチェックを入れておく。
イベントグラフ
SetNotifyRigidBodyCollisionで物理シュミレーション中に何かにヒットしたかのどうかの通知をオン。
~Google翻訳~
SetNotifyRigidBodyCollision・・・剛体衝突の通知を設定する
実際物理シュミレーション中に何かにヒットした時、通知が行われているかを確かめてみた。
何かにヒットする度に「1」ずつ画面左上にカウントされていく。
しっかりカウントされてるので、間違いないだろう。
このアクターが何かに衝突した時の力(A)が、(B)に入れた数値より小さい場合に音を鳴らす処理を行う。
このアクターが何かに衝突した時の力は、NormalImpulseに格納されている。
実際にやってみた。
アクターが跳ねる度にしっかりと音が鳴っていた。
やっていること自体は単純だが、覚えておいて損は無いだろう。
それではまた!^^ノシ
小ネタ!~LightFunctionって何??~
ライト系のアクター(ポイントライトやスポットライト)の詳細パネルでこのようなものがある。
LightFunction
いったいこれは何かというと・・・
光の形状をマテリアルで好きなように設定できるのだ。
例えばスポットライトだと光の形状が円錐状になっているが
LightFunctionを設定すると・・・
このような表現が可能だ。
~やり方~
まずペイントツールで表現したい光の形状を作成しよう。
自分は手裏剣型にした。
作成した光の形状を、UE4に直接ドラッグ&ドロップでインポートしよう。
マテリアルを作成。名前はとりあえず「M_LightFunction」にした。
中身はこう。
詳細パネルは以下のように。
レベル上にスポットライトを配置し、詳細パネル内のLightFunctionに作成した「M_LightFunction」を設定すると・・・
このようになったはずだ。
シンプルでとても面白い機能だと思う。
今のところ使い道はあまり思いつかないが、ナイトクラブとかそういうパーティー系のレベルを作る時にこのLightFunctionを使えばなかなかいい表現が出来るのではないだろうか??
もちろんスポットライトだけでなくポイントライトでも設定が可能だ。
ぜひ、自由に試して遊んでみてほしい。
それではまた!^^ノシ
ハイスコア処理で苦労した事!
ハイスコア処理で苦労した点。それは・・・
なぜかハイスコアが保存されない(デフォルト値のまま)
僕が最初にやっていた処理を見せる。
処理の内容としては・・・
・Boxコリジョンにプレイヤーがオーバーラップ。現在のステージのセーブデータが存在するかチェック。
・1回目のプレイはセーブデータが存在しないので、Falseへ。
・ゲームモードからスコア(タイム)を参照。CreatSaveGameObjectで新規セーブデータを作成し、変数に格納。
・ハイスコアにも格納。最後にセーブ。
・2回目以降のプレイ。Trueの処理。
・CreatSaveGameObjectで新規にセーブデータを作成。ゲームモードからスコア(タイム)を参照。変数に格納
・セーブデータをロード。
・ハイスコア判定。現在のクリアータイム(スコア)と前回のハイスコアを比較。
・ハイスコアならTrueへ行き、ハイスコアを上書き。ハイスコアじゃなければFalseへ。
さて、なぜ
なぜかハイスコアが保存されない(デフォルト値のまま)
↑のような問題が起きたのか。原因は、
ステージをクリアーする度、新規にセーブデータを作成していたから。
1回目のプレイで、CreatSaveGameObjectで新規に現在のステージのセーブデータを作成。
スコアが保存され、ハイスコアも保存される。
もう一度プレイした時、
またCreatSaveGameObjectで新規にセーブデータを作成しているのだ。
そうなると、前回ハイスコアに保存していた値がリセットされてしまう。
セーブデータを記録用紙に例えるなら・・・
1回目のプレイの記録用紙が
ぺらっと新しい記録用紙に変えられて記録されるようなもの。(分かりにくい絵かも・・・)
しかも2回目以降の処理は、
・現在クリアーした時のスコアを保存。
・前回のハイスコアと現在のクリアータイムを比較
という流れだ。
この時点で
ハイスコアには何も値(スコア)が格納されていない。
何故なら、前回のハイスコアの記録が先程の↓イラストのように無くなってしまっているからだ。
だからハイスコア配列はデフォルト値を返すしかないのだ。
ハイスコア配列のデフォルト値は「0」
「0秒」以下でクリアーなど出来るはずもないからどんなに早くクリアーしても一生ハイスコアという事にはならないのである。
自分なりに分かりやすく解説したつもりだがどうだっただろう・・・
何かの役に立てれば幸い。
それではまた!^^ノシ
レベル別でのハイスコア処理!
前回の続きのようなもの。
以下の記事で書いたが、
ステージ数が3つあるゲーム。という体で話を進めてきた。
前回まではStage1のみでのハイスコア処理を語ってきたので、今回からは残りの2ステージ、つまり
レベル別でのハイスコア処理!
を解説していく。
レベルはちゃんと3つ作ってあるはずなので、
「Stage2」レベルを開こう。
「Stage2」のレベルBPには、このような処理があるはずだ。
前回でも言ったが、
StageID・・・何ステージ目かを示す番号
なので、「Stage2」をクリアーした時には・・・
↑この名前でセーブデータが作成される。
「Stage3」は、レベルBPでStageIDを以下のようにセットしてるから、
↓以下の名前でセーブデータが作成される。
あとの処理は一緒。
レベル(ステージ)が変わり、それによってStageIDが変わって現在のレベル(ステージ)ごとにセーブデータが作成されるだけ。
↓赤枠で囲った部分が変わるだけ。あとは変わらない。
これによりレベル別のハイスコア判定ができるわけだ。
実際にプレイ。
Stage1を「10秒」でクリアー
Stage2を「15秒」でクリアー
Stage3を「20秒」でクリアーしてみる。
Stage1
Stage2
Stage3
次に全ステージを、前回よりも早くクリアーする。
Stage1
Stage2
Stage3
左上の文字を見ればわかるが、
「ハイスコア!」と表示されていた。
しっかりとレベル別にハイスコア判定が行われてることが分かる。
ここまで長々と書き連ねてきたから、色々雑な説明があるかもしれない。
だが、画像は比較的多く出してるつもりなので、とりあえず画像の通りにやってみれば、しっかりとハイスコア処理が出来るはずだ。
それではまた!^^ノシ