Compare commits

...

21 Commits

Author SHA1 Message Date
a39e01cefa 更新文档 合并背包分支 2025-09-01 14:26:26 +08:00
bd3961c614 修改背包UI 2025-09-01 11:54:05 +08:00
cd4bf0109d 更新敌人和玩家的背包大小设置 2025-09-01 10:32:03 +08:00
8c6d5cceac 添加背包配置文档 2025-09-01 10:20:49 +08:00
39c95a5ed5 添加技能资源的菜单创建 2025-08-31 17:10:54 +08:00
f99367951a 添加背包配置资源的缩略图表 2025-08-31 16:10:56 +08:00
a66065abae 完善背包配置UI 2025-08-31 15:59:08 +08:00
19ca9f7212 完善背包配置中的背包预览UI 2025-08-31 15:49:07 +08:00
1aeaa662a9 添加背包配置中的背包预览UI 2025-08-31 15:36:48 +08:00
faddbbe338 完善背包配置窗口UI 2025-08-31 15:14:48 +08:00
b01db99502 添加背包配置编辑器 2025-08-31 14:51:48 +08:00
5713ef088b 添加背包配置资源列表项 2025-08-31 14:41:41 +08:00
2a4643b85b 添加背包配置资源类 2025-08-31 10:43:05 +08:00
9171347f2e 添加背包形状资源图标 2025-08-30 19:55:46 +08:00
bd75d739f1 添加背包形状编辑器UI 2025-08-30 18:03:42 +08:00
445f21fe7b 完善BagShape Editor 2025-08-30 13:43:09 +08:00
bc36d855ac 调整菜单创建bagshape 2025-08-29 18:09:13 +08:00
c8a551888d 添加右键菜单创建BoxShape 资源 2025-08-29 17:38:44 +08:00
8492dd5448 添加bagshape 资源 2025-08-29 16:26:42 +08:00
841f21a27d 添加背包形状类 2025-08-29 15:12:38 +08:00
3ef6fb21b7 添加背包系统插件 2025-08-29 09:59:42 +08:00
130 changed files with 6251 additions and 78 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACoreUObject_002Fd_003APublic_002Fd_003AAssetRegistry_002Ff_003AAssetData_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003AEditor_002Fd_003APropertyEditor_002Fd_003APublic_002Ff_003APropertyCustomizationHelpers_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACoreUObject_002Fd_003APublic_002Fd_003AUObject_002Ff_003AUObjectBaseUtility_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACore_002Fd_003APublic_002Fd_003AMisc_002Ff_003AMTAccessDetector_002Eh/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@ -0,0 +1,116 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "BagConfigAsset.h"
#include "BagShapeAsset.h"
bool UBagConfigAsset::AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY)
{
if (!SkillObject || !CanPlaceSkill(SkillObject, PositionX, PositionY))
{
return false;
}
PlacedSkills.Add(FPlacedSkillInfo(SkillObject, PositionX, PositionY));
return true;
}
bool UBagConfigAsset::RemoveSkill(int32 SkillIndex)
{
if (SkillIndex < 0 || SkillIndex >= PlacedSkills.Num())
{
return false;
}
PlacedSkills.RemoveAt(SkillIndex);
return true;
}
bool UBagConfigAsset::CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!SkillObject || !BagShapeAsset)
{
return false;
}
if (!IsSkillWithinBagShape(SkillObject, PositionX, PositionY))
{
return false;
}
if (CheckSkillOverlap(SkillObject, PositionX, PositionY))
{
return false;
}
return true;
}
int32 UBagConfigAsset::GetSkillAtPosition(int32 X, int32 Y) const
{
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
if (PlacedSkills[i].OccupiesPosition(X, Y))
{
return i;
}
}
return -1;
}
void UBagConfigAsset::ClearAllSkills()
{
PlacedSkills.Empty();
}
bool UBagConfigAsset::CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!SkillObject)
{
return false;
}
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
const FPlacedSkillInfo& ExistingSkill = PlacedSkills[i];
if (!ExistingSkill.SkillAsset)
{
continue;
}
// 检查矩形重叠
if (!(PositionX >= ExistingSkill.PositionX + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).X ||
PositionX + GetSkillSizeValue(SkillObject->SkillSize).X <= ExistingSkill.PositionX ||
PositionY >= ExistingSkill.PositionY + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).Y ||
PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y <= ExistingSkill.PositionY))
{
return true; // 有重叠
}
}
return false; // 无重叠
}
bool UBagConfigAsset::IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!BagShapeAsset || !SkillObject)
{
return false;
}
// 检查技能占用的所有格子是否都在激活的背包形状内
for (int32 X = PositionX; X < PositionX + GetSkillSizeValue(SkillObject->SkillSize).X; X++)
{
for (int32 Y = PositionY; Y < PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y; Y++)
{
if (!BagShapeAsset->IsSlotActive(X, Y))
{
return false;
}
}
}
return true;
}

View File

@ -0,0 +1,102 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ProjectFish/Definations.h"
#include "SkillAsset.h"
#include "BagConfigAsset.generated.h"
class UBagShapeAsset;
//背包中摆放的技能信息
USTRUCT(BlueprintType)
struct FPlacedSkillInfo
{
GENERATED_BODY()
// 技能对象引用
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill")
TObjectPtr< USkillAsset> SkillAsset;
// 技能在背包中的位置X
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
int32 PositionX;
// 技能在背包中的位置Y
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
int32 PositionY;
FPlacedSkillInfo()
{
SkillAsset = nullptr;
PositionX = 0;
PositionY = 0;
}
FPlacedSkillInfo(USkillAsset* InSkillAsset, int32 InX, int32 InY)
{
SkillAsset = InSkillAsset;
PositionX = InX;
PositionY = InY;
}
// 检查技能是否占用指定位置
bool OccupiesPosition(int32 X, int32 Y) const
{
if (!SkillAsset)
{
return false;
}
return X >= PositionX && X < (PositionX + GetSkillSizeValue(SkillAsset->SkillSize).X) &&
Y >= PositionY && Y < (PositionY + GetSkillSizeValue(SkillAsset->SkillSize).Y);
}
};
/**
*
*/
UCLASS(BlueprintType)
class PROJECTFISH_API UBagConfigAsset : public UDataAsset
{
GENERATED_BODY()
public:
// 背包形状资源引用
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BagConfig")
TObjectPtr<UBagShapeAsset> BagShapeAsset;
// 背包中放置的技能列表
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagConfig")
TArray<FPlacedSkillInfo> PlacedSkills;
// 添加技能到背包
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY);
// 移除技能
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool RemoveSkill(int32 SkillIndex);
// 检查技能是否可以放置在指定位置
UFUNCTION(BlueprintCallable, Category = "BagConfig")
bool CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
// 获取指定位置的技能索引
UFUNCTION(BlueprintCallable, Category = "BagConfig")
int32 GetSkillAtPosition(int32 X, int32 Y) const;
// 获取技能总数
UFUNCTION(BlueprintCallable, Category = "BagConfig")
int32 GetSkillCount() const { return PlacedSkills.Num(); }
// 清除所有技能
UFUNCTION(BlueprintCallable, Category = "BagConfig")
void ClearAllSkills();
private:
// 检查技能之间是否有重叠
bool CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
// 检查技能是否在背包形状范围内
bool IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
};

View File

@ -0,0 +1,56 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "BagShapeAsset.h"
UBagShapeAsset::UBagShapeAsset()
{
InitializeBagShape();
}
void UBagShapeAsset::InitializeBagShape()
{
BagSlots.Empty();
for (int x = 0; x < BagWidth; x++)
{
for (int y = 0; y < BagHeight; y++)
{
BagSlots.Add(FBagSlot(x, y, true));
}
}
}
bool UBagShapeAsset::IsSlotActive(int32 X, int32 Y) const
{
if (X < 0 || X >= BagWidth || Y < 0 || Y >= BagHeight)
return false;
for (auto BagSlot: BagSlots)
{
if (BagSlot.X == X && BagSlot.Y == Y)
return BagSlot.bIsActive;
}
return false;
}
void UBagShapeAsset::SetSlotActive(int32 X, int32 Y, bool Active)
{
if (X < 0 || X >= BagWidth || Y < 0 || Y >= BagHeight)
return;
int SlotIndex = FIndSlotIndex(X, Y);
if (SlotIndex != INDEX_NONE)
{
BagSlots[SlotIndex].bIsActive = Active;
}
}
int32 UBagShapeAsset::FIndSlotIndex(int32 X, int32 Y) const
{
for (int i = 0; i < BagSlots.Num(); i++)
{
if (BagSlots[i].X == X && BagSlots[i].Y == Y)
return i;
}
return INDEX_NONE;
}

View File

@ -0,0 +1,63 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "BagShapeAsset.generated.h"
USTRUCT(BlueprintType)
struct FBagSlot
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 X;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Y;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool bIsActive;
FBagSlot()
{
X = 0;
Y = 0;
bIsActive = false;
}
FBagSlot(int32 InX, int32 InY, bool InIsActive)
{
X = InX;
Y = InY;
bIsActive = InIsActive;
}
};
/**
*
*/
UCLASS(BlueprintType)
class PROJECTFISH_API UBagShapeAsset : public UDataAsset
{
GENERATED_BODY()
public:
UBagShapeAsset();
UFUNCTION(BlueprintCallable, Category="BagShape")
void InitializeBagShape();
UFUNCTION(Blueprintable, BlueprintPure, Category="BagShape")
bool IsSlotActive(int32 X, int32 Y) const;
UFUNCTION(Blueprintable, Category="BagShape")
void SetSlotActive(int32 X, int32 Y, bool Active);
private:
int32 FIndSlotIndex(int32 X, int32 Y) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagShape", meta = (ClampMin = "1", ClampMax = "10"))
int32 BagWidth;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagShape", meta = (ClampMin = "1", ClampMax = "10"))
int32 BagHeight;
//存储格子状态
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="BagShape")
TArray<FBagSlot> BagSlots;
};

View File

@ -0,0 +1,4 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SkillAsset.h"

View File

@ -0,0 +1,53 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Engine/DataAsset.h"
#include "../Definations.h"
#include "SkillAsset.generated.h"
/**
*
*/
UCLASS(BlueprintType)
class PROJECTFISH_API USkillAsset : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能名称"))
FText SkillName;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (AllowedClasses = "Texture2D", ToolTip = "技能图片"))
FSoftObjectPath SkillTexture;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能Tag"))
FGameplayTag SkillTag;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "背包占用"))
ESkillSize SkillSize = ESkillSize::Small;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "是否为主动技能"))
bool bActiveSkill = true;
//主动技能属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD", EditConditionHides, EditCondition = "bActiveSkill"))
float CD;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度", EditConditionHides, EditCondition = "bActiveSkill"))
float Speed = 1.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能耐久度", EditConditionHides, EditCondition = "bActiveSkill"))
int32 Endurance;
//被动技能属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger", EditConditionHides, EditCondition = "!bActiveSkill"))
TSubclassOf<class USkillTrigger> SkillTrigger;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组"))
TArray<FSkillEffectData> SkillEffects;
};

View File

@ -51,6 +51,25 @@ enum class ETargetSelecterType: uint8
RandomScope UMETA(DisplayName = "指定技能组选择"), RandomScope UMETA(DisplayName = "指定技能组选择"),
}; };
UENUM(BlueprintType)
enum class ESkillSize: uint8
{
Small UMETA(DisplayName = "", ToolTip = "技能占用格子 2x2"),
Medium UMETA(DisplayName = "", ToolTip = "技能占用格子 3x2"),
Large UMETA(DisplayName = "", ToolTip = "技能占用格子 4x2"),
};
static FIntPoint GetSkillSizeValue(ESkillSize SizeType)
{
switch (SizeType)
{
case ESkillSize::Small: return FIntPoint(2, 2);
case ESkillSize::Medium: return FIntPoint(3, 2);
case ESkillSize::Large: return FIntPoint(4, 2);
}
return FIntPoint();
}
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FSkillContext struct FSkillContext
{ {
@ -200,9 +219,10 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "附加的附加的韧性值")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "附加的附加的韧性值"))
int32 Tenacity_Add; int32 Tenacity_Add;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "物品背包大小")) // UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "物品背包大小"))
FIntPoint BagSize; // FIntPoint BagSize;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "物品配置"))
class UBagConfigAsset* BagConfig;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组"))
TArray<FFishingRodSkill> Skills; TArray<FFishingRodSkill> Skills;
@ -281,3 +301,5 @@ struct FShipDataConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera|Collision", meta = (ForceUnits = "cm", ToolTip = "碰撞时的相机抖动类型")) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera|Collision", meta = (ForceUnits = "cm", ToolTip = "碰撞时的相机抖动类型"))
TSubclassOf<UCameraShakeBase> CollisionCameraShakeClass; TSubclassOf<UCameraShakeBase> CollisionCameraShakeClass;
}; };

View File

@ -14,15 +14,68 @@
#include "SkillEffects/SkillEffect_ModifySpeed.h" #include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.h" #include "SkillEffects/SkillEffect_SER.h"
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos) // void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
// {
// this->Owner = owner;
// this->SkillManager = skillManager;
// this->SkillData = skillData;
// this->BagPosition = BagPos;
// this->RemainingTime = SkillData->CD;
// this->RemainingEndurance = SkillData->Endurance;
// for (auto effectData: SkillData->SkillEffects)
// {
// USkillEffect* skillEffect = nullptr ;
// switch (effectData.EffectType)
// {
// case ESkillEffectType::Damage:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Damage::StaticClass());
// break;
// case ESkillEffectType::Heal:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Heal::StaticClass());
// break;
// case ESkillEffectType::ModifyCooldown:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifyCD::StaticClass());
// break;
// case ESkillEffectType::Charge:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Charge::StaticClass());
// break;
// case ESkillEffectType::ModifySpeed:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifySpeed::StaticClass());
// break;
// case ESkillEffectType::SkillEnduranceRestore:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_SER::StaticClass());
// break;
// case ESkillEffectType::EnhanceFishRod:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
// break;
// case ESkillEffectType::EnhanceSkill:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
// break;
// case ESkillEffectType::DamageReduce:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
// break;
// default:
// const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
// UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
// }
// if (IsValid(skillEffect))
// {
// skillEffect->InitSkillEffect(this, effectData);
// this->SkillEffects.Add(skillEffect);
// }
//
// }
// }
void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
{ {
this->Owner = owner; this->Owner = owner;
this->SkillManager = skillManager; this->SkillManager = skillManager;
this->SkillData = skillData; this->SkillData = PlacedSkill.SkillAsset;
this->BagPosition = BagPos; this->BagPosition = FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY);
this->RemainingTime = SkillData.CD; this->RemainingTime = SkillData->CD;
this->RemainingEndurance = SkillData.Endurance; this->RemainingEndurance = SkillData->Endurance;
for (auto effectData: skillData.SkillEffects) for (auto effectData: SkillData->SkillEffects)
{ {
USkillEffect* skillEffect = nullptr ; USkillEffect* skillEffect = nullptr ;
switch (effectData.EffectType) switch (effectData.EffectType)
@ -55,8 +108,8 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass()); skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
break; break;
default: default:
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>(); const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType))) UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
} }
if (IsValid(skillEffect)) if (IsValid(skillEffect))
{ {
@ -69,11 +122,11 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
void USkill::InitSkillTrigger() void USkill::InitSkillTrigger()
{ {
if (!SkillData.bActiveSkill) if (!SkillData->bActiveSkill)
{ {
if (SkillData.SkillTrigger) if (SkillData->SkillTrigger)
{ {
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData.SkillTrigger); USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData->SkillTrigger);
FSkillContext context; FSkillContext context;
context.OwnerSkill = this; context.OwnerSkill = this;
context.SkillManager = SkillManager; context.SkillManager = SkillManager;
@ -91,13 +144,18 @@ void USkill::InitSkillTrigger()
bool USkill::SkillTickAble() bool USkill::SkillTickAble()
{ {
//剩余次数无限制或者拥有者没有被韧性眩晕 //剩余次数无限制或者拥有者没有被韧性眩晕
return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData.bActiveSkill; return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData->bActiveSkill;
}
FIntPoint USkill::GetSkillSize()
{
return GetSkillSizeValue(SkillData->SkillSize);
} }
void USkill::TickSkill(float deltaTime) void USkill::TickSkill(float deltaTime)
{ {
if (SkillTickAble()) if (SkillTickAble())
RemainingTime -= deltaTime * SkillData.Speed; RemainingTime -= deltaTime * SkillData->Speed;
if (RemainingTime <= 0 ) if (RemainingTime <= 0 )
{ {
ExecuteSkill(); ExecuteSkill();
@ -126,16 +184,16 @@ void USkill::ExecuteSkill()
{ {
Effect->Execute(context); Effect->Execute(context);
} }
RemainingTime = SkillData.CD; RemainingTime = SkillData->CD;
OnSkillExecute.Broadcast(SkillData.SkillName.ToString()); OnSkillExecute.Broadcast(SkillData->SkillName.ToString());
} }
FString USkill::GetSkillName() const FString USkill::GetSkillName() const
{ {
return SkillData.SkillName.ToString();; return SkillData->SkillName.ToString();;
} }
FSkillData& USkill::GetSkillData() TObjectPtr<USkillAsset> USkill::GetSkillData()
{ {
return SkillData; return SkillData;
} }
@ -145,7 +203,7 @@ FIntPoint USkill::GetBagPos()
return BagPosition; return BagPosition;
} }
void USkill::SetSkillData(FSkillData data) void USkill::SetSkillData(TObjectPtr<USkillAsset> data)
{ {
SkillData = data; SkillData = data;
OnSkillUpdate.Broadcast(); OnSkillUpdate.Broadcast();
@ -158,8 +216,8 @@ void USkill::ApplyRemainingTimeOffset(int timeOffset)
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset) void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
{ {
if (SkillData.Endurance != -1) if (SkillData->Endurance != -1)
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData.Endurance); this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData->Endurance);
} }
class APawnWithSkill* USkill::GetOwner() class APawnWithSkill* USkill::GetOwner()

View File

@ -6,6 +6,7 @@
#include "SkillEffect.h" #include "SkillEffect.h"
#include "ProjectFish/Definations.h" #include "ProjectFish/Definations.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
#include "UObject/Object.h" #include "UObject/Object.h"
#include "Skill.generated.h" #include "Skill.generated.h"
@ -19,7 +20,8 @@ class PROJECTFISH_API USkill : public UObject
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos); //void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos);
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill);
void InitSkillTrigger(); void InitSkillTrigger();
void TickSkill(float deltaTime); void TickSkill(float deltaTime);
void ExecuteSkill(); void ExecuteSkill();
@ -27,20 +29,23 @@ public:
FString GetSkillName() const; FString GetSkillName() const;
class APawnWithSkill* GetOwner(); class APawnWithSkill* GetOwner();
FSkillData& GetSkillData(); TObjectPtr<USkillAsset> GetSkillData();
TArray<USkillEffect*> GetAllSkillEffects() TArray<USkillEffect*> GetAllSkillEffects()
{ {
return SkillEffects; return SkillEffects;
} }
FIntPoint GetBagPos(); FIntPoint GetBagPos();
void SetSkillData( FSkillData SkillData); void SetSkillData( TObjectPtr<USkillAsset> SkillData);
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void ApplyRemainingTimeOffset(int timeOffset); void ApplyRemainingTimeOffset(int timeOffset);
void ApplyRemainingRemainingEnduranceOffset(int Offset); void ApplyRemainingRemainingEnduranceOffset(int Offset);
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)
bool SkillTickAble(); bool SkillTickAble();
UFUNCTION(BlueprintPure)
FIntPoint GetSkillSize();
protected: protected:
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FSkillUpdate OnSkillUpdate; FSkillUpdate OnSkillUpdate;
@ -48,7 +53,7 @@ protected:
FSkillExecute OnSkillExecute; FSkillExecute OnSkillExecute;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果")) UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))
FSkillData SkillData; TObjectPtr< USkillAsset> SkillData;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果")) UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))
USkillManager* SkillManager; USkillManager* SkillManager;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果")) UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))

View File

@ -27,7 +27,7 @@ void USkillEffect::Execute(const FSkillContext& context)
} }
else else
{ {
strTargets += (Cast<USkill>(target))->GetSkillData().SkillName.ToString() + "|" ; strTargets += (Cast<USkill>(target))->GetSkillData()->SkillName.ToString() + "|" ;
} }
} }
@ -35,7 +35,7 @@ void USkillEffect::Execute(const FSkillContext& context)
FString type = EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)) ; FString type = EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)) ;
UE_LOG(LogTemp, Warning, TEXT("技能:%s 拥有者: %s 目标: %s 效果: %s") UE_LOG(LogTemp, Warning, TEXT("技能:%s 拥有者: %s 目标: %s 效果: %s")
, *OwnerSkill->GetSkillData().SkillName.ToString() , *OwnerSkill->GetSkillData()->SkillName.ToString()
,*OwnerSkill->GetOwner()->GetActorNameOrLabel() ,*OwnerSkill->GetOwner()->GetActorNameOrLabel()
,*strTargets ,*strTargets
, *( GetSkillEffectDes())); , *( GetSkillEffectDes()));
@ -62,7 +62,7 @@ TArray<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
for (auto skill: context.SkillManager->GetAllSkills()) for (auto skill: context.SkillManager->GetAllSkills())
{ {
if (effectData.SkillSelecter.ApplySkillTags.HasTag(skill->GetSkillData().SkillTag)) if (effectData.SkillSelecter.ApplySkillTags.HasTag(skill->GetSkillData()->SkillTag))
{ {
result.Add(skill); result.Add(skill);
} }

View File

@ -21,7 +21,7 @@ void USkillEffect_ModifyCD::Execute(const FSkillContext& context)
{ {
//修改技能的冷却时间 //修改技能的冷却时间
USkill* skill = Cast<USkill>(target); USkill* skill = Cast<USkill>(target);
skill->GetSkillData().CD = FMath::Max(1, skill->GetSkillData().CD + effectData.EffectValue); skill->GetSkillData()->CD = FMath::Max(1, skill->GetSkillData()->CD + effectData.EffectValue);
skill->ApplyRemainingTimeOffset(effectData.EffectValue); skill->ApplyRemainingTimeOffset(effectData.EffectValue);
} }

View File

@ -22,13 +22,13 @@ void USkillEffect_ModifySpeed::Execute(const FSkillContext& context)
{ {
//修改技能的冷却倍率 //修改技能的冷却倍率
USkill* skill = Cast<USkill>(target); USkill* skill = Cast<USkill>(target);
skill->GetSkillData().Speed = effectData.EffectValue; skill->GetSkillData()->Speed = effectData.EffectValue;
//延时结束效果 //延时结束效果
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [&]() GetWorld()->GetTimerManager().SetTimer(TimerHandle, [&]()
{ {
UE_LOG(LogTemp, Log, TEXT("取消CD充能效果")); UE_LOG(LogTemp, Log, TEXT("取消CD充能效果"));
skill->GetSkillData().Speed = 1; skill->GetSkillData()->Speed = 1;
}, UKismetStringLibrary::Conv_StringToInt(effectData.ParamAddition), false); // 单次触发 }, UKismetStringLibrary::Conv_StringToInt(effectData.ParamAddition), false); // 单次触发

View File

@ -3,6 +3,7 @@
#include "SkillManager.h" #include "SkillManager.h"
#include "Skill.h" #include "Skill.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
void USkillManager::Tick(float DeltaTime) void USkillManager::Tick(float DeltaTime)
{ {
@ -42,49 +43,64 @@ void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize)
// this->SkillPawns = Pawns; // this->SkillPawns = Pawns;
// } // }
USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos) // USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos)
// {
// TMap<FIntPoint, int32>* states = PawnBagState.Find(Pawn);
// FIntPoint BagSize = *PawnInfo.Find(Pawn);
// bool bAddAble = true;
// for (int y = 0; y < BagSize.Y; y++)
// {
// for (int x = 0; x < BagSize.X; x++)
// {
// bAddAble = true;
// for (int skillX = 0; skillX < data.SkillWeight.X; skillX++)
// {
// for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
// {
// if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
// || *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1)
// {
// bAddAble = false;
// }
// }
// }
// //满足条件
// if (bAddAble)
// {
// BagPos = FIntPoint(x, y);
// USkill* skill = NewObject<USkill>(this);
// skill->InitSkill(Pawn, this, data, BagPos);
// Skills.Add(skill);
// //设置占用状态
// for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
// {
// for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
// {
// states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill));
// }
// }
//
// return skill;
// }
// }
// }
//
// return nullptr;
// }
void USkillManager::AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn, TArray<USkill*>& SkillObjects,
TArray<FIntPoint>& BagPositions)
{ {
TMap<FIntPoint, int32>* states = PawnBagState.Find(Pawn);
FIntPoint BagSize = *PawnInfo.Find(Pawn); FIntPoint BagSize = *PawnInfo.Find(Pawn);
bool bAddAble = true; for (auto PlacedSkill: Bag->PlacedSkills)
for (int y = 0; y < BagSize.Y; y++)
{ {
for (int x = 0; x < BagSize.X; x++) USkill* skill = NewObject<USkill>(this);
{ skill->InitSkill(Pawn, this, PlacedSkill);
bAddAble = true; SkillObjects.Add(skill);
for (int skillX = 0; skillX < data.SkillWeight.X; skillX++) BagPositions.Add(FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY));
{
for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
{
if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
|| *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1)
{
bAddAble = false;
}
}
}
//满足条件
if (bAddAble)
{
BagPos = FIntPoint(x, y);
USkill* skill = NewObject<USkill>(this);
skill->InitSkill(Pawn, this, data, BagPos);
Skills.Add(skill);
//设置占用状态
for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
{
for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
{
states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill));
}
}
return skill;
}
}
} }
return nullptr;
} }
void USkillManager::OnAllSkillAdded() void USkillManager::OnAllSkillAdded()
@ -100,7 +116,7 @@ class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag)
{ {
for (auto Skill : Skills) for (auto Skill : Skills)
{ {
if (Skill->GetSkillData().SkillTag == Tag) if (Skill->GetSkillData()->SkillTag == Tag)
return Skill; return Skill;
} }
return nullptr; return nullptr;
@ -117,7 +133,7 @@ TArray<USkill*> USkillManager::GetSkillsAround(USkill* TargetSkill)
TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner()); TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner());
FIntPoint BagPos = TargetSkill->GetBagPos(); FIntPoint BagPos = TargetSkill->GetBagPos();
FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner()); FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner());
FSkillData data = TargetSkill->GetSkillData(); TObjectPtr<USkillAsset> data = TargetSkill->GetSkillData();
int beginX = FMath::Max(0, BagPos.X- 1); int beginX = FMath::Max(0, BagPos.X- 1);
int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1); int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1);
int beginY = FMath::Max(0, BagPos.Y - 1); int beginY = FMath::Max(0, BagPos.Y - 1);

View File

@ -24,9 +24,12 @@ public:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize); void AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize);
// UFUNCTION(BlueprintCallable)
// USkill* AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos);
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
USkill* AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos); void AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn,
TArray<USkill*>& SkillObjects, TArray<FIntPoint>& BagPositions);
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void OnAllSkillAdded(); void OnAllSkillAdded();

View File

@ -0,0 +1,33 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AssetActions/BagConfigAssetTypeAction.h"
#include "AssetEditor/BagConfigAssetEditor.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
UClass* FBagConfigAssetTypeAction::GetSupportedClass() const
{
return UBagConfigAsset::StaticClass();
}
void FBagConfigAssetTypeAction::OpenAssetEditor(const TArray<UObject*>& InObjects,
TSharedPtr<class IToolkitHost> EditWithinLevelEditor)
{
EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)
{
if (UBagConfigAsset* BagConfigAsset = Cast<UBagConfigAsset>(*ObjIt))
{
TSharedRef<FBagConfigAssetEditor> EditorToolkit = MakeShareable(new FBagConfigAssetEditor());
EditorToolkit->Initialize(Mode, EditWithinLevelEditor, BagConfigAsset);
}
}
}
uint32 FBagConfigAssetTypeAction::GetCategories()
{
return MyAssetCategory;
}

View File

@ -0,0 +1,41 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AssetActions/BagShapeAssetTypeAction.h"
#include "AssetEditor/BagShapeAssetEditor.h"
#include "ProjectFish/DataAsset/BagShapeAsset.h"
UClass* FBagShapeAssetTypeAction::GetSupportedClass() const
{
return UBagShapeAsset::StaticClass();
}
void FBagShapeAssetTypeAction::OpenAssetEditor(const TArray<UObject*>& InObjects,
TSharedPtr<IToolkitHost> EditWithinLevelEditor)
{
EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)
{
if (UBagShapeAsset* BagShapeAsset = Cast<UBagShapeAsset>(*ObjIt))
{
TSharedRef<FBagShapeAssetEditor> EditorToolkit = MakeShareable(new FBagShapeAssetEditor());
EditorToolkit->Initialize(Mode, EditWithinLevelEditor, BagShapeAsset);
}
}
}
uint32 FBagShapeAssetTypeAction::GetCategories()
{
//系统原有
//return EAssetTypeCategories::Gameplay;
return MyAssetCategory;
}
void FBagShapeAssetTypeAction::GetActions(const TArray<UObject*>& InObjects, struct FToolMenuSection& Section)
{
FAssetTypeActions_Base::GetActions(InObjects, Section);
}

View File

@ -0,0 +1,17 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AssetActions/SkillAssetTypeAction.h"
#include "ProjectFish/DataAsset/SkillAsset.h"
UClass* FSkillAssetTypeAction::GetSupportedClass() const
{
return USkillAsset::StaticClass();
}
uint32 FSkillAssetTypeAction::GetCategories()
{
return MyAssetCategory;
}

View File

@ -0,0 +1,75 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AssetEditor/BagConfigAssetEditor.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
#include "Widgets/BagConfigEditorWidget.h"
const FName FBagConfigAssetEditor::BagConfigEditorTabId(TEXT("BagConfigEditor"));
void FBagConfigAssetEditor::Initialize(const EToolkitMode::Type Mode,
const TSharedPtr<class IToolkitHost>& InitToolkitHost, class UBagConfigAsset* InBagConfigAsset)
{
BagConfigAsset = InBagConfigAsset;
const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_BagConfigAssetEditor_Layout_v1")
->AddArea
(
FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(1.0f)
->AddTab(BagConfigEditorTabId, ETabState::OpenedTab)
)
);
FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, TEXT("BagShapeAssetEditorApp"), StandaloneDefaultLayout, true, true, InBagConfigAsset);
}
FName FBagConfigAssetEditor::GetToolkitFName() const
{
return FName("BagConfigEditor");
}
FText FBagConfigAssetEditor::GetBaseToolkitName() const
{
return FText::FromString("BagConfig");
}
FString FBagConfigAssetEditor::GetWorldCentricTabPrefix() const
{
return TEXT("BagConfig");
}
FLinearColor FBagConfigAssetEditor::GetWorldCentricTabColorScale() const
{
return FLinearColor::White;
}
void FBagConfigAssetEditor::RegisterTabSpawners(const TSharedRef<FTabManager>& tabManager)
{
WorkspaceMenuCategory = tabManager->AddLocalWorkspaceMenuCategory( FText::FromString("BagShape"));
tabManager->RegisterTabSpawner(BagConfigEditorTabId, FOnSpawnTab::CreateSP(this, &FBagConfigAssetEditor::SpawnBagConfigEditorTab))
.SetDisplayName( FText::FromString("BagShapeEditor"))
.SetGroup(WorkspaceMenuCategory.ToSharedRef());
}
void FBagConfigAssetEditor::UnregisterTabSpawners(const TSharedRef<FTabManager>& tabManager)
{
tabManager->UnregisterTabSpawner(BagConfigEditorTabId);
}
TSharedRef<SDockTab> FBagConfigAssetEditor::SpawnBagConfigEditorTab(const FSpawnTabArgs& Args)
{
return SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
.Label(FText::FromString(FString::Printf(TEXT("Bag Class Editor - %s"), *BagConfigAsset->GetName())))
[
SNew(SBagConfigEditorWidget)
.BagConfigAsset(BagConfigAsset)
];
}

View File

@ -0,0 +1,74 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AssetEditor/BagShapeAssetEditor.h"
#include "ProjectFish/DataAsset/BagShapeAsset.h"
#include "Widgets/BagShapeEditorWidget.h"
const FName FBagShapeAssetEditor::BagShapeEditorTabId(TEXT("BagShapeEditor"));
void FBagShapeAssetEditor::Initialize(const EToolkitMode::Type Mode,
const TSharedPtr<class IToolkitHost>& InitToolkitHost, UBagShapeAsset* InBagShapeAsset)
{
BagShapeAsset = InBagShapeAsset;
const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_BagShapeAssetEditor_Layout_v1")
->AddArea
(
FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(1.0f)
->AddTab(BagShapeEditorTabId, ETabState::OpenedTab)
)
);
FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, TEXT("BagShapeAssetEditorApp"), StandaloneDefaultLayout, true, true, InBagShapeAsset);
}
FName FBagShapeAssetEditor::GetToolkitFName() const
{
return FName("BagShapeEditor");
}
FText FBagShapeAssetEditor::GetBaseToolkitName() const
{
return FText::FromString("Base BagShapeEditor");
}
FString FBagShapeAssetEditor::GetWorldCentricTabPrefix() const
{
return TEXT("ShapeTab");
}
FLinearColor FBagShapeAssetEditor::GetWorldCentricTabColorScale() const
{
//return FLinearColor::White;
return FLinearColor(1.f, 0.8f, 0.45f, 0.5f);
}
void FBagShapeAssetEditor::RegisterTabSpawners(const TSharedRef<FTabManager>& tabManager)
{
WorkspaceMenuCategory = tabManager->AddLocalWorkspaceMenuCategory( FText::FromString("BagShape"));
tabManager->RegisterTabSpawner(BagShapeEditorTabId, FOnSpawnTab::CreateSP(this, &FBagShapeAssetEditor::SpawnBagShapeEditorTab))
.SetDisplayName( FText::FromString("BagShapeEditor"))
.SetGroup(WorkspaceMenuCategory.ToSharedRef());
}
void FBagShapeAssetEditor::UnregisterTabSpawners(const TSharedRef<FTabManager>& tabManager)
{
tabManager->UnregisterTabSpawner(BagShapeEditorTabId);
}
TSharedRef<SDockTab> FBagShapeAssetEditor::SpawnBagShapeEditorTab(const FSpawnTabArgs& Args)
{
return SNew(SDockTab)
.TabRole(ETabRole::PanelTab)
[
SNew(SBagShapeEditorWidget)
.BagShapeAsset(BagShapeAsset)
];
}

Some files were not shown because too many files have changed in this diff Show More