【UE4】地形で遊ぼう！

# はじめに

こんにちは。UE4超初心者（UE4歴、数十日）のがっちょです。

今回は、**新卒の就活作品用**に作った
[**C++地形生成ライブラリ**](https://github.com/Kasugaccho/DungeonTemplateLibrary)を使用して、UE4上に孤島を生成します。

![BP](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/Screenshot/sample.png)

---

# 完成した作品

[**>> Unreal Engine 4 Viewer Download [Windows/.exe/(x86/x64)] 📥**](https://drive.google.com/open?id=10eSTRS40n4jJrsOtM5_VOkwzVDfYIrc7)

孤島を駆け巡れます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">孤島散歩。 <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/FbJjOetevX">pic.twitter.com/FbJjOetevX</a></p>&mdash; がっちょ( ¨̮ ) (@wanotaitei) <a href="https://twitter.com/wanotaitei/status/1203720823791468544?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

# クラスの概要

[**>> dtl::shape::PerlinIsland (形状クラス)**](https://github.com/Kasugaccho/DungeonTemplateLibrary/wiki/dtl::shape::PerlinIsland-(%E5%BD%A2%E7%8A%B6%E3%82%AF%E3%83%A9%E3%82%B9))

---

# 導入方法

### [0. 前準備を行う](https://github.com/Kasugaccho/DungeonTemplateLibrary/wiki/%E3%82%AF%E3%83%A9%E3%82%B9-in-Unreal-Engine)

[**>> クラス in Unreal Engine**](https://github.com/Kasugaccho/DungeonTemplateLibrary/wiki/%E3%82%AF%E3%83%A9%E3%82%B9-in-Unreal-Engine)

上記のリンクに飛び、DTLのダウンロードから(プロジェクト名)Build.csの追加記述を行う。

---

### 1. BlueprintFunctionLibraryを継承したC++クラスを作成

**PerlinIsland.h**

```cpp
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PerlinIsland.generated.h"

UCLASS()
class (プロジェクト名マクロ)_API UPerlinIsland : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

		UFUNCTION(BlueprintCallable, Category = DTL, meta = (HidePin = "worldContextObject_", DefaultToSelf = "worldContextObject_"))
		static bool perlinIsland(const UObject* worldContextObject_, float frequency, int32 octaves, int32 max_value, int32 min_value);
};
```

※ `(プロジェクト名マクロ)_API` の部分は適宜変更する。

**PerlinIsland.cpp**

```cpp
#include "PerlinIsland.h"

#include "EngineUtils.h"
#include "Landscape.h"
#include "LandscapeInfo.h"
#include "LandscapeEditor/Public/LandscapeEditorUtils.h"

#include <DTL.hpp>

bool UPerlinIsland::perlinIsland(const UObject* worldContextObject_, float frequency, int32 octaves, int32 max_value, int32 min_value) {

	dtl::shape::PerlinIsland<uint16> generator(
		static_cast<double>(frequency),
		static_cast<size_t>(octaves),
		static_cast<uint16>(max_value),
		static_cast<uint16>(min_value));

	::UWorld* world{ worldContextObject_->GetWorld() };
	for (TActorIterator<ALandscape> actorItr(world); actorItr; ++actorItr) {
		::ALandscape* landscape{ *actorItr };
		if (landscape == nullptr) continue;
		::ULandscapeInfo::RecreateLandscapeInfo(world, false);

		::FIntRect rect{ landscape->GetBoundingRect() };
		const int32 w{ rect.Width() + 1 };
		const int32 h{ rect.Height() + 1 };

		::TArray<uint16> Data;
		Data.Init(0, w * h);
		generator.draw(Data, w, h);
		LandscapeEditorUtils::SetHeightmapData(landscape, Data);
		return true;
	}
	return false;
}
```

---

### 2.Actorを継承したブループリントクラスを作成

![BP](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/PerlinIsland/BP.png)

4つの変数を定義する。

|変数名|型|デフォルト値|
|:---|:---|:---|
|frequency|Float|2.0|
|octaves|Integer|10|
|max value|Integer|20000|
|min value|Integer|0|

![BP](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/PerlinIsland/BP_var.png)

EventPerlinIslandは `エディタで呼び出す(Call in Editor)` にチェックを入れる。

![BP](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/PerlinIsland/BP_Event.png)

今回定義する変数は `インスタンス編集可能(Instance Editable)` と `スポーン時に公開(Expose on Spawn)` にチェックを入れる。

![BP](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/PerlinIsland/BP_var2.png)

---

### 3. 完成

作成したActorをテキトーにレベルに配置する。
その後に `Landscape` を作成する。

![View](https://kasugaccho.github.io/DungeonPicture/Picture/UE4/PerlinIsland/View.png)

---

### 4. より詳しい解説記事

1～3を見てもよくわからなかったひとは

[**dtl::shape::PerlinIsland in Unreal Engine (形状クラス) 詳しい解説**](https://github.com/Kasugaccho/DungeonTemplateLibrary/wiki/dtl::shape::PerlinIsland-in-Unreal-Engine-(%E5%BD%A2%E7%8A%B6%E3%82%AF%E3%83%A9%E3%82%B9)-%E8%A9%B3%E3%81%97%E3%81%84%E8%A7%A3%E8%AA%AC) のページを参考にしてください。

---

# さいごに

<blockquote class="twitter-tweet"><p lang="in" dir="ltr">PerlinIsland <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/ozBmqluyok">pic.twitter.com/ozBmqluyok</a></p>&mdash; がっちょ( ¨̮ ) (@wanotaitei) <a href="https://twitter.com/wanotaitei/status/1206566272265113601?ref_src=twsrc%5Etfw">December 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回はUE4のランドスケープ機能をC++コードから呼び出して地形生成を行いました。
もう少し工夫すればより多く、バリエーション豊かな地形が創れそうですね。