분류 전체보기 113

UE5 멀티대전게임 일기(13) - 마지막 - 회고 및 게임 영상

3주라는 시간동안 마무리까지 완벽하게 게임을 완성하진 못했지만 캐릭터 설계를 더 효율직이게 구현하는 방식과 스킬 방식 설계를 더 효율적으로 하는 방법 또한 알게되고, 멀티플레이까지 고려하면서 구현하는 과정속 배워가는 것이 많았습니다. 이번 프로젝트에서 캐릭터를 담당하고 구현한 것으로는 Omega Strikers와 Super Vive게임에서 캐릭터 및 애니메이션 추출캐릭터 베이스 설계캐릭터 베이스를 상속받는 캐릭터 4개 생성캐릭터 애니메이션 제작을 위한 IK Rig설계, IK Retargeter 제작, 애니메이션 리타겟팅으로 애니메이션 합치기 캐릭터 스킬 구현, 스킬 범위/ 크기/ 데미지/ 위치 등 설계,캐릭터 콤보공격 구현 캐릭터 발사체 액터 구현, Notify를 활용한 애니메이션 몽타주에서 원하는 타..

UE5 멀티대전게임 일기(12) KPT 회고

KPT 회고4인용 대전 PVP 대난투 게임개요 이번 주제는 멀티플레이 환경에서의 PVP 대전 게임을 목표로 제작하였습니다. 비영리 목적인 공부를 위한 프로젝트이며, 총 5명의 팀원과 같이 하였고 각각 캐릭터, UI/UX, 서버, 게임모드 등의 분야를 나누어 협업하여 만들었습니다. 총 4명의 캐릭터가 있고 Steam Advanced Session 을 이용하여 스팀과 연동되는 멀티 플레이 게임입니다. (캐릭터는 슈퍼 바이브와 배틀 크러쉬의 게임의 에셋에서 가져왔습니다. 파트김종선 - 서버 및 게임모드 담당 (레벨 포함)최정욱 - UI/UX 및 옵션, 세부사항 담당 (레벨 포함)박찬영 - 캐릭터 부문 팀장 및 나이아가라 이펙트, 캐릭터 기준 클래스 담당 > me정성현 - 세부 캐릭터 제작 및 원거리 공격 로..

UE5 멀티대전게임 일기(11) Myth, Void캐릭터 스킬 구현 현황

Myth, Void캐릭터 기본 AttackDamage Myth = 30Void = 30Myth, Void캐릭터가 가지고있는 공격 스킬들기본 공격기본 스킬대쉬 스킬2단 점프 공격궁극기 스킬1. 기본 공격 Myth AttackDamage = 30.f 기준:// ASW_Myth::SpawnComboArrow()switch (CurrentComboIndex){ case 0: CalculatedDamage = AttackDamage; break; // 30 case 1: CalculatedDamage = AttackDamage + (AttackDamage * 0.5f); // 45 case 2: CalculatedDamage = 45 + (AttackDa..

UE5 멀티대전게임 일기(10) 스킬 리플리케이션 구조

애니메이션 재생 방식 1. 클라이언트에서 PlayerController를 통해 EnhancedInput을 받으면 2. 서버 RPC로 요청 전송PlayerController.cpp....void ASW_PlayerController::ComboAttack(const FInputActionValue& InputValue){ if (ASW_CharacterBase* PlayerCharacter = Cast(GetPawn())) { if (!PlayerCharacter->bIsLocked) { PlayerCharacter->Server_PlaySkill("ComboAttack"); } }}void ASW_PlayerController::J..

UE5 멀티대전게임 일기(9) Brall, Dubu캐릭터 스킬 구현 현황

Dubu와 Brall캐릭터가 가지고있는 공격 스킬들기본 공격기본 스킬대쉬 스킬2단 점프 공격궁극기 스킬1. 기본 공격 BrallBrall 기본 3단 평타Brall 기본 3단 평타 데미지 DubuDubu 기본 3단 평타 데미지2. 기본 스킬 BrallBrall 기본 스킬DubuDubu 기본 스킬3. 대쉬 스킬 BrallBrall 대쉬 스킬DubuDubu 대쉬 스킬4. 2단 점프 공격 스킬 BrallBrall 2단 점프 공격 스킬DubuDubu 2단 점프 공격 스킬5. 궁극기 스킬Brall 궁극기 스킬DubuDubu 궁극기 스킬

UE5 멀티대전게임 일기(8) 캐릭터 스킬데미지, 콤보평타데미지 구현방식

스킬(특수기)의 범위 공격 판정 & 데미지 적용 콤보 평타에서 손에 박스를 붙여 충돌이 일어났을 때 데미지 주기 스킬(특수기)의 범위 공격 판정 & 데미지 적용  간단 요약어떤 캐릭터가 "대쉬 스킬"을 씀애니메이션이 실행되면서 스킬 ApplyDamageNotify가 발동됨함수 GetTargetsInRange("DashSkill")를 호출함내부적으로 “이 스킬의 데미지 범위가 얼마지?”, “공격 범위는 어디까지지?” 확인함그 위치에 Overlap 검사를 해서 범위 안의 적들이 있으면 데미지를 줌 1. 스킬 데이터 구조 설계CharacterBase.h...USTRUCT(BlueprintType)struct FSkillData{ float Damage = 10.f; // 얼마나 아프..

UE5 멀티대전게임 일기(7) 캐릭터 TakeDamage함수 구현

1. 맞는 몽타주, 죽는 몽타주, 넉백 몽타주변수 생성2. TakeDamage()함수 구현CharacterBase.h// 헤더 추가#include "GameFramework/DamageType.h"...// ================TakeDmage()함수용================// 피격 애니메이션UPROPERTY(EditAnywhere, Category = "Animation")UAnimMontage* HitReactionMontage;// 사망 애니메이션UPROPERTY(EditAnywhere, Category = "Animation")UAnimMontage* DeathMontage;//===================================================...// T..

UE5 멀티대전게임 일기(6) 조율점 현재 상황

1. 캐릭터 넉백을 언제마다 구현할건지 (데미지 입을때마다 넉백할건지)- 회의 필요2. 스킬시전같은경우 마우스가 바라보는곳으로만 할건지 이동하고있는곳으로 할건지- 마우스 없애고, WASD방향으로만 스킬이 나감3. 스킬 범위를 알려주는 Skill Indicator는 어떻게 구하고 어떻게 적용할것인지- 스킬 범위 표시는 회의 필요4. 스킬 사운드나 이팩트작업도 지금 같이 들어가야함- 스킬 사운드와 이펙트는 구현 종류 구분 및 에셋 준비를 먼저 (역할 분배 필요할 듯)5. 캐릭터가 스킬키를 누르면 바로 시전할건지 스킬범위가보이는 Skill Indicator가 보인다음 그걸 확인하고 다시 스킬키를 누르면 시전할건지- 두 경우 다 구현 (On/Off로 설정할 수 있게)6. 캐릭터 스킬같은경우는 여러명이 동시에 스..

UE5 멀티대전게임 일기(5) 카메라 거리 고정 + 캐릭터 체력바 추가

카메라 거리 고정캐릭터가 이동하다가 캐릭터 카메라 스프링암에 사물이나 다른 캐릭터가 겹쳐서 카메라의 거리가 바뀌는 상황이 생겨서 카메라 거리를 항상 고정시켰다. CharacterBase.cpp에 생성자 함수에서 카메라 스프링암에 CameraBoom->bDoCollisionText = false;로 설정하여 카메라스프링암에 다른 물체나 사물이 충돌하면 거리 축소를 방지하였다. 캐릭터 체력바 추가기본적으로 캐릭터마다 가지고 있을 체력바 위젯을 추가하기위해 새C++ 클래스로 UserWidget을 상속받는 위젯클래스를 추가해줬다.  SW_HP.h#pragma once#include "CoreMinimal.h"#include "Blueprint/UserWidget.h"#include "SW_HP.generated..

UE5 멀티대전게임 일기(4) 개별적으로 캐릭터 이동속도 구현 방법

1. SW_CharacterBase.h에 기본 속도 변수 추가CharacterBase.hprotected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Movement") float DefaultMoveSpeed = 600.f; 만약 캐릭터 속도 설정이 없으면 기본 캐릭터 속도는 600으로 설정2. SetLockedState() 수정CharacterBase.cppvoid ASW_CharacterBase::SetLockedState(bool bLocked){ bIsLocked = bLocked; if (UCharacterMovementComponent* MoveComp = GetCharacterMovement()) { ..