본문 바로가기

분류 전체보기50

게임 개발 - 인벤토리와 장비창(4) //...인터페이스 메세지 전달 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnShowCharacterNotice, FText, NoticeString); //... void UUIWidget::ShowAutoShootNotice(bool AutoShoot) { FString str = FString::Printf(TEXT("사격 모드 변경 : %s"), AutoShoot ? TEXT("자동") : TEXT("단발")); ShowCharacterNotice(FText::FromString(str)); } void UUIWidget::ShowCharacterNotice(FText str) { GetWorld()->GetTimerManager().ClearTimer(Ch.. 2022. 2. 10.
게임 개발 - 인벤토리와 장비창(3) 오랜만에 온갖 잘못된 짓은 다하고 다닌 것 같다. 우선적으로 위젯 클래스를 블루프린트로 받아야 되는데 StaticClass로 받아서 되지도 않는 걸 일일이 왜 안 되지? 하면서 변경하고 있던 내 모습을 발견할 수 있었다. 이쯤되면 정신머리가 없는 수준. 그것을 파악하고 나서 정리하니까 바로 되었다. (현타오지게 옴) UCLASS() class THEZOMBIES_API UGameIns : public UGameInstance { //... UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Data, meta = (AllowPrivateAccess = "true")) TArray InventoryData; protected: virtual void Ini.. 2022. 2. 10.
게임 개발 - 인벤토리와 장비창(2) 완성이 되는 부분을 블로그에 기록하고, 연관된 다른 기능들을 함께 점검하느라 생각보다 늘어지는 경향이 크다. 딱 하나의 객체만 바라보고 진행하는 것이 아닌 총괄적인 부분을 홀로 개발하다보니 생기는 문제 같다. 완성도 자체는 심히 아쉬우나, 진행경과를 위해서 기록한다. void UUIWidget::EquipWeapon(EWeaponType WeaponType, class UTexture* WeaponIcon) { switch (WeaponType) { case EWeaponType::MainWeapon: WeaponImage->SetBrushResourceObject(WeaponIcon); WeaponPanel->SetVisibility(ESlateVisibility::SelfHitTestInvisible.. 2022. 2. 10.
게임 개발 - 인벤토리와 장비창(1) 현재 인벤토리 구상 중인 인벤토리와 슬롯이다. 크기는 100x100로 두고 있으나 현재 스크린이 세로로 많이 짧은 노트북으로 구현 정도를 확인해보고 처리해볼 예정이다. 대체적으로 texture icon이 Weapon쪽이 1:2 비율이기 때문에 45도로 기울여서 1:1 비율의 아이콘을 다시 재생산할 예정이다. 따라서 데이터베이스도 아이콘이 Item쪽으로부터 상위 icon인 인벤토리 아이콘이 존재하고 Weapon부터는 Weapon용 장착 icon이 존재할 듯 싶다. 맛보기로 적용시켜보자면 이렇게 되지 않을까 싶다. 전체적인 틀을 잡고 크기를 부여해보았다. 디아블로처럼 무기의 모습을 크게 보여줄 수 있는 형태 로 만들지는 현재 틀을 짜면서 고려해보고 있다. 미형적인 면모로는 전자가 이득일 지 모르지만 구현 목.. 2022. 2. 10.
게임 개발 - 연사 / 단발 토글 자동 연사 토글 기능을 구현해보았다. 공격 중에는 토글이 되지 않도록 제한을 두고. 토글이 완료되면 UI로 Notice를 띄워 무엇으로 변했는지 알아차릴 수 있도록 한다. 이번에 구현을 하면서 Montage 처리 건으로 CurrentWeapon->MyOwner 상호작용이 늘어나게 되었는데 MyOwner의 다른 행동과 엮여질 가능성을 고려해보게 되었다. CurrentWeapon을 중심으로 PlayerStatus와 캐릭터가 모호하게 연결되어 있어서 그런 것 같은데 차후 리팩토링 때 새롭게 캡슐화하는 것이 좋다고 생각된다. void ATheZombiesCharacter::ToggleShootingMode() { if (!bBurstAttack) PlayerStatus->CurrentWeaponToggle();.. 2022. 2. 10.
게임 개발 - 데이터 테이블(5), 스폰 총기의 길이가 꽤 차이가 나서 오른쪽의 자세를 맞춰줄 필요가 있었다. 오른손의 IK를 통해 Solver의 형태를 무너뜨리지 않도록 본을 이동한다. 따라서 이러한 정보를 저장할 라이플 포즈마다 라이플의 크기만큼 이동시키기 위한 변수를 새로 정의하고, 현재의 캐릭터 상태와 동조하기 위해 캐릭터에 내부 변수를 따로 두었다. 또한 아이템마다 개개인으로 벡터를 굳이 정의하여 메모리를 차지할 가능성을 둘 바에야 라이플 드랍 드로우할 때마다만 데이터 테이블에서 데이터를 빼와서 적용하는 방식으로 바꾸었다. USTRUCT(BlueprintType) struct FGunData : public FWeaponData { GENERATED_BODY() public: UPROPERTY(EditAnywhere, Blueprint.. 2022. 2. 7.
게임 개발 - 데이터 테이블(4) 데이터 테이블을 작성했으니 일단 확인해볼 것은 데이터 테이블을 적용하여 제대로 처리되는 가.일 것이다. 코드 영역이 현재 2만 줄이 되지 않으므로 리팩토링은 완전히 완성하고 나서 처리해도 늦지 않을 것이니 이미 만들어진 1개의 총에 대하여 테이블을 구성하고, 로딩을 해보았다. AGun::AGun() { static ConstructorHelpers::FObjectFinder AData(TEXT("/Game/Resource/Data/GunDataTable")); if (AData.Succeeded()) { GunDataTable = AData.Object; } FGunData* Data = GunDataTable->FindRow(*FString::FromInt(1), TEXT("")); Damage = D.. 2022. 2. 7.
게임 개발 - 데이터 테이블(3) 몬스터와 캐릭터는 객체를 기준으로 상승치를 조정할 필요가 있다고 생각했다. 몽타주가 순차적이 아니라 랜덤적 레벨마다 다르게 변경되고, 레벨마다 상승치를 구체적으로 지정해야한다고 하면 모를까 우선적으로 일정 레벨 이상의 패턴이 달라진다고 가정할 때 우리는 다양한 테이블을 굳이 상속하여 지정할 필요가 없다. 예를들면 좀비1, 좀비2가 있다고 하자. 좀비1과 좀비2는 라운드 10부터 패턴이 달라진다. 하지만 스테이터스는 고정적으로 상승한다. 라고 가정해볼 때 LessThanorEqualLevel10Monster 테이블과 GreaterThanLevel10Monster 테이블 두 개로 구현하면 될 것이다. 다만 몬스터가 플레이어보다 상승치가 보다 높아져야 하므로 일정라운드마다 추가수치 상승치를 두어 난이도를 점점.. 2022. 2. 7.
게임 개발 - 데이터 테이블(2) 어제 데이터 테이블을 보완하는 과정에서 생각했던 기획부분과 변수의 사용부분이 일부 틀어진 것을 보고 데이터 테이블을 몇 개 수정한 뒤 필요한 데이터를 추가했다. 우선적으로 각 아이템마다 고유적으로 선택될 SkeletalMesh 그리고 Icon으로서 쓰일 UTexture2D 무기 장착을 위한 오른손 Transform과 무기를 받쳐줄 왼손 Vector가 그것이다. USTRUCT(BlueprintType) struct FItemData : public FTableRowBase { GENERATED_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Data) FText FlavorText; UPROPERTY(VisibleAnywher.. 2022. 2. 7.