auの日記

プログラミング初心者の日記。(auはハンドルネームです)

UE4のカスタムイベントはすごかった

auです。

前にカスタムイベントをやってみて、関数のブループリント 版みたいな感じで楽しかったので感想を書きたいと思います。

カスタムイベントとは

カスタムイベントとは、自分で任意に作れるイベントのことです。他のブループリントなどで呼び出すことで、イベントを発生させることができました。

一つのブループリントにどんどん書いて行くと、ノードが絡まってよく見えなくなりそうなので、1つ1つの動作をカスタムイベントでまとめることで、綺麗に見ることができそうだと感じました。

LevelBPにあるカスタムイベントを、CharacterBPで呼び出したい - UE4 AnswerHub

このサイトにあるように、デバッグのような使い方もできるようなので、そのうちやって見たいと思います。

UE4のブループリント でif文を作った

auです。

今日は、UE4のブループリントを使って、if文を作りました。

ブループリント

f:id:program-shoshinsya:20181126163051p:plain


Cキーを押すと、コインが1枚ずつ増えていくようにしました。

これを、剰余を計算するために「Coin % 2」をして、if文で条件分岐するノード「ブランチ」を使いました。

結果

f:id:program-shoshinsya:20181126163219p:plain

UE4でなぜデストロイしなければならないのか

auです。


今日は、なぜデストロイしなければいけないのかを調べました。

デストロイとは

デストロイとは、アクタを消すことです。


UE4のアクタには寿命がなく、1秒ごとにコインを生成するという関数を組んだ場合、1秒ごとにアクタが1つずつ増えていくことになります。


仮に1時間放置した場合、アクタはコインだけでも3600個という膨大な数になってしまい、メモリやCPUを圧迫してしまう原因になってしまいます。


そこで、アクタを生成する分だけデストロイしてバランスをとるか、◯個まで増えたらそれ以上はスポーンしないようにしておくなど、対策をしなければなりません。


画面から消えてしまったとしても、はるか向こうではアクタが存在しているということもあり得るので、ちゃんとデストロイするように設定しておきましょう。

UE4でキャラクターのリスポーンを作った

auです。

今日は、UE4キャラクターのリスポーンを実装しました。

実際に実装してみた感想的なことを書いていきたいと思います。

リスポーンの設定で難しかったこと

リスポーンの実装で難しかったことは、キャラクターがリスポーンした際に、カメラや操作するためのアクタも消えてしまうことです。

キャラクターの死亡 = 操作するためのアクタ(コントローラー)も死亡

となっていて、キャラクターのスポーンと同時に、もう一度操作するためのアクタ(コントローラー)を呼び出さなければいけないというところが難しかったです。

リスポーンの条件
キャラクターの死亡→移動不能にする→5秒後にリスポーン(RespawnPlayerを呼び出す)


リスポーンの手順
キャラクターのリスポーンする位置情報を与える→キャラクターの生成→キャラクターにコントローラーを与える→OnDestroyをバインドする


OnDestroyedをバインドをしないと、死亡時にリスポーンするためのイベント(RespawnPlayer)が呼び出されません。


f:id:program-shoshinsya:20181124170616p:plain
(画像見にくいのでクリックしてください)

UE4でスポーンを実装した

auです。

今日は、UE4でスポーンを実装しました。

スポーンとは

スポーンとは、アクタを生成することです。

マインクラフトとかでよく聞く用語ですね。

スイッチを踏むと、コインが生成させるというスポーンのギミックを作りました。

UE4には「ターゲットポイント」という、位置情報をもつアクタがあります。これを使い、どこにコインを出現させるかを決めました。

f:id:program-shoshinsya:20181123225531p:plain

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秒後に扉が閉まるギミックを作った」です。

f:id:program-shoshinsya:20181121165331p:plain

主な流れ

スイッチを踏む→スイッチが少し沈む→沈みきったら扉が開く→5秒たったら逆再生(扉が閉まる)

これを作るのに難しかったのは、スイッチと扉の連携部分でした。

「スイッチを踏んでいるのになんで開かないんだろう・・・」と思っていたら、扉のノードとスイッチのノードがちゃんと呼べていなかったり・・・

逆に、「5秒待つ」という動作は、「Delay」というノードを利用することで簡単に行うことができました。

「逆再生」もタイムラインのReverseに繋げることで実装することができました(頭の中でこんがらがったけど)

実装できそうでよくわからないところ

スイッチを踏んだままの状態でいたとき、逆再生で戻った際にはどうなるんだろうと思い、実践してみましたが、何も起こりませんでした。一度降りてからもう一度、スイッチのコリジョンに当たるまで、もう一度実行することができませんでした。

これを解決するには、コリジョンを常にアクティブな状態にしておいて、当たってるか当たってないかで判断するしかないのかなーと思いました。どうやるかわかんないですけど。

自分が参考にしている本