Open simeddk opened 1 year ago
구현 결과 선요약: 원하던 모든 기능 구현 깃허브: https://github.com/skacjstk/CinderGuy/tree/GuardSystem 블로그: https://blog.naver.com/skacjstk0818/223042238973
고찰 강한 공격은 못막는다거나, 다른 무기의 대방패(없음) 같은 것만 막을 수 있는 공격을 염두하지 않아 만약 구현하려 한다면 구조를 뜯어교쳐야 한다. 다만 Guard만 가능한 무기, Parry 도 가능한 무기 정도는 구분 가능하게 해놨다.
농장 시스템에 사용할 작물 3종 구현
결과
데이터 테이블을 넣었는데 왜 인식을 못하는걸까요...
몹 스폰하는 코드로 타이머를 이용해 1초마다 생성하고 스폰카운트 수 + 0.1f 로 정확히 스폰카운트 수 만큼 생성되게했다.
void ACStoryGameMode::RoundWave()
{
TArray<FSpawnData*> roundDatas = CurrentRoundDatas();
if (roundDatas.Num() < WaveCount)
{
WaveCount = 1;
return;
}
int32 wavedata = WaveCount - 1;
Monclass = roundDatas[wavedata]->MonsterRef;
for (int32 i = 0; i < SpawnPoints.Num(); i++)
{
if (SpawnPoints[i]->PathNum == (int32)roundDatas[wavedata]->SpawnLocationIndex)
SpawnTransform.SetLocation(SpawnPoints[i]->GetActorLocation() + FVector(0, 0, 88));
}
GetWorldTimerManager().SetTimer(timerHandle, this, &ACStoryGameMode::SpawnMonster, 1.f, true);
FTimerDynamicDelegate timer;
timer.BindUFunction(this, "ClearSapwn");
UKismetSystemLibrary::K2_SetTimerDelegate(timer, (float)roundDatas[wavedata]->SpawnCount + 0.1f, false);
클리어 스폰에서 waveCount를 증가 시키고 다시 RoundWave 함수를 실행시켜 웨이브 수 만큼 소환해주고 , 스폰된 몹수로 라운드 클리어 조건을 만들어 승리조건을 만들었다.
void ACStoryGameMode::ClearSapwn()
{
GetWorldTimerManager().ClearTimer(timerHandle);
WaveCount++;
RoundWave();
}
void ACStoryGameMode::DecreaseRoundCount() { RoundAmount--; if (RoundAmount == 0) { CurrentRound++; if (CurrentRound == ClearRound) GameClear();
bStarted = true;
}
}
3.고찰
- 아직 OSS를 이용한 세션 생성, 참가를 완료하지 못한게 아쉽다.
주간목표 : 덱슬롯 UI 디자인 적용
결과
void UCUserWidget_Deck::NativeConstruct()
{
Super::NativeConstruct();
TArray<UWidget*> slots;
slots = Container->GetAllChildren();
for (UWidget* slot : slots)
{
Slots.Add(Cast<UImage>(slot));
}
//CLog::Print("Construct Slots : " + FString::FromInt(Slots.Num()));
SetIcons();
}
void UCUserWidget_Deck::SetIcons()
{
CheckNull(OwnerComponent);
TArray<ACPerk*> perks = OwnerComponent->GetPerks();
//CLog::Print("perks : " + FString::FromInt(perks.Num()));
//CLog::Print("Slots : " + FString::FromInt(Slots.Num()));
Slots[0]->SetBrushFromTexture(perks[0]->Icon);
for (int32 i = 0; i < perks.Num(); i++)
{
if (perks[i]->Icon == nullptr) continue;
Slots[i]->SetBrushFromTexture(perks[i]->Icon);
}
}
이랬던 코드를
void UCUserWidget_Deck::NativeConstruct()
{
Super::NativeConstruct();
TArray<UWidget*> slots;
slots = Container->GetAllChildren();
for (UWidget* slot : slots)
{
Slots.Add(Cast<UCUserWidget_DeckSlot>(slot));
}
//CLog::Print("Construct Slots : " + FString::FromInt(Slots.Num()));
SetIcons();
}
void UCUserWidget_Deck::SetIcons()
{
CheckNull(OwnerComponent);
TArray<ACPerk*> perks = OwnerComponent->GetPerks();
//CLog::Print("perks : " + FString::FromInt(perks.Num()));
//CLog::Print("Slots : " + FString::FromInt(Slots.Num()));
//Slots[0]->GetIcon()->SetBrushFromTexture(perks[0]->Icon);
for (int32 i = 0; i < perks.Num(); i++)
{
if (perks[i]->Icon == nullptr) continue;
Slots[i]->SetIcon(perks[i]->Icon);
//Slots[i]->GetIcon()->SetBrushFromTexture(perks[i]->Icon);
//Slots[i]->SetIcon(perks[i]->Icon);
}
}
이렇게 바꿨다.
단순히 UImage 였던 Slot을 CUserWidget_DeckSlot으로 변환하고 Icon을 UI에 출력하는 부분을 기존 SetBrushFromTexture()을 사용하던 것에서 별도로 CUserWidget_DeckSlot::SetIcon()을 만들어서 따로 나눠버렸다. 해당 덱슬롯을 선택했을 때 테두리가 강조(SetSelected())되게 했고 다른 덱으로 전환할 때 기존 덱슬롯은 SetCleared() 가 호출되도록 해서 강조를 풀어줬다.
[중요!]시작했으면 끝장을 봐야 한다.
제출자
권정훈
김건웅
김주연
남석원
서상원
유재우
윤대영
이규원
이해용
장현덕
최윤혁