[UE4]BPを作る時に留意している設定

- 本記事に関して
    - 確認バージョン: UE4.24.0
    -  C++側の設定も

普段やっていること、気にしている事を適当にメモしました。
大体において自分の思うままに組んでいますので、ぼくはそうじゃないとかあるかもしれません。
間違ってたらごめんなさい

# BP/AActorを作った時
## 説明 / Tooltip
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/ebc217a4-c6e5-7bf1-1d60-3f2975870ffc.png)

BPの「クラス設定」から詳細パネルの「Blueprint Description」
マウスカーソルを乗せた際に説明文が出てくるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/5aee0b4b-f006-6c8a-a034-82cb5f92d71b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b9cbf2e0-7b92-9dd6-f963-6be0f5bc22a7.png)


このBP自体の説明を記述して使用する人が何をするBPなのか分かりやすくする、他の人に引き継ぎを行う、1年後の自分に。

**C++の話**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/4f763a17-6fbe-220b-78a7-64e9f2fa1eba.png)
クラス前のコメントがそのまま説明に出てきます

## 要らない表示を消す: Hide Categories
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/52fa25b2-5644-1907-ccae-f67d98c9b207.png)

BPの「クラス設定」から詳細パネルの「Hide Categories」
使用しない設定を詳細パネルから消す事ができます
※消すカテゴリーは英語版名で記述する必要が有ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/10bc68f1-ed7b-0f17-2a37-3a17ef9546cb.png)
右の方は、「レプリケーション」「コリジョン」「インプット」が消えています。
デフォルトですと全部表示され、見づらくなっています。
また、「配置したBPではここ弄ったら駄目！」というのも隠せます。誤操作を減らせます。

**C++の話**
C++のActorではUCLASSに「[HideCategories](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Classes/Specifiers/index.html)」キーワードになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/dcabc465-5cdc-26c7-1c12-e6d5a0394c84.png)



## 抽象クラス設定: Generate Abstract Class
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/fb9eb677-f99b-3429-0df9-98c14dc44f2f.png)

BPの「クラス設定」から詳細パネルの「Generate Abstract Class」
他のBPの親クラスになる前提のBPに付けます。（親クラス/基底クラス専用BP）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/f47fd098-c979-ba43-96f4-a0105534f943.png)

効果としては下記の通りで、誤って配置されるのを防ぎます。
このBPから派生して更にBPを作っていくので、このBP自体を配置しないでほしい時に

- シーンに配置できない
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/20ddf6d2-459e-5667-920b-2b16ff23d01f.png)
- 「Spawn Actor」のリストに出てこない
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/462c7695-f19e-0182-ac61-aa7ea66e5bc1.png)
- 「コンポーネントを追加」のリストに出てこない
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/4d58c348-981a-52f5-3778-be47efed9c79.png)
- 変数の型としては使用できます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b3f0ed59-6041-88ed-d215-06d16ab9e4da.png)



**C++の話**
C++のActorではUCLASSに「[Abstract](https://docs.unrealengine.com/en-US/Programming/UnrealArchitecture/Reference/Classes/index.html)」キーワードになります
機能的には[C++の抽象クラス](https://ja.cppreference.com/w/cpp/language/abstract_class)とほぼ同じだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/81b8a981-6049-11af-77bd-4fe574fc45c6.png)




## [C++]レベルへの配置を禁止する: NotPlaceable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/9cedbc63-e479-21c2-54be-757ca31b80d3.png)
UCLASSに「[NotPlaceable](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Classes/Specifiers/index.html)」キーワードになります。
レベルへの直接配置を禁止します。
ロジックで使うActorなので、レベル配置はNG、といった時に使います。
大雑把に言えばManagerのような管理クラスや、プレイヤーが発射する弾クラスとかでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c00111c4-fd1e-5c01-dbdf-cc800e1e9479.png)
「配置」から検索しても出ないようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/3561d93d-b37e-40e9-0d3a-a1235ea5ada5.png)
Abstractと違い、Spawn Actorは出来ます

## クラスのデフォルト設定（チェックボックス類）
![2019-12-22_16h55_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/f5359249-e1c6-95bb-8878-8b3934f1005f.png)
エンジンの中まで把握していないので、ざっくりと要らないのはOFFにしておきます。

- **Start With Tick Enabled / Tick Interval(secs)**
    - Tickが要らなければOFF、必要ならどのくらいの頻度で必要なのか
    - （話すると長くなるので）参考資料
        - Unreal Engine 4を使って地球を衛る方法 - Tick
            - https://www.slideshare.net/EpicGamesJapan/unreal-engine-4-119752077/110
        - [UE4] Tickについて
            - https://qiita.com/EGJ-Axel_Riffard/items/faf6226db08736d05b81
- **Can Be Damaged**
    - Apply Damage系された時に処理するか。ダメージ処理必要なければOFFに
        - （エンジンの中まで見てないですが、処理候補となることで負荷になるかも）
- **Find Camera Component when View Target**
    - View（カメラ）ターゲットにされた時に検索するか？


# 変数を作った時

## ツールヒント
![2019-12-22_17h53_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/6dad1878-8fd6-4ff7-e524-a56cde3bd220.png)

変数にマウスカーソルを乗せた際に説明文が出てくるようになります
何に使ってる変数なのか、他の人や後の自分の為に説明を書いておきましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c334e544-1402-663b-5015-123449f6332e.png)


## ブループリント読み取り専用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/74798f07-cdc8-200b-a240-2a3796aeae59.png)

デフォルト値以外、ブループリントから値変更不可能になります。
パラメーター調整用に用意した変数で、ロジックで上書きされてほしくない時とかに使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b8e0f6f9-797e-2822-b0e2-e20165cb4e7a.png)
Setが出来ません

**C++の話**
UPROPERTYにBlueprintReadOnly指定にすると同じ効果になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/f97b367a-13e1-971d-8514-ad33f8c3659d.png)



## プライベート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/8ff1d02a-9fa4-23eb-e4c6-86394a4143ba.png)

他のBPからアクセス出来なくなります。自分自身のBPからはアクセス出来ます。
OFFですと、どこのBPからでもアクセス出来る為、後から流れを追う時に追いかけづらくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/950109c8-9126-4f52-da91-813e1499d507.png)
他のBPから候補に出てこなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c8849c8d-4323-906f-c774-32eb173832dc.png)
また、内部変数が増えてくると可視性が悪くなるのを防ぐ効果もあります。

## カテゴリ
![2019-12-22_17h46_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/ef652732-6009-bbc7-0768-9b462f713eed.png)
変数をカテゴリでグループ化出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/0befaf4f-bd6c-71b1-b675-583cdf9b1614.png)
変数欄やBPからのノード出しで並んでて可視性が……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b3b1c56b-68a4-a027-e290-e3650f33d501.png)
これをグループ化出来ます。

また、「|」を使うことで入れ子にも出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/b6ada252-8b37-8722-e1c4-a5d559b2c169.png)

可視性を上げましょう

**C++の話**
UPROPERTYのCategory指定で出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/4ab6830f-9402-7090-6c16-b002361900f8.png)


## 値範囲の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/771a0515-98ab-d38e-a5fd-bd7550ee080e.png)
変数を調整する際のスライダーで操作出来る範囲、入力結果のクランプが行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/fca73a09-64ad-d685-ad86-71d4b5dd74ff.png)
このスライダ範囲が設定されていないと、スライダーで弄ると数値が大きく動き細かい調整がしづらくなります。
特にシーンに配置して調整、シーケンサーで調整する変数等は仕込んでおく良い思います。
また、調整する人に「大体この辺の数値取る」という意図にもなります。
（「値の範囲」は0以下になったら絶対駄目、1.0より大きくなったら絶対駄目、とかキツイ制限かける時だけなのであんまり使わないかも）


# 関数を作った時
![2019-12-22_18h09_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/bacc0a1e-81e3-208e-6592-eff4532a7d65.png)
「説明」、「カテゴリ」は変数の時と同じです。

## アクセス指定子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/15049008-669b-bc9a-f448-a1545c76c193.png)
この関数はどこから使用可能か、になります。
自分自身の内部処理用の関数なのに、外のBPから呼び出しが出来てしまう……といった意図しない呼び出しを防ぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/59139a35-6f9d-9d60-5017-ab50e1c34d4f.png)

- **パブリック**: どこからでも使用可能
    - →他のBPから操作する時に
- **プロテクテッド**: 自分自身と、子ブループリントからのみ使用可能
    - →子ブループリントでも処理したい時に
- **プライベート**: 自分自身からのみ使用可能
    - →内部処理を行う時とかに

プライベート→プロテクテッド→パブリック、の順で可能な限りアクセス出来る範囲を狭めていく良い思います

**C++の話**
UFUNCTIONのmeta指定で「BlueprintProtected」で「プロテクテッド」指定できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/27d5b69a-1afd-0b04-409d-d8fa159b3849.png)