UE4のカスタムイベントはすごかった
auです。
前にカスタムイベントをやってみて、関数のブループリント 版みたいな感じで楽しかったので感想を書きたいと思います。
カスタムイベントとは
カスタムイベントとは、自分で任意に作れるイベントのことです。他のブループリントなどで呼び出すことで、イベントを発生させることができました。
一つのブループリントにどんどん書いて行くと、ノードが絡まってよく見えなくなりそうなので、1つ1つの動作をカスタムイベントでまとめることで、綺麗に見ることができそうだと感じました。
LevelBPにあるカスタムイベントを、CharacterBPで呼び出したい - UE4 AnswerHub
このサイトにあるように、デバッグのような使い方もできるようなので、そのうちやって見たいと思います。
UE4でなぜデストロイしなければならないのか
auです。
今日は、なぜデストロイしなければいけないのかを調べました。
デストロイとは
デストロイとは、アクタを消すことです。
UE4のアクタには寿命がなく、1秒ごとにコインを生成するという関数を組んだ場合、1秒ごとにアクタが1つずつ増えていくことになります。
仮に1時間放置した場合、アクタはコインだけでも3600個という膨大な数になってしまい、メモリやCPUを圧迫してしまう原因になってしまいます。
そこで、アクタを生成する分だけデストロイしてバランスをとるか、◯個まで増えたらそれ以上はスポーンしないようにしておくなど、対策をしなければなりません。
画面から消えてしまったとしても、はるか向こうではアクタが存在しているということもあり得るので、ちゃんとデストロイするように設定しておきましょう。
UE4でキャラクターのリスポーンを作った
auです。
実際に実装してみた感想的なことを書いていきたいと思います。
リスポーンの設定で難しかったこと
リスポーンの実装で難しかったことは、キャラクターがリスポーンした際に、カメラや操作するためのアクタも消えてしまうことです。
キャラクターの死亡 = 操作するためのアクタ(コントローラー)も死亡
となっていて、キャラクターのスポーンと同時に、もう一度操作するためのアクタ(コントローラー)を呼び出さなければいけないというところが難しかったです。
リスポーンの条件
キャラクターの死亡→移動不能にする→5秒後にリスポーン(RespawnPlayerを呼び出す)
リスポーンの手順
キャラクターのリスポーンする位置情報を与える→キャラクターの生成→キャラクターにコントローラーを与える→OnDestroyをバインドする
OnDestroyedをバインドをしないと、死亡時にリスポーンするためのイベント(RespawnPlayer)が呼び出されません。
(画像見にくいのでクリックしてください)
C言語のシングルクォーテーションとダブルクォーテーションは違う
auです。
今日はif文で条件式を書いた際に、文字区切り(c[i] == 'c'みたいな)をしようとした際に、シングルクォーテーションとダブルクォーテーションで結果が違うということに気づきました。紛らわしい。
確認する
ダブルクォーテーションを組みました。
#include <stdio.h> int main(void) { char c[] = {"a", "b", "c", "d", "e"}; for (int i = 0; i < 6; i++) { if (c[i] == "c") { printf("Cだよ!!!\n"); } } return 0; } // コンパイル結果 9-2.c:4:22: warning: excess elements in char array initializer char c[] = {"a", "b", "c", "d", "e"}; ^~~ 9-2.c:7:18: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] if (c[i] == "c") { ^ ~~~ 9-2.c:7:18: warning: comparison between pointer and integer ('int' and 'char *') if (c[i] == "c") { ~~~~ ^ ~~~ 3 warnings generated.
Warningで返されてしまいました・・・
シングルクォーテーションで組んでみます。
#include <stdio.h> int main(void) { char c[] = {'a', 'b', 'c', 'd', 'e'}; for (int i = 0; i < 6; i++) { if (c[i] == 'c') { printf("Cだよ!!!\n"); } } return 0; } // 実行結果 Cだよ!!!
やったぜ。「char c[] = {'a', 'b', 'c', 'd', 'e'};」のところも「'」にしないとWarningで返されました。
調べてみると、どうやら""と''では文字型と数値型に変化するみたいです。それぞれ比較する場合、同じ型でないと比較ができないため、このような結果になっているそうです。
また、この場合比較しているのは文字コード(ASCII)です。ややこしい。
比較をした際に警告などが出る場合は、クォーテーションの確認をしてみてください。
UE4でスイッチを踏むと扉が開くギミックを作った
auです。
今日は主にUnreal Engine4の勉強をしていました。
今日やったことは「スイッチを踏んだ際に扉が開き、5秒後に扉が閉まるギミックを作った」です。
主な流れ
スイッチを踏む→スイッチが少し沈む→沈みきったら扉が開く→5秒たったら逆再生(扉が閉まる)
これを作るのに難しかったのは、スイッチと扉の連携部分でした。
「スイッチを踏んでいるのになんで開かないんだろう・・・」と思っていたら、扉のノードとスイッチのノードがちゃんと呼べていなかったり・・・
逆に、「5秒待つ」という動作は、「Delay」というノードを利用することで簡単に行うことができました。
「逆再生」もタイムラインのReverseに繋げることで実装することができました(頭の中でこんがらがったけど)
実装できそうでよくわからないところ
スイッチを踏んだままの状態でいたとき、逆再生で戻った際にはどうなるんだろうと思い、実践してみましたが、何も起こりませんでした。一度降りてからもう一度、スイッチのコリジョンに当たるまで、もう一度実行することができませんでした。
これを解決するには、コリジョンを常にアクティブな状態にしておいて、当たってるか当たってないかで判断するしかないのかなーと思いました。どうやるかわかんないですけど。