diff --git a/CHANGELOG.md b/CHANGELOG.md index dcb5e6c..d515565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log - Procedural 3D Dungeon Generator Plug-in +## 20251118-1.7.10 (62) +### Changes +* Unreal Engine 5.7 support +* Revised plant distribution methods +* Fixed several bugs +### 変更点 +* Unreal Engine 5.7対応 +* 植物の分布方法を修正 +* いくつかの不具合を修正 + ## 20251004-1.7.8 (61) ### Changes * Added the ability to assist actors spawning into the aisle grid diff --git a/DungeonGenerator.uplugin b/DungeonGenerator.uplugin index 54d9275..e7743f7 100644 --- a/DungeonGenerator.uplugin +++ b/DungeonGenerator.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, - "Version": 61, - "VersionName": "1.7.8", + "Version": 62, + "VersionName": "1.7.9", "FriendlyName": "Dungeon Generator", "Description": "Procedural 3d dungeon generator plugin. Easy generation of levels, mini-maps and missions.", "Category": "Procedural Systems", diff --git a/Source/DungeonGenerator/Private/Core/Generator.cpp b/Source/DungeonGenerator/Private/Core/Generator.cpp index 00e496d..a7d8946 100644 --- a/Source/DungeonGenerator/Private/Core/Generator.cpp +++ b/Source/DungeonGenerator/Private/Core/Generator.cpp @@ -1,10 +1,10 @@ /** -ダンジョン生成ソースファイル - -@author Shun Moriya -@copyright 2023- Shun Moriya -All Rights Reserved. -*/ + * ダンジョン生成ソースファイル + * + * @author Shun Moriya + * @copyright 2023- Shun Moriya + * All Rights Reserved. + */ #include "Generator.h" #include "GenerateParameter.h" @@ -1819,9 +1819,44 @@ namespace dungeon (room->GetParts() == Room::Parts::Hall || room->GetParts() == Room::Parts::Hanare); } - const Grid& Generator::GetGrid(const FIntVector& location) const noexcept + void Generator::SetNorthWall(const FIntVector& position, const bool enable) const noexcept { - return mVoxel->Get(location.X, location.Y, location.Z); + mVoxel->SetNorthWall(position, enable); + } + + void Generator::SetSouthWall(const FIntVector& position, const bool enable) const noexcept + { + mVoxel->SetSouthWall(position, enable); + } + + void Generator::SetEastWall(const FIntVector& position, const bool enable) const noexcept + { + mVoxel->SetEastWall(position, enable); + } + + void Generator::SetWestWall(const FIntVector& position, const bool enable) const noexcept + { + mVoxel->SetWestWall(position, enable); + } + + bool Generator::HasNorthWall(const FIntVector& position) const noexcept + { + return mVoxel->HasNorthWall(position); + } + + bool Generator::HasSouthWall(const FIntVector& position) const noexcept + { + return mVoxel->HasSouthWall(position); + } + + bool Generator::HasEastWall(const FIntVector& position) const noexcept + { + return mVoxel->HasEastWall(position); + } + + bool Generator::HasWestWall(const FIntVector& position) const noexcept + { + return mVoxel->HasWestWall(position); } uint32_t Generator::CalculateCRC32(const uint32_t hash) const noexcept @@ -1829,6 +1864,16 @@ namespace dungeon return mVoxel ? mVoxel->CalculateCRC32(hash) : hash; } + const Grid& Generator::GetGrid(const FIntVector& location) const noexcept + { + return mVoxel->Get(location.X, location.Y, location.Z); + } + + const Grid& Generator::GetGrid(const int32 x, const int32 y, const int32 z) const noexcept + { + return mVoxel->Get(x, y, z); + } + //////////////////////////////////////////////////////////////////////////////////////////////// // 以下はデバッグに関する関数です。 //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Source/DungeonGenerator/Private/Core/Generator.h b/Source/DungeonGenerator/Private/Core/Generator.h index 5e6790f..4d374db 100644 --- a/Source/DungeonGenerator/Private/Core/Generator.h +++ b/Source/DungeonGenerator/Private/Core/Generator.h @@ -1,10 +1,10 @@ /** -ダンジョン生成ヘッダーファイル - -@author Shun Moriya -@copyright 2023- Shun Moriya -All Rights Reserved. -*/ + * ダンジョン生成ヘッダーファイル + * + * @author Shun Moriya + * @copyright 2023- Shun Moriya + * All Rights Reserved. + */ #pragma once #include "GenerateParameter.h" @@ -27,8 +27,8 @@ namespace dungeon class Voxel; /** - ダンジョン生成クラス - */ + * ダンジョン生成クラス + */ class Generator : public std::enable_shared_from_this { public: @@ -47,48 +47,56 @@ namespace dungeon public: /** - コンストラクタ - */ + * コンストラクタ + */ Generator() = default; Generator(const Generator&) = delete; Generator& operator=(const Generator&) = delete; /** - デストラクタ - */ + * デストラクタ + */ virtual ~Generator() = default; /** - 生成 - @param[in] parameter 生成パラメータ - @return trueならば生成成功。falseならばGetLastErrorにて詳細を取得できます。 - */ + * 生成 + * @param[in] parameter 生成パラメータ + * @return trueならば生成成功。falseならばGetLastErrorにて詳細を取得できます。 + */ bool Generate(const GenerateParameter& parameter) noexcept; /** - 生成時に発生したエラーを取得します - */ + * 生成時に発生したエラーを取得します + */ Error GetLastError() const noexcept; /** - 生成パラメータを取得します - */ + * 生成パラメータを取得します + */ const GenerateParameter& GetGenerateParameter() const noexcept; /** - グリッド化された情報を取得 - */ + * グリッド化された情報を取得 + */ const std::shared_ptr& GetVoxel() const noexcept; + /** + * グリッド化された情報を取得 + */ const Grid& GetGrid(const FIntVector& location) const noexcept; + /** + * グリッド化された情報を取得 + */ + const Grid& GetGrid(const int32 x, const int32 y, const int32 z) const noexcept; + //////////////////////////////////////////////////////////////////////////////////////////// // Room size_t GetRoomCount() const noexcept; /** - 生成された部屋を更新します - */ + * 生成された部屋を更新します + */ template void ForEach(Function&& function) noexcept { @@ -99,8 +107,8 @@ namespace dungeon } /** - 生成された部屋を参照します - */ + * 生成された部屋を参照します + */ template void ForEach(Function&& function) const noexcept { @@ -110,16 +118,24 @@ namespace dungeon } } - // 深度による検索 + /** + * 深度による検索 + */ std::shared_ptr FindByIdentifier(const Identifier& identifier) const noexcept; - // 深度による検索 + /** + * 深度による検索 + */ std::vector> FindByDepth(const uint8_t depth) const noexcept; - // ブランチによる検索 + /** + * ブランチによる検索 + */ std::vector> FindByBranch(const uint8_t branchId) const noexcept; - // 到達可能な部屋を検索 + /** + * 到達可能な部屋を検索 + */ std::vector> FindByRoute(const std::shared_ptr& room) const noexcept; private: @@ -191,31 +207,31 @@ namespace dungeon // Point public: /** - 位置から部屋を検索します - 最初にヒットした部屋を返します - @param[in] point 検索位置 - @return nullptrなら検索失敗 - */ + * 位置から部屋を検索します + * 最初にヒットした部屋を返します + * @param[in] point 検索位置 + * @return nullptrなら検索失敗 + */ std::shared_ptr Find(const Point& point) const noexcept; /** - 位置から部屋を検索します - 検索位置を含むすべての部屋を返します - @param[in] point 検索位置 - @return コンテナのサイズが0なら検索失敗 - */ + * 位置から部屋を検索します + * 検索位置を含むすべての部屋を返します + * @param[in] point 検索位置 + * @return コンテナのサイズが0なら検索失敗 + */ std::vector> FindAll(const Point& point) const noexcept; /** - 開始地点にふさわしい点を取得します - @return 開始地点にふさわしい点 - */ + * 開始地点にふさわしい点を取得します + * @return 開始地点にふさわしい点 + */ const std::shared_ptr& GetStartPoint() const noexcept; /** - ゴール地点にふさわしい点を取得します - @return ゴール地点にふさわしい点 - */ + * ゴール地点にふさわしい点を取得します + * @return ゴール地点にふさわしい点 + */ const std::shared_ptr& GetGoalPoint() const noexcept; //////////////////////////////////////////////////////////////////////////////////////////// @@ -239,11 +255,53 @@ namespace dungeon void MarkBranchIdAndDepthFromStartRecursive(const std::shared_ptr& room, uint8_t& branchId, const uint8_t depth) noexcept; //////////////////////////////////////////////////////////////////////////////////////////// + // Attribute public: /** - Calculate CRC32 - @return CRC32 - */ + * 北側に壁があるか設定します + */ + void SetNorthWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 南側に壁があるか設定します + */ + void SetSouthWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 東側に壁があるか設定します + */ + void SetEastWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 西側に壁があるか設定します + */ + void SetWestWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 北側に壁があるか取得します + */ + bool HasNorthWall(const FIntVector& position) const noexcept; + + /** + * 南側に壁があるか取得します + */ + bool HasSouthWall(const FIntVector& position) const noexcept; + + /** + * 東側に壁があるか取得します + */ + bool HasEastWall(const FIntVector& position) const noexcept; + + /** + * 西側に壁があるか取得します + */ + bool HasWestWall(const FIntVector& position) const noexcept; + + //////////////////////////////////////////////////////////////////////////////////////////// + /** + * Calculate CRC32 + * @return CRC32 + */ uint32_t CalculateCRC32(const uint32_t hash = 0xffffffffU) const noexcept; private: @@ -273,8 +331,8 @@ namespace dungeon void FillStructuralColumnVoxel(const int32 x, const int32 y, const int32 minZ, const int32 maxZ) const; /** - リセット - */ + * リセット + */ void Reset(); @@ -311,9 +369,9 @@ namespace dungeon void DumpRoomDiagram(std::ofstream& stream, std::unordered_set& passableAisles, const std::shared_ptr& room) const noexcept; /** - デバッグ用に部屋と通路の情報をダンプします - @param[in] index 通路配列番号 - */ + * デバッグ用に部屋と通路の情報をダンプします + * @param[in] index 通路配列番号 + */ void DumpAisleAndRoomInformation(const size_t index) const noexcept; void DumpVoxel(const std::shared_ptr& point) const noexcept; diff --git a/Source/DungeonGenerator/Private/Core/Math/PerlinNoise.h b/Source/DungeonGenerator/Private/Core/Math/PerlinNoise.h index f05e53a..2d2b984 100644 --- a/Source/DungeonGenerator/Private/Core/Math/PerlinNoise.h +++ b/Source/DungeonGenerator/Private/Core/Math/PerlinNoise.h @@ -1,10 +1,10 @@ /** -パーリンノイズに関するヘッダーファイル - -@author Shun Moriya -@copyright 2023- Shun Moriya -All Rights Reserved. -*/ + * パーリンノイズに関するヘッダーファイル + * + * @author Shun Moriya + * @copyright 2023- Shun Moriya + * All Rights Reserved. + */ #pragma once #include @@ -15,29 +15,31 @@ namespace dungeon { class Random; - /*! - パーリンノイズクラス - */ + /** + * パーリンノイズクラス + */ class PerlinNoise final { public: explicit PerlinNoise(const std::shared_ptr& random); ~PerlinNoise() = default; - // SEED値を設定する + /** + * SEED値を設定する + */ void SetSeed(const std::shared_ptr& random); - /* - オクターブ無しノイズを取得する - [-1.0 ~ 1.0] - */ + /** + * オクターブ無しノイズを取得する + * [-1.0 ~ 1.0] + */ float Noise(float x, float y) const noexcept; float Noise(float x, float y, float z) const noexcept; - /* - オクターブ有りノイズを取得する - [-1.0 ~ 1.0] - */ + /** + * オクターブ有りノイズを取得する + * [-1.0 ~ 1.0] + */ float OctaveNoise(const std::size_t octaves, float x, float y) const noexcept; float OctaveNoise(const std::size_t octaves, float x, float y, float z) const noexcept; @@ -50,7 +52,6 @@ namespace dungeon float SetOctaveNoise(const std::size_t octaves, float x, float y) const noexcept; float SetOctaveNoise(const std::size_t octaves, float x, float y, float z) const noexcept; - private: std::array mHash; }; diff --git a/Source/DungeonGenerator/Private/Core/RoomGeneration/Room.h b/Source/DungeonGenerator/Private/Core/RoomGeneration/Room.h index a99d157..9b3ccc6 100644 --- a/Source/DungeonGenerator/Private/Core/RoomGeneration/Room.h +++ b/Source/DungeonGenerator/Private/Core/RoomGeneration/Room.h @@ -11,6 +11,7 @@ All Rights Reserved. #include "../Math/Point.h" #include #include +#include #include namespace dungeon diff --git a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.cpp b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.cpp index f3e1a35..9266d72 100644 --- a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.cpp +++ b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.cpp @@ -430,4 +430,34 @@ namespace dungeon return FString(TEXT("NoGeneration: ")) + noMeshGenerationName; } + + FString Grid::GetWallName() const noexcept + { + FString name; + + if (mPack.IsAttributeEnabled(Attribute::NorthWallMesh)) + { + name += TEXT("NorthWall"); + } + if (mPack.IsAttributeEnabled(Attribute::SouthWallMesh)) + { + if (!name.IsEmpty()) + name += TEXT(","); + name += TEXT("SouthWall"); + } + if (mPack.IsAttributeEnabled(Attribute::EastWallMesh)) + { + if (!name.IsEmpty()) + name += TEXT(","); + name += TEXT("EastWall"); + } + if (mPack.IsAttributeEnabled(Attribute::WestWallMesh)) + { + if (!name.IsEmpty()) + name += TEXT(","); + name += TEXT("WestWall"); + } + + return FString(TEXT("Wall: ")) + name; + } } diff --git a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.h b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.h index f057c38..100f2d6 100644 --- a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.h +++ b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.h @@ -15,14 +15,14 @@ All Rights Reserved. namespace dungeon { /** - グリッドクラス - */ + * グリッドクラス + */ class Grid final { public: /** - グリッド内のセルの種類 - */ + * グリッド内のセルの種類 + */ enum class Type : uint8_t { Floor, //!< 平らな地面(柱の生成判定なし) @@ -40,8 +40,8 @@ namespace dungeon static constexpr size_t TypeSize = static_cast(Type::OutOfBounds) + 1; /** - グリッド内のセルにある小物 - */ + * グリッド内のセルにある小物 + */ enum class Props : uint8_t { None, //!< 何も無い @@ -50,237 +50,233 @@ namespace dungeon }; static constexpr size_t PropsSize = static_cast(Props::UniqueLock) + 1; - public: /** - コンストラクタ - */ + * コンストラクタ + */ Grid() noexcept; /** - コンストラクタ - @param[in] type グリッドの種類 - */ + * コンストラクタ + * @param[in] type グリッドの種類 + */ explicit Grid(const Type type) noexcept; /** - コンストラクタ - @param[in] type グリッドの種類 - @param[in] direction グリッドの方向 - */ + * コンストラクタ + * @param[in] type グリッドの種類 + * @param[in] direction グリッドの方向 + */ Grid(const Type type, const Direction& direction) noexcept; /** - コンストラクタ - @param[in] type グリッドの種類 - @param[in] direction グリッドの方向 - @param[in] identifier 識別子 - */ + * コンストラクタ + * @param[in] type グリッドの種類 + * @param[in] direction グリッドの方向 + * @param[in] identifier 識別子 + */ Grid(const Type type, const Direction& direction, const uint16_t identifier) noexcept; /** - コンストラクタ - @param[in] type グリッドの種類 - @param[in] direction グリッドの方向 - @param[in] identifier 識別子 - @param[in] depthRatioFromStart スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) - */ + * コンストラクタ + * @param[in] type グリッドの種類 + * @param[in] direction グリッドの方向 + * @param[in] identifier 識別子 + * @param[in] depthRatioFromStart スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) + */ Grid(const Type type, const Direction& direction, const uint16_t identifier, const uint8_t depthRatioFromStart) noexcept; /** - デストラクタ - */ + * デストラクタ + */ ~Grid() = default; - public: /** - グリッドの方向を取得します - */ + * グリッドの方向を取得します + */ Direction GetDirection() const noexcept; /** - グリッドの方向を設定します - */ + * グリッドの方向を設定します + */ void SetDirection(const Direction direction) noexcept; /** - 中二階モデルの方向を取得します - */ + * 中二階モデルの方向を取得します + */ Direction GetCatwalkDirection() const noexcept; /** - 中二階モデルの方向を設定します - */ + * 中二階モデルの方向を設定します + */ void SetCatwalkDirection(const Direction direction) noexcept; /** - 識別子を取得します - */ + * 識別子を取得します + */ Identifier GetIdentifier() const noexcept; /** - 識別子を設定します - */ + * 識別子を設定します + */ void SetIdentifier(Identifier identifier) noexcept; /** - 識別子をリセット(無効化)します - */ + * 識別子をリセット(無効化)します + */ void ResetIdentifier() noexcept; /** - 無効な識別子か判定します? - */ + * 無効な識別子か判定します? + */ bool IsInvalidIdentifier() const noexcept; /** - 小道具を取得します - */ + * 小道具を取得します + */ Props GetProps() const noexcept; /** - 小道具を設定します - */ + * 小道具を設定します + */ void SetProps(const Props props) noexcept; /** - スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階)を取得します - @return スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) - */ + * スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階)を取得します + * @return スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) + */ uint8_t GetDepthRatioFromStart() const noexcept; /** - スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階)を取得します - @param[in] depthRatioFromStart スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) - */ + * スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階)を取得します + * @param[in] depthRatioFromStart スタート部屋からゴール部屋の部屋数からこの部屋の深さの割合(256段階) + */ void SetDepthRatioFromStart(const uint8_t depthRatioFromStart) noexcept; - public: /** - グリッドの種類を取得します - */ + * グリッドの種類を取得します + */ Type GetType() const noexcept; /** - グリッドの種類を設定します - */ + * グリッドの種類を設定します + */ void SetType(const Type type) noexcept; /** - グリッドのタイプを判定します - */ + * グリッドのタイプを判定します + */ bool Is(const Type type) const noexcept; /** - 部屋系のグリッド? - @warning 門は部屋系のグリッドでもあります - @return trueならば部屋系のグリッド - */ + * 部屋系のグリッド? + * @warning 門は部屋系のグリッドでもあります + * @return trueならば部屋系のグリッド + */ bool IsKindOfRoomType() const noexcept; /** - 門以外の部屋系のグリッド? - @warning 門は部屋系のグリッドでもあります - @return trueならば門以外の部屋系のグリッド - */ + * 門以外の部屋系のグリッド? + * @warning 門は部屋系のグリッドでもあります + * @return trueならば門以外の部屋系のグリッド + */ bool IsKindOfRoomTypeWithoutGate() const noexcept; /** - 門系のグリッド? - @warning 門は部屋系のグリッドでもあります - @return trueならば門系のグリッド - */ + * 門系のグリッド? + * @warning 門は部屋系のグリッドでもあります + * @return trueならば門系のグリッド + */ bool IsKindOfGateType() const noexcept; /** - 通路系のグリッド? - @return trueならば通路系のグリッド - */ + * 通路系のグリッド? + * @return trueならば通路系のグリッド + */ bool IsKindOfAisleType() const noexcept; /** - 斜面系のグリッド? - @return trueならば斜面系のグリッド - */ + * 斜面系のグリッド? + * @return trueならば斜面系のグリッド + */ bool IsKindOfSlopeType() const noexcept; /** - 空間系のグリッド? - @return trueならば空間系のグリッド - */ + * 空間系のグリッド? + * @return trueならば空間系のグリッド + */ bool IsKindOfSpatialType() const noexcept; /** - 水平方向に通行可能なセルか判定します - */ + * 水平方向に通行可能なセルか判定します + */ bool IsHorizontallyPassable() const noexcept; /** - 床(部屋)グリッドを生成します - */ + * 床(部屋)グリッドを生成します + */ static Grid CreateFloor(const std::shared_ptr& random, const uint16_t identifier, const uint8_t depthRatioFromStart) noexcept; /** - デッキ(部屋の周辺)グリッドを生成します - */ + * デッキ(部屋の周辺)グリッドを生成します + */ static Grid CreateDeck(const std::shared_ptr& random, const uint16_t identifier, const uint8_t depthRatioFromStart) noexcept; // 判定補助関数 /** - 自身からtoGridを見た時に床が生成されるか判定します - @param[in] checkNoMeshGeneration メッシュ生成禁止判定 - @return trueならば床の生成が可能 - */ + * 自身からtoGridを見た時に床が生成されるか判定します + * @param[in] checkNoMeshGeneration メッシュ生成禁止判定 + * @return trueならば床の生成が可能 + */ bool CanBuildFloor(const bool checkNoMeshGeneration) const noexcept; /** - 斜面が生成されるか判定します - @return trueならば斜面の生成が可能 - */ + * 斜面が生成されるか判定します + * @return trueならば斜面の生成が可能 + */ bool CanBuildSlope() const noexcept; /** - 自身からtoGridを見た時に屋根が生成されるか判定します - @param[in] toUpperGrid 参照先グリッド(通常は一つ上のグリッド) - @param[in] checkNoMeshGeneration メッシュ生成禁止判定 - @return trueならば屋根の生成が可能 - */ + * 自身からtoGridを見た時に屋根が生成されるか判定します + * @param[in] toUpperGrid 参照先グリッド(通常は一つ上のグリッド) + * @param[in] checkNoMeshGeneration メッシュ生成禁止判定 + * @return trueならば屋根の生成が可能 + */ bool CanBuildRoof(const Grid& toUpperGrid, const bool checkNoMeshGeneration) const noexcept; /** - 自身からtoGridを見た時に扉が生成されるか判定します - @param[in] toGrid 参照先グリッド - @param[in] direction 自身からtoGridの方向 - @param[in] mergeRooms trueならば部屋を結合する - @return trueならば扉の生成が可能 - */ + * 自身からtoGridを見た時に扉が生成されるか判定します + * @param[in] toGrid 参照先グリッド + * @param[in] direction 自身からtoGridの方向 + * @param[in] mergeRooms trueならば部屋を結合する + * @return trueならば扉の生成が可能 + */ bool CanBuildGate(const Grid& toGrid, const Direction::Index direction, const bool mergeRooms) const noexcept; /** - 自身からtoGridを見た時に壁が生成されるか判定します - @param[in] toGrid 参照先グリッド - @param[in] direction 自身からtoGridの方向 - @param[in] mergeRooms 部屋と部屋を結合する - @return trueならば壁の生成が可能 - */ + * 自身からtoGridを見た時に壁が生成されるか判定します + * @param[in] toGrid 参照先グリッド + * @param[in] direction 自身からtoGridの方向 + * @param[in] mergeRooms 部屋と部屋を結合する + * @return trueならば壁の生成が可能 + */ bool CanBuildWall(const Grid& toGrid, const Direction::Index direction, const bool mergeRooms) const noexcept; - public: /** - 天井のメッシュ生成禁止に設定します - @param[in] noRoofMeshGeneration 天井のメッシュ生成禁止 - */ + * 天井のメッシュ生成禁止に設定します + * @param[in] noRoofMeshGeneration 天井のメッシュ生成禁止 + */ void NoRoofMeshGeneration(const bool noRoofMeshGeneration) noexcept; /** - 床のメッシュ生成禁止に設定します - @param[in] noFloorMeshGeneration 床のメッシュ生成禁止 - */ + * 床のメッシュ生成禁止に設定します + * @param[in] noFloorMeshGeneration 床のメッシュ生成禁止 + */ void NoFloorMeshGeneration(const bool noFloorMeshGeneration) noexcept; /** - 床のメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + * 床のメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoFloorMeshGeneration() const noexcept; /** @@ -289,77 +285,77 @@ namespace dungeon */ bool IsNoRoofMeshGeneration() const noexcept; - /* - 北側の壁がメッシュ生成禁止か設定します - */ + /** + * 北側の壁がメッシュ生成禁止か設定します + */ void NoNorthWallMeshGeneration(const bool noWallMeshGeneration) noexcept; - /* - 南側の壁がメッシュ生成禁止か設定します - */ + /** + * 南側の壁がメッシュ生成禁止か設定します + */ void NoSouthWallMeshGeneration(const bool noWallMeshGeneration) noexcept; - /* - 東側の壁がメッシュ生成禁止か設定します - */ + /** + * 東側の壁がメッシュ生成禁止か設定します + */ void NoEastWallMeshGeneration(const bool noWallMeshGeneration) noexcept; - /* - 西側の壁がメッシュ生成禁止か設定します - */ + /** + * 西側の壁がメッシュ生成禁止か設定します + */ void NoWestWallMeshGeneration(const bool noWallMeshGeneration) noexcept; - /* - いずれかの方向で壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * いずれかの方向で壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoWallMeshGeneration() const noexcept; - /* - 指定の方向で壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 指定の方向で壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoWallMeshGeneration(const Direction direction) const noexcept; - /* - 指定の方向で壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 指定の方向で壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoWallMeshGeneration(const Direction::Index direction) const noexcept; - /* - 北側の壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 北側の壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoNorthWallMeshGeneration() const noexcept; - /* - 南側の壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 南側の壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoSouthWallMeshGeneration() const noexcept; - /* - 東側の壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 東側の壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoEastWallMeshGeneration() const noexcept; - /* - 西側の壁がメッシュ生成禁止か取得します - @return trueならメッシュ生成禁止 - */ + /** + * 西側の壁がメッシュ生成禁止か取得します + * @return trueならメッシュ生成禁止 + */ bool IsNoWestWallMeshGeneration() const noexcept; /** - 通路のマージ許可を設定します - */ + * 通路のマージ許可を設定します + */ void MergeAisle(const bool enable) noexcept; /** - 通路をマージ可能か取得します - @return trueならマージ可能 - */ + * 通路をマージ可能か取得します + * @return trueならマージ可能 + */ bool CanMergeAisle() const noexcept; /** @@ -392,32 +388,76 @@ namespace dungeon */ bool IsSubLevel() const noexcept; - public: /** - グリッドの種類の色を取得します - */ + * 北側に壁があるか設定します + */ + void SetNorthWall(const bool enable) noexcept; + + /** + * 南側に壁があるか設定します + */ + void SetSouthWall(const bool enable) noexcept; + + /** + * 東側に壁があるか設定します + */ + void SetEastWall(const bool enable) noexcept; + + /** + * 西側に壁があるか設定します + */ + void SetWestWall(const bool enable) noexcept; + + /** + * 北側に壁があるか取得します + */ + bool HasNorthWall() const noexcept; + + /** + * 南側に壁があるか取得します + */ + bool HasSouthWall() const noexcept; + + /** + * 東側に壁があるか取得します + */ + bool HasEastWall() const noexcept; + + /** + * 西側に壁があるか取得します + */ + bool HasWestWall() const noexcept; + + /** + * グリッドの種類の色を取得します + */ const FColor& GetTypeColor() const noexcept; /** - グリッドの種類の色を取得します - */ + * グリッドの種類の色を取得します + */ static const FColor& GetTypeColor(const Grid::Type gridType) noexcept; /** - グリッドの種類の名前を取得します - */ + * グリッドの種類の名前を取得します + */ const FString& GetTypeName() const noexcept; /** - グリッドの小道具の名前を取得します - */ + * グリッドの小道具の名前を取得します + */ const FString& GetPropsName() const noexcept; /** - グリッドの生成禁止状態の名前を取得します - */ + * グリッドの生成禁止状態の名前を取得します + */ FString GetNoMeshGenerationName() const noexcept; + /** + * グリッドの壁の状態の名前を取得します + */ + FString GetWallName() const noexcept; + private: static bool CanBuildWall_SlopeVsRoom() noexcept; static bool CanBuildWall_SlopeVsGate(const Grid& toGrid, const Direction::Index direction) noexcept; @@ -437,8 +477,12 @@ namespace dungeon Reserved, Catwalk, SubLevel, + NorthWallMesh, //!< 北方向に壁がある + EastWallMesh, //!< 東方向に壁がある + SouthWallMesh, //!< 南方向に壁がある + WestWallMesh, //!< 西方向に壁がある }; - static constexpr size_t AttributeSize = static_cast(Attribute::SubLevel) + 1; + static constexpr size_t AttributeSize = static_cast(Attribute::WestWallMesh) + 1; // Directionクラスの方向数 static constexpr size_t DirectionSize = 4; diff --git a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.inl b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.inl index 8e5f39c..ce43ea0 100644 --- a/Source/DungeonGenerator/Private/Core/Voxelization/Grid.inl +++ b/Source/DungeonGenerator/Private/Core/Voxelization/Grid.inl @@ -294,6 +294,47 @@ namespace dungeon return mPack.IsAttributeEnabled(Attribute::SubLevel); } + inline void Grid::SetNorthWall(const bool enable) noexcept + { + mPack.SetAttribute(Attribute::NorthWallMesh, enable); + } + + inline void Grid::SetSouthWall(const bool enable) noexcept + { + mPack.SetAttribute(Attribute::SouthWallMesh, enable); + } + + inline void Grid::SetEastWall(const bool enable) noexcept + { + mPack.SetAttribute(Attribute::EastWallMesh, enable); + } + + inline void Grid::SetWestWall(const bool enable) noexcept + { + mPack.SetAttribute(Attribute::WestWallMesh, enable); + } + + inline bool Grid::HasNorthWall() const noexcept + { + return mPack.IsAttributeEnabled(Attribute::NorthWallMesh); + } + + inline bool Grid::HasSouthWall() const noexcept + { + return mPack.IsAttributeEnabled(Attribute::SouthWallMesh); + } + + inline bool Grid::HasEastWall() const noexcept + { + return mPack.IsAttributeEnabled(Attribute::EastWallMesh); + } + + inline bool Grid::HasWestWall() const noexcept + { + return mPack.IsAttributeEnabled(Attribute::WestWallMesh); + } + + diff --git a/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.cpp b/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.cpp index 4e1edde..6ee0aa3 100644 --- a/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.cpp +++ b/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.cpp @@ -1,10 +1,10 @@ /** -グリッドに関するソースファイル - -@author Shun Moriya -@copyright 2023- Shun Moriya -All Rights Reserved. -*/ + * グリッドに関するソースファイル + * + * @author Shun Moriya + * @copyright 2023- Shun Moriya + * All Rights Reserved. + */ #include "Voxel.h" #include "../GenerateParameter.h" @@ -706,6 +706,12 @@ namespace dungeon return mGrids.get()[index]; } + Grid& Voxel::GetRef(const size_t index) const noexcept + { + check(index < static_cast(mWidth) * mDepth * mHeight); + return mGrids.get()[index]; + } + void Voxel::Set(const uint32_t x, const uint32_t y, const uint32_t z, const Grid& grid) const noexcept { if (x < mWidth && y < mDepth && z < mHeight) @@ -802,6 +808,62 @@ namespace dungeon return grid.Is(Grid::Type::Deck); } + void Voxel::SetNorthWall(const FIntVector& position, const bool enable) const noexcept + { + if (Contain(position)) + { + const auto index = Index(position); + GetRef(index).SetNorthWall(enable); + } + } + + void Voxel::SetSouthWall(const FIntVector& position, const bool enable) const noexcept + { + if (Contain(position)) + { + const auto index = Index(position); + GetRef(index).SetSouthWall(enable); + } + } + + void Voxel::SetEastWall(const FIntVector& position, const bool enable) const noexcept + { + if (Contain(position)) + { + const auto index = Index(position); + GetRef(index).SetEastWall(enable); + } + } + + void Voxel::SetWestWall(const FIntVector& position, const bool enable) const noexcept + { + if (Contain(position)) + { + const auto index = Index(position); + GetRef(index).SetWestWall(enable); + } + } + + bool Voxel::HasNorthWall(const FIntVector& position) const noexcept + { + return Get(position).HasNorthWall(); + } + + bool Voxel::HasSouthWall(const FIntVector& position) const noexcept + { + return Get(position).HasSouthWall(); + } + + bool Voxel::HasEastWall(const FIntVector& position) const noexcept + { + return Get(position).HasEastWall(); + } + + bool Voxel::HasWestWall(const FIntVector& position) const noexcept + { + return Get(position).HasWestWall(); + } + uint32_t Voxel::CalculateCRC32(const uint32_t hash) const noexcept { const size_t size = static_cast(mWidth) * mDepth * mHeight; diff --git a/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.h b/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.h index 2cd33f1..9c893ac 100644 --- a/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.h +++ b/Source/DungeonGenerator/Private/Core/Voxelization/Voxel.h @@ -1,10 +1,10 @@ /** -グリッドに関するヘッダーファイル - -@author Shun Moriya -@copyright 2023- Shun Moriya -All Rights Reserved. -*/ + * 立体的なグリッドに関するヘッダーファイル + * + * @author Shun Moriya + * @copyright 2023- Shun Moriya + * All Rights Reserved. + */ #pragma once #include "Grid.h" @@ -13,6 +13,7 @@ All Rights Reserved. #include "../PathGeneration/PathFinder.h" #include #include +#include #include namespace dungeon @@ -24,8 +25,8 @@ namespace dungeon struct GenerateParameter; /** - グリッドクラス - */ + * 立体的なグリッドクラス + */ class Voxel final { public: @@ -35,122 +36,131 @@ namespace dungeon GoalPointIsOutsideGoalRange, }; - public: /** - コンストラクタ - */ + * コンストラクタ + */ explicit Voxel(const GenerateParameter& parameter) noexcept; /** - デストラクタ - */ + * デストラクタ + */ ~Voxel() = default; /** - ボクセル空間の幅を取得します - */ + * ボクセル空間の幅を取得します + */ uint32_t GetWidth() const noexcept; /** - ボクセル空間の奥行きを取得します - */ + * ボクセル空間の奥行きを取得します + */ uint32_t GetDepth() const noexcept; /** - ボクセル空間の高さを取得します - */ + * ボクセル空間の高さを取得します + */ uint32_t GetHeight() const noexcept; /** - グリッド内のグリッドを取得します - @param[in] x X座標 - @param[in] y Y座標 - @param[in] z Z座標 - TODO: 座標関連はFIntVectorに統一して下さい - @return グリッド - */ + * グリッド内のグリッドを取得します + * @param[in] x X座標 + * @param[in] y Y座標 + * @param[in] z Z座標 + * TODO: 座標関連はFIntVectorに統一して下さい + * @return グリッド + */ const Grid& Get(const uint32_t x, const uint32_t y, const uint32_t z) const noexcept; /** - グリッド内のグリッドを取得します - @param[in] location グリッド座標 - @return グリッド - */ + * グリッド内のグリッドを取得します + * @param[in] location グリッド座標 + * @return グリッド + */ const Grid& Get(const FIntVector& location) const noexcept; /** - グリッド内のグリッドを取得します - @param[in] index 配列番号 - @return グリッド - */ + * グリッド内のグリッドを取得します + * @param[in] index 配列番号 + * @return グリッド + */ const Grid& Get(const size_t index) const noexcept; /** - グリッド内のグリッドを設定します - @param[in] x X座標 - @param[in] y Y座標 - @param[in] z Z座標 - @param[in] grid グリッド - TODO: 座標関連はFIntVectorに統一して下さい - */ + * グリッド内のグリッドを設定します + * @param[in] x X座標 + * @param[in] y Y座標 + * @param[in] z Z座標 + * @param[in] grid グリッド + * TODO: 座標関連はFIntVectorに統一して下さい + */ void Set(const uint32_t x, const uint32_t y, const uint32_t z, const Grid& grid) const noexcept; /** - グリッド内のグリッドを設定します - @param[in] location グリッド座標 - @param[in] grid グリッド - */ + * グリッド内のグリッドを設定します + * @param[in] location グリッド座標 + * @param[in] grid グリッド + */ void Set(const FIntVector& location, const Grid& grid) const noexcept; + private: /** - 矩形の範囲にGridを書き込みます - @param[in] min 最小座標 - @param[in] max 最大座標 - @param[in] fillGrid 塗りつぶすグリッド - @param[in] floorGrid 一階部分のグリッド - */ + * グリッド内のグリッド参照を取得します + * 範囲外を指定した場合はアサートで停止するのでContainでindexを調べて下さい。 + * @param[in] index 配列番号 + * @return グリッド参照 + */ + Grid& GetRef(const size_t index) const noexcept; + + public: + /** + * 矩形の範囲にGridを書き込みます + * @param[in] min 最小座標 + * @param[in] max 最大座標 + * @param[in] fillGrid 塗りつぶすグリッド + * @param[in] floorGrid 一階部分のグリッド + */ void Rectangle(const FIntVector& min, const FIntVector& max, const Grid& fillGrid, const Grid& floorGrid) const noexcept; /** - 天井がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noRoofMeshGeneration 天井メッシュの生成禁止 - */ + * 天井がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noRoofMeshGeneration 天井メッシュの生成禁止 + */ void NoRoofMeshGeneration(const FIntVector& location, const bool noRoofMeshGeneration) const noexcept; /** - 床がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noFloorMeshGeneration 床メッシュの生成禁止 - */ + * 床がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noFloorMeshGeneration 床メッシュの生成禁止 + */ void NoFloorMeshGeneration(const FIntVector& location, const bool noFloorMeshGeneration) const noexcept; /** - 北側の壁がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noWallMeshGeneration 壁メッシュの生成禁止 - */ + * 北側の壁がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noWallMeshGeneration 壁メッシュの生成禁止 + */ void NoNorthWallMeshGeneration(const FIntVector& location, const bool noWallMeshGeneration) const noexcept; /** - 南側の壁がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noWallMeshGeneration 壁メッシュの生成禁止 - */ + * 南側の壁がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noWallMeshGeneration 壁メッシュの生成禁止 + */ void NoSouthWallMeshGeneration(const FIntVector& location, const bool noWallMeshGeneration) const noexcept; /** - 東側の壁がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noWallMeshGeneration 壁メッシュの生成禁止 - */ + * 東側の壁がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noWallMeshGeneration 壁メッシュの生成禁止 + */ void NoEastWallMeshGeneration(const FIntVector& location, const bool noWallMeshGeneration) const noexcept; /** - 西側の壁がメッシュ生成禁止か設定します - @param[in] location グリッドの位置 - @param[in] noWallMeshGeneration 壁メッシュの生成禁止 - */ + * 西側の壁がメッシュ生成禁止か設定します + * @param[in] location グリッドの位置 + * @param[in] noWallMeshGeneration 壁メッシュの生成禁止 + */ void NoWestWallMeshGeneration(const FIntVector& location, const bool noWallMeshGeneration) const noexcept; /** @@ -174,17 +184,17 @@ namespace dungeon }; /** - 門を生成可能な場所を探します - 1. 部屋の内部から部屋の外郭を検索します。 - 2. 部屋の外のグリッドは Grid::Type::Empty である必要があります。 - @param[out] result FIntVector配列 - @param[in] maxResultCount resultの最大数 - @param[in] start スタート部屋のFIntVector - @param[in] identifier スタート部屋のIdentifier - @param[in] goal ゴール部屋のFIntVector - @param[in] shared trueなら通路を共有する - @return trueならば検索成功 - */ + * 門を生成可能な場所を探します + * 1. 部屋の内部から部屋の外郭を検索します。 + * 2. 部屋の外のグリッドは Grid::Type::Empty である必要があります。 + * @param[out] result FIntVector配列 + * @param[in] maxResultCount resultの最大数 + * @param[in] start スタート部屋のFIntVector + * @param[in] identifier スタート部屋のIdentifier + * @param[in] goal ゴール部屋のFIntVector + * @param[in] shared trueなら通路を共有する + * @return trueならば検索成功 + */ bool SearchGateLocation(std::vector& result, const size_t maxResultCount, const FIntVector& start, const Identifier& identifier, const FIntVector& goal, const bool shared) const noexcept; /** @@ -202,12 +212,12 @@ namespace dungeon }; /** - 経路をGridに書き込みます - @param[in] startToGoal 始点にできる位置 - @param[in] goalToStart 終点に出来る位置 - @param[in] aisleParameter 通路生成パラメータ - @return falseならば到達できなかった - */ + * 経路をGridに書き込みます + * @param[in] startToGoal 始点にできる位置 + * @param[in] goalToStart 終点に出来る位置 + * @param[in] aisleParameter 通路生成パラメータ + * @return falseならば到達できなかった + */ bool Aisle(const std::vector& startToGoal, const std::vector& goalToStart, const AisleParameter& aisleParameter) noexcept; /** @@ -237,9 +247,9 @@ namespace dungeon public: /** - グリッド内のグリッドを更新します - @param[in] function グリッドを参照して更新する関数 - */ + * グリッド内のグリッドを更新します + * @param[in] function グリッドを参照して更新する関数 + */ template void Each(Function&& function) const noexcept { @@ -259,84 +269,124 @@ namespace dungeon } /** - グリッド内のグリッドを取得します - @param[in] index 配列番号 - @return グリッド - */ + * グリッド内のグリッドを取得します + * @param[in] index 配列番号 + * @return グリッド + */ Grid& operator[](const size_t index) noexcept; /** - グリッド内のグリッドを取得します - @param[in] index 配列番号 - @return グリッド - */ + * グリッド内のグリッドを取得します + * @param[in] index 配列番号 + * @return グリッド + */ const Grid& operator[](const size_t index) const noexcept; /** - 座標からボクセルのインデックスを取得します - @param[in] x X座標 - @param[in] y Y座標 - @param[in] z Z座標 - @return インデックス - */ + * 座標からボクセルのインデックスを取得します + * @param[in] x X座標 + * @param[in] y Y座標 + * @param[in] z Z座標 + * @return インデックス + */ size_t Index(const uint32_t x, const uint32_t y, const uint32_t z) const noexcept; /** - 座標からボクセルのインデックスを取得します - @param[in] location 座標 - @return インデックス - */ + * 座標からボクセルのインデックスを取得します + * @param[in] location 座標 + * @return インデックス + */ size_t Index(const FIntVector& location) const noexcept; /** - 座標がボクセル空間内に含まれているか調べます - @param[in] location 座標 - @return trueならば座標はボクセル空間内内部を指している - */ + * 座標がボクセル空間内に含まれているか調べます + * @param[in] location 座標 + * @return trueならば座標はボクセル空間内内部を指している + */ bool Contain(const FIntVector& location) const noexcept; /** - 生成時に発生したエラーを取得します - */ + * 生成時に発生したエラーを取得します + */ Error GetLastError() const noexcept; /** - Calculate CRC32 - @return CRC32 - */ + * Calculate CRC32 + * @return CRC32 + */ uint32_t CalculateCRC32(const uint32_t hash = 0xffffffffU) const noexcept; private: /** - 通行可能か調べます - @param[in] location 座標 - @param[in] includeAisle 通行可能なグリッドに通路を含める - @return trueならば通行可能 - */ + * 通行可能か調べます + * @param[in] location 座標 + * @param[in] includeAisle 通行可能なグリッドに通路を含める + * @return trueならば通行可能 + */ bool IsPassable(const FIntVector& location, const bool includeAisle) const noexcept; /** - ゴールに到達したか? - 進入方向の許可を含めた確認が必要ならDirection付きの関数を利用する事 - @param[in] location 座標 - @param[in] goalAltitude ゴールの高度 - @param[in] goalCondition ゴールの条件 - @return trueならばゴールに到達 - */ + * ゴールに到達したか? + * 進入方向の許可を含めた確認が必要ならDirection付きの関数を利用する事 + * @param[in] location 座標 + * @param[in] goalAltitude ゴールの高度 + * @param[in] goalCondition ゴールの条件 + * @return trueならばゴールに到達 + */ static bool IsReachedGoal(const FIntVector& location, const int32_t goalAltitude, const PathGoalCondition& goalCondition) noexcept; /** - ゴールに到達したか? - 進入方向の許可を含めた確認をします。不要ならDirection無しの関数を利用する事 - @param[in] location 座標 - @param[in] goalAltitude ゴールの高度 - @param[in] goalCondition ゴールの条件 - @param[in] enteringDirection 進入方向 - @return trueならばゴールに到達 - */ + * ゴールに到達したか? + * 進入方向の許可を含めた確認をします。不要ならDirection無しの関数を利用する事 + * @param[in] location 座標 + * @param[in] goalAltitude ゴールの高度 + * @param[in] goalCondition ゴールの条件 + * @param[in] enteringDirection 進入方向 + * @return trueならばゴールに到達 + */ bool IsReachedGoalWithDirection(const FIntVector& location, const int32_t goalAltitude, const PathGoalCondition& goalCondition, const Direction& enteringDirection) const noexcept; public: + /** + * 北側に壁があるか設定します + */ + void SetNorthWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 南側に壁があるか設定します + */ + void SetSouthWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 東側に壁があるか設定します + */ + void SetEastWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 西側に壁があるか設定します + */ + void SetWestWall(const FIntVector& position, const bool enable) const noexcept; + + /** + * 北側に壁があるか取得します + */ + bool HasNorthWall(const FIntVector& position) const noexcept; + + /** + * 南側に壁があるか取得します + */ + bool HasSouthWall(const FIntVector& position) const noexcept; + + /** + * 東側に壁があるか取得します + */ + bool HasEastWall(const FIntVector& position) const noexcept; + + /** + * 西側に壁があるか取得します + */ + bool HasWestWall(const FIntVector& position) const noexcept; + /** * デバッグ用の画像を出力します * @param filename ファイル名 diff --git a/Source/DungeonGenerator/Private/DungeonGenerateActor.cpp b/Source/DungeonGenerator/Private/DungeonGenerateActor.cpp index ff2a10a..3832fdb 100644 --- a/Source/DungeonGenerator/Private/DungeonGenerateActor.cpp +++ b/Source/DungeonGenerator/Private/DungeonGenerateActor.cpp @@ -19,6 +19,7 @@ ADungeonGenerateActorは配置可能(Placeable)、ADungeonGeneratedActorは配 #include "Helper/DungeonAisleGridMap.h" #include "MainLevel/DungeonMainLevelScriptActor.h" #include "Parameter/DungeonGenerateParameter.h" +#include #include #include #include @@ -490,7 +491,8 @@ void ADungeonGenerateActor::DrawDebugInformation() const } if (grid.IsSubLevel()) message.Append(TEXT("SubLevel\n")); - message.Append(grid.GetNoMeshGenerationName()); + message.Append(grid.GetNoMeshGenerationName() + TEXT("\n")); + message.Append(grid.GetWallName()); DrawDebugString( GetWorld(), center, @@ -535,6 +537,9 @@ void ADungeonGenerateActor::DrawDebugInformation() const if (grid.IsSubLevel()) output.Add(TEXT("SubLevel")); + output.Add(grid.GetNoMeshGenerationName()); + output.Add(grid.GetWallName()); + FString message; for (const FString& line : output) { @@ -542,8 +547,6 @@ void ADungeonGenerateActor::DrawDebugInformation() const message.Append(TEXT("\n")); } - message.Append(grid.GetNoMeshGenerationName() + TEXT("\n")); - DrawDebugString( playerPawn->GetWorld(), playerPawn->GetPawnViewLocation(), diff --git a/Source/DungeonGenerator/Private/DungeonGenerateBase.cpp b/Source/DungeonGenerator/Private/DungeonGenerateBase.cpp index a66af4c..ac4bdc4 100644 --- a/Source/DungeonGenerator/Private/DungeonGenerateBase.cpp +++ b/Source/DungeonGenerator/Private/DungeonGenerateBase.cpp @@ -24,16 +24,19 @@ ADungeonGenerateActorは配置可能(Placeable)、ADungeonGeneratedActorは配 #include "MainLevel/DungeonComponentActivatorComponent.h" #include "Mission/DungeonRoomProps.h" #include "Parameter/DungeonGenerateParameter.h" -#include "SubActor/DungeonRoomSensorBase.h" #include "SubActor/DungeonDoorBase.h" +#include "SubActor/DungeonRoomSensorBase.h" +#include "SubActor/DungeonRoomSensorDatabase.h" #include "PluginInformation.h" #include "Helper/DungeonAisleGridMap.h" +#include #include #include +#include #include #include #include @@ -46,7 +49,6 @@ ADungeonGenerateActorは配置可能(Placeable)、ADungeonGeneratedActorは配 #include #include -#include #include #include @@ -54,10 +56,10 @@ ADungeonGenerateActorは配置可能(Placeable)、ADungeonGeneratedActorは配 #include #include -#include "SubActor/DungeonRoomSensorDatabase.h" #if WITH_EDITOR // UnrealEd +#include #include #include #include @@ -780,13 +782,14 @@ void ADungeonGenerateBase::CreateImplement_AddTerrain(RoomAndRoomSensorMap& room CreateImplement_AddFloorAndSlope(createImplementParameter); END_STOPWATCH(floorAndSlopeStopwatch); } -#if 1 + // Generate wall mesh { BEGIN_STOPWATCH(); CreateImplement_ReserveWall(createImplementParameter); END_STOPWATCH(wallStopwatch); } + // Generate mesh for pillars and torches { BEGIN_STOPWATCH(); @@ -800,7 +803,7 @@ void ADungeonGenerateBase::CreateImplement_AddTerrain(RoomAndRoomSensorMap& room CreateImplement_AddDoor(createImplementParameter, dungeonRoomSensorBase, hasAuthority); END_STOPWATCH(doorStopwatch); } -#endif + // Generate roof mesh { BEGIN_STOPWATCH(); @@ -808,6 +811,11 @@ void ADungeonGenerateBase::CreateImplement_AddTerrain(RoomAndRoomSensorMap& room END_STOPWATCH(roofStopwatch); } + // Reserve Vegetation Generation Aisle Bounds + { + CreateImplement_ReserveVegetationGenerationAisleBounds(createImplementParameter); + } + return true; } ); @@ -928,64 +936,92 @@ void ADungeonGenerateBase::CreateImplement_ReserveWall(const CreateImplementPara if (dungeonPartsSelectionMethod == EDungeonPartsSelectionMethod::GridIndex || parts != nullptr) { // 北側の壁 - if (cp.mGrid.CanBuildWall(mGenerator->GetVoxel()->Get(cp.mGridLocation.X, cp.mGridLocation.Y - 1, cp.mGridLocation.Z), dungeon::Direction::North, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildWall(mGenerator->GetGrid(cp.mGridLocation.X, cp.mGridLocation.Y - 1, cp.mGridLocation.Z), dungeon::Direction::North, mParameter->IsMergeRooms())) { // 面によるパーツ選択を行う場合はここで抽選する if (dungeonPartsSelectionMethod == EDungeonPartsSelectionMethod::GridIndex) { parts = mParameter->SelectWallPartsByFace(meshSet, cp.mGridLocation, dungeon::Direction(dungeon::Direction::North)); } + if (parts != nullptr) + { + FVector wallPosition = cp.mCenterPosition; + wallPosition.Y -= cp.mGridHalfSize.Y; + mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 0.f)); - FVector wallPosition = cp.mCenterPosition; - wallPosition.Y -= cp.mGridHalfSize.Y; - mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 0.f)); + // グリッドの北側に壁がある事を記録 + mGenerator->SetNorthWall(cp.mGridLocation, true); + } } // 南側の壁 - if (cp.mGrid.CanBuildWall(mGenerator->GetVoxel()->Get(cp.mGridLocation.X, cp.mGridLocation.Y + 1, cp.mGridLocation.Z), dungeon::Direction::South, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildWall(mGenerator->GetGrid(cp.mGridLocation.X, cp.mGridLocation.Y + 1, cp.mGridLocation.Z), dungeon::Direction::South, mParameter->IsMergeRooms())) { // 面によるパーツ選択を行う場合はここで抽選する if (dungeonPartsSelectionMethod == EDungeonPartsSelectionMethod::GridIndex) { parts = mParameter->SelectWallPartsByFace(meshSet, cp.mGridLocation, dungeon::Direction(dungeon::Direction::South)); } + if (parts != nullptr) + { + FVector wallPosition = cp.mCenterPosition; + wallPosition.Y += cp.mGridHalfSize.Y; + mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 180.f)); - FVector wallPosition = cp.mCenterPosition; - wallPosition.Y += cp.mGridHalfSize.Y; - mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 180.f)); + // グリッドの南側に壁がある事を記録 + mGenerator->SetSouthWall(cp.mGridLocation, true); + } } // 東側の壁 - if (cp.mGrid.CanBuildWall(mGenerator->GetVoxel()->Get(cp.mGridLocation.X + 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::East, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildWall(mGenerator->GetGrid(cp.mGridLocation.X + 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::East, mParameter->IsMergeRooms())) { // 面によるパーツ選択を行う場合はここで抽選する if (dungeonPartsSelectionMethod == EDungeonPartsSelectionMethod::GridIndex) { parts = mParameter->SelectWallPartsByFace(meshSet, cp.mGridLocation, dungeon::Direction(dungeon::Direction::East)); } + if (parts != nullptr) + { + FVector wallPosition = cp.mCenterPosition; + wallPosition.X += cp.mGridHalfSize.X; + mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 90.f)); - FVector wallPosition = cp.mCenterPosition; - wallPosition.X += cp.mGridHalfSize.X; - mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, 90.f)); + // グリッドの東側に壁がある事を記録 + mGenerator->SetEastWall(cp.mGridLocation, true); + } } // 西側の壁 - if (cp.mGrid.CanBuildWall(mGenerator->GetVoxel()->Get(cp.mGridLocation.X - 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::West, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildWall(mGenerator->GetGrid(cp.mGridLocation.X - 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::West, mParameter->IsMergeRooms())) { // 面によるパーツ選択を行う場合はここで抽選する if (dungeonPartsSelectionMethod == EDungeonPartsSelectionMethod::GridIndex) { parts = mParameter->SelectWallPartsByFace(meshSet, cp.mGridLocation, dungeon::Direction(dungeon::Direction::West)); } + if (parts != nullptr) + { + FVector wallPosition = cp.mCenterPosition; + wallPosition.X -= cp.mGridHalfSize.X; + mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, -90.f)); - FVector wallPosition = cp.mCenterPosition; - wallPosition.X -= cp.mGridHalfSize.X; - mReservedWallInfo.emplace_back(parts->StaticMesh, parts->CalculateWorldTransform(wallPosition, -90.f)); + // グリッドの西側に壁がある事を記録 + mGenerator->SetWestWall(cp.mGridLocation, true); + } } } } +/** + * この関数はGridに対して壁フラグの設定(CreateImplement_ReserveWall) + * が完了してから呼び出してください + */ +void ADungeonGenerateBase::CreateImplement_ReserveVegetationGenerationAisleBounds(const CreateImplementParameter& cp) const +{ +} + void ADungeonGenerateBase::CreateImplement_AddWall() { if (mOnAddWall) @@ -1006,7 +1042,7 @@ void ADungeonGenerateBase::CreateImplement_AddRoof(const CreateImplementParamete if (mOnAddRoof == nullptr) return; - if (cp.mGrid.CanBuildRoof(mGenerator->GetVoxel()->Get(cp.mGridLocation.X, cp.mGridLocation.Y, cp.mGridLocation.Z + 1), true)) + if (cp.mGrid.CanBuildRoof(mGenerator->GetGrid(cp.mGridLocation.X, cp.mGridLocation.Y, cp.mGridLocation.Z + 1), true)) { const UDungeonMeshSetDatabase* dungeonMeshSetDatabase; //if (cp.mGrid.IsKindOfRoomType()) @@ -1046,14 +1082,14 @@ void ADungeonGenerateBase::CreateImplement_AddDoor(const CreateImplementParamete if (const FDungeonDoorActorParts* parts = mParameter->SelectDoorParts(cp.mGridIndex, cp.mGrid, GetRandom())) { const EDungeonRoomProps props = static_cast(cp.mGrid.GetProps()); - if (cp.mGrid.CanBuildGate(mGenerator->GetVoxel()->Get(cp.mGridLocation.X, cp.mGridLocation.Y - 1, cp.mGridLocation.Z), dungeon::Direction::North, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildGate(mGenerator->GetGrid(cp.mGridLocation.X, cp.mGridLocation.Y - 1, cp.mGridLocation.Z), dungeon::Direction::North, mParameter->IsMergeRooms())) { // 北側の扉 FVector doorPosition = cp.mPosition; doorPosition.X += mParameter->GetGridSize().HorizontalSize * 0.5f; SpawnDoorActor(parts->ActorClass, parts->CalculateWorldTransform(doorPosition, 0.f), dungeonRoomSensorBase, props); } - if (cp.mGrid.CanBuildGate(mGenerator->GetVoxel()->Get(cp.mGridLocation.X, cp.mGridLocation.Y + 1, cp.mGridLocation.Z), dungeon::Direction::South, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildGate(mGenerator->GetGrid(cp.mGridLocation.X, cp.mGridLocation.Y + 1, cp.mGridLocation.Z), dungeon::Direction::South, mParameter->IsMergeRooms())) { // 南側の扉 FVector doorPosition = cp.mPosition; @@ -1061,7 +1097,7 @@ void ADungeonGenerateBase::CreateImplement_AddDoor(const CreateImplementParamete doorPosition.Y += mParameter->GetGridSize().HorizontalSize; SpawnDoorActor(parts->ActorClass, parts->CalculateWorldTransform(doorPosition, 180.f), dungeonRoomSensorBase, props); } - if (cp.mGrid.CanBuildGate(mGenerator->GetVoxel()->Get(cp.mGridLocation.X + 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::East, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildGate(mGenerator->GetGrid(cp.mGridLocation.X + 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::East, mParameter->IsMergeRooms())) { // 東側の扉 FVector doorPosition = cp.mPosition; @@ -1069,7 +1105,7 @@ void ADungeonGenerateBase::CreateImplement_AddDoor(const CreateImplementParamete doorPosition.Y += mParameter->GetGridSize().HorizontalSize * 0.5f; SpawnDoorActor(parts->ActorClass, parts->CalculateWorldTransform(doorPosition, 90.f), dungeonRoomSensorBase, props); } - if (cp.mGrid.CanBuildGate(mGenerator->GetVoxel()->Get(cp.mGridLocation.X - 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::West, mParameter->IsMergeRooms())) + if (cp.mGrid.CanBuildGate(mGenerator->GetGrid(cp.mGridLocation.X - 1, cp.mGridLocation.Y, cp.mGridLocation.Z), dungeon::Direction::West, mParameter->IsMergeRooms())) { // 西側の扉 FVector doorPosition = cp.mPosition; @@ -1103,21 +1139,21 @@ bool ADungeonGenerateBase::CanAddDoor(const ADungeonRoomSensorBase* dungeonRoomS if (grid.GetDirection().IsNorthSouth()) { const FIntVector e(location.X + 1, location.Y, location.Z); - if (mGenerator->GetVoxel()->Get(e).Is(dungeon::Grid::Type::Gate)) + if (mGenerator->GetGrid(e).Is(dungeon::Grid::Type::Gate)) return false; const FIntVector w(location.X - 1, location.Y, location.Z); - if (mGenerator->GetVoxel()->Get(w).Is(dungeon::Grid::Type::Gate)) + if (mGenerator->GetGrid(w).Is(dungeon::Grid::Type::Gate)) return false; } else { const FIntVector n(location.X, location.Y - 1, location.Z); - if (mGenerator->GetVoxel()->Get(n).Is(dungeon::Grid::Type::Gate)) + if (mGenerator->GetGrid(n).Is(dungeon::Grid::Type::Gate)) return false; const FIntVector s(location.X, location.Y + 1, location.Z); - if (mGenerator->GetVoxel()->Get(s).Is(dungeon::Grid::Type::Gate)) + if (mGenerator->GetGrid(s).Is(dungeon::Grid::Type::Gate)) return false; } @@ -1187,10 +1223,10 @@ void ADungeonGenerateBase::CreateImplement_AddPillarAndTorch(const CreateImpleme // 燭台の正面を求める for (const auto& wallChecker : WallCheckers) { - const auto& fromGrid = mGenerator->GetVoxel()->Get(checkLocation); + const auto& fromGrid = mGenerator->GetGrid(checkLocation); const FIntVector& direction = dungeon::Direction::GetVector(wallChecker.mDirection); checkLocation += direction; - const auto& toGrid = mGenerator->GetVoxel()->Get(checkLocation); + const auto& toGrid = mGenerator->GetGrid(checkLocation); // 床が無いグリッドか? if (fromGrid.IsKindOfSpatialType() || fromGrid.Is(dungeon::Grid::Type::Floor) || fromGrid.Is(dungeon::Grid::Type::DownSpace)) diff --git a/Source/DungeonGenerator/Private/MainLevel/DungeonMainLevelScriptActor.cpp b/Source/DungeonGenerator/Private/MainLevel/DungeonMainLevelScriptActor.cpp index 6abf46f..a75f2a4 100644 --- a/Source/DungeonGenerator/Private/MainLevel/DungeonMainLevelScriptActor.cpp +++ b/Source/DungeonGenerator/Private/MainLevel/DungeonMainLevelScriptActor.cpp @@ -9,6 +9,7 @@ All Rights Reserved. #include "MainLevel/DungeonPartition.h" #include "DungeonGenerateActor.h" #include "Core/Debug/Debug.h" +#include #include #include #include diff --git a/Source/DungeonGenerator/Private/Parameter/DungeonMeshParts.cpp b/Source/DungeonGenerator/Private/Parameter/DungeonMeshParts.cpp index d6be474..5eb4a2e 100644 --- a/Source/DungeonGenerator/Private/Parameter/DungeonMeshParts.cpp +++ b/Source/DungeonGenerator/Private/Parameter/DungeonMeshParts.cpp @@ -10,6 +10,8 @@ All Rights Reserved. #include "Helper/DungeonDebugUtility.h" #endif +#include + #if WITH_EDITOR FString FDungeonMeshParts::DumpToJson(const uint32 indent) const { diff --git a/Source/DungeonGenerator/Public/DungeonGenerateBase.h b/Source/DungeonGenerator/Public/DungeonGenerateBase.h index a4ca3bf..3357273 100644 --- a/Source/DungeonGenerator/Public/DungeonGenerateBase.h +++ b/Source/DungeonGenerator/Public/DungeonGenerateBase.h @@ -305,6 +305,7 @@ class DUNGEONGENERATOR_API ADungeonGenerateBase : public AActor void CreateImplement_AddTerrain(RoomAndRoomSensorMap& roomSensorCache, const bool hasAuthority); void CreateImplement_AddFloorAndSlope(const CreateImplementParameter& cp) const; void CreateImplement_ReserveWall(const CreateImplementParameter& cp); + void CreateImplement_ReserveVegetationGenerationAisleBounds(const CreateImplementParameter& cp) const; void CreateImplement_AddWall(); void CreateImplement_AddRoof(const CreateImplementParameter& cp) const; void CreateImplement_AddDoor(const CreateImplementParameter& cp, ADungeonRoomSensorBase* dungeonRoomSensorBase, const bool hasAuthority) const; diff --git a/Source/DungeonGenerator/Public/Helper/DungeonLevelStreamingActor.h b/Source/DungeonGenerator/Public/Helper/DungeonLevelStreamingActor.h index d971eaf..95e8a77 100644 --- a/Source/DungeonGenerator/Public/Helper/DungeonLevelStreamingActor.h +++ b/Source/DungeonGenerator/Public/Helper/DungeonLevelStreamingActor.h @@ -48,6 +48,6 @@ class DUNGEONGENERATOR_API ADungeonLevelStreamingActor : public AActor /** * Level streaming path */ - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DungeonGenerator", meta = (AllowedClasses = "World")) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DungeonGenerator", meta = (AllowedClasses = "/Script/Engine.World")) FSoftObjectPath Path; }; diff --git a/Source/DungeonGenerator/Public/Parameter/DungeonActorParts.h b/Source/DungeonGenerator/Public/Parameter/DungeonActorParts.h index 5cc3b4a..f13a97c 100644 --- a/Source/DungeonGenerator/Public/Parameter/DungeonActorParts.h +++ b/Source/DungeonGenerator/Public/Parameter/DungeonActorParts.h @@ -28,6 +28,6 @@ struct DUNGEONGENERATOR_API FDungeonActorParts : public FDungeonPartsTransform Class of actor to spawn スポーンするアクターのクラス */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DungeonGenerator", meta = (AllowedClasses = "Actor")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DungeonGenerator", meta = (AllowedClasses = "/Script/Engine.Actor")) TObjectPtr ActorClass = nullptr; }; \ No newline at end of file diff --git a/Source/DungeonGenerator/Public/Parameter/DungeonDoorActorParts.h b/Source/DungeonGenerator/Public/Parameter/DungeonDoorActorParts.h index 56701ca..48b1976 100644 --- a/Source/DungeonGenerator/Public/Parameter/DungeonDoorActorParts.h +++ b/Source/DungeonGenerator/Public/Parameter/DungeonDoorActorParts.h @@ -28,6 +28,6 @@ struct DUNGEONGENERATOR_API FDungeonDoorActorParts : public FDungeonPartsTransfo Class of actor to spawn スポーンするアクターのクラス */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DungeonGenerator", meta = (AllowedClasses = "DungeonDoorBase")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DungeonGenerator", meta = (AllowedClasses = "/Script/DungeonGenerator.DungeonDoorBase")) TObjectPtr ActorClass = nullptr; }; diff --git a/Source/DungeonGenerator/Public/Parameter/DungeonGenerateParameter.h b/Source/DungeonGenerator/Public/Parameter/DungeonGenerateParameter.h index 2d2f757..04b294c 100644 --- a/Source/DungeonGenerator/Public/Parameter/DungeonGenerateParameter.h +++ b/Source/DungeonGenerator/Public/Parameter/DungeonGenerateParameter.h @@ -502,7 +502,7 @@ class DUNGEONGENERATOR_API UDungeonGenerateParameter : public UObject * DungeonRoomSensorBaseは部屋を覆う箱センサーで、ドアや敵のスポーンを制御します。 * DungeonRoomSensorDatabaseが優先されます */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|RoomSensor", BlueprintReadWrite, meta = (AllowedClasses = "DungeonRoomSensorBase", DeprecatedProperty, ToolTip = "This variable is deprecated. Please use DungeonRoomSensorDatabase instead.")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|RoomSensor", BlueprintReadWrite, meta = (AllowedClasses = "/Script/DungeonGenerator.DungeonRoomSensorBase", DeprecatedProperty, ToolTip = "This variable is deprecated. Please use DungeonRoomSensorDatabase instead.")) TObjectPtr DungeonRoomSensorClass; /** diff --git a/Source/DungeonGenerator/Public/SubActor/DungeonActorSpawnDirector.h b/Source/DungeonGenerator/Public/SubActor/DungeonActorSpawnDirector.h index 04480f9..170d361 100644 --- a/Source/DungeonGenerator/Public/SubActor/DungeonActorSpawnDirector.h +++ b/Source/DungeonGenerator/Public/SubActor/DungeonActorSpawnDirector.h @@ -30,7 +30,7 @@ struct FDungeonSpawnActorParameter { GENERATED_BODY() - UPROPERTY(EditAnywhere, Category = "DungeonGenerator", meta = (AllowedClasses = "Actor")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator", meta = (AllowedClasses = "/Script/Engine.Actor")) TObjectPtr ActorClass = nullptr; UPROPERTY(EditAnywhere, Category = "DungeonGenerator", meta = (ClampMin = "1")) diff --git a/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorBase.h b/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorBase.h index b88ab8f..2806341 100644 --- a/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorBase.h +++ b/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorBase.h @@ -482,7 +482,7 @@ class DUNGEONGENERATOR_API ADungeonRoomSensorBase : public ADungeonVerifiableAct * 部屋にスポーンするアクター * 細やかな制御をおこなう場合はOnNativeInitializeやOnInitializeでアクターを個別にスポーンして下さい */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|SpawnActorInRoom", meta = (AllowedClasses = "Blueprint")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|SpawnActorInRoom", meta = (AllowedClasses = "/Script/Engine.Blueprint")) TArray SpawnActors; /** @@ -494,7 +494,7 @@ class DUNGEONGENERATOR_API ADungeonRoomSensorBase : public ADungeonVerifiableAct * 指定した場合は部屋のランダムな位置にスポーンします。 * 宝箱や敵を倒した時に鍵を入手させたい場合は独自に実装して下さい。 */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|MissionGraph", meta = (AllowedClasses = "Blueprint")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|MissionGraph", meta = (AllowedClasses = "/Script/Engine.Blueprint")) FSoftObjectPath SpawnKeyActor; /** @@ -506,7 +506,7 @@ class DUNGEONGENERATOR_API ADungeonRoomSensorBase : public ADungeonVerifiableAct * 指定した場合は部屋のランダムな位置にスポーンします。 * 宝箱や敵を倒した時に鍵を入手させたい場合は独自に実装して下さい。 */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|MissionGraph", meta = (AllowedClasses = "Blueprint")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Helper|MissionGraph", meta = (AllowedClasses = "/Script/Engine.Blueprint")) FSoftObjectPath SpawnUniqueKeyActor; private: diff --git a/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorDatabase.h b/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorDatabase.h index 3554030..ddb218c 100644 --- a/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorDatabase.h +++ b/Source/DungeonGenerator/Public/SubActor/DungeonRoomSensorDatabase.h @@ -76,7 +76,7 @@ class DUNGEONGENERATOR_API UDungeonRoomSensorDatabase : public UObject * * 配置するRoomSensorを登録して下さい。 */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|RoomSensor", meta = (AllowedClasses = "DungeonRoomSensorBase")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|RoomSensor", meta = (AllowedClasses = "/Script/DungeonGenerator.DungeonRoomSensorBase")) TArray> DungeonRoomSensorClass; /** @@ -84,6 +84,6 @@ class DUNGEONGENERATOR_API UDungeonRoomSensorDatabase : public UObject * * 通路にスポーンするアクター */ - UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Aisle", meta = (AllowedClasses = "Blueprint")) + UPROPERTY(EditAnywhere, Category = "DungeonGenerator|Aisle", meta = (AllowedClasses = "/Script/Engine.Blueprint")) TArray SpawnActorInAisle; }; diff --git a/Source/DungeonGeneratorEditor/Private/DungeonGeneratorEditorModule.cpp b/Source/DungeonGeneratorEditor/Private/DungeonGeneratorEditorModule.cpp index fa465b1..c11c9e4 100644 --- a/Source/DungeonGeneratorEditor/Private/DungeonGeneratorEditorModule.cpp +++ b/Source/DungeonGeneratorEditor/Private/DungeonGeneratorEditorModule.cpp @@ -23,6 +23,7 @@ All Rights Reserved. #include #include #include +#include #include #include #include diff --git a/Source/DungeonGeneratorEditor/Public/DungeonGeneratorEditorModule.h b/Source/DungeonGeneratorEditor/Public/DungeonGeneratorEditorModule.h index b0eadf5..afd888b 100644 --- a/Source/DungeonGeneratorEditor/Public/DungeonGeneratorEditorModule.h +++ b/Source/DungeonGeneratorEditor/Public/DungeonGeneratorEditorModule.h @@ -5,14 +5,22 @@ All Rights Reserved. */ #pragma once +#include