[Unreal_블루프린트]#22_Wizard Skills
Unreal 블루프린트 개발 중 "Wizard Skills"에 대해 알아보겠습니다.
"블루 프린트" 활용에 대한 내용입니다.
상속 모델
Heal
1. BP_WizardSkill_Heal
클래스 세팅을 통해 Parent Class를 "BP_WizardSkill"로 설정합니다.
2. BP_WizardSkill::Spell 구현
1. BPI_Weapon::SetCanMove
"BPI_Weapon" 인터페이스에서 제공하고 "BP_Player"에서 상세 구현을 진행했던 "Set Can Move"를 호출합니다.
2. BP_Player의 애님 몽타주 재생
"BP_WizardSkill"에서 제공하는 "GetOwner To Wizard"를 통해 "BP_Player"를 얻어오고 Play Anim Montage 이벤트를 호출합니다.
3. BP_WizardSkill::EndSpell 상세 구현
1. SetCanMove
위와 동일합니다.
2. BP_Weapon::Increase Health
"BPI_Weapon"에서 제공하고 "BP_Player"에서 상세 구현을 진행한 "Increase Health" 함수를 호출합니다. 증가시킬 Health Point는 별도로 변수를 생성해줍니다.
Warp, 순간 이동
1. BP_WizardSkill_Warp
Heal과 마찬가지로 클래스 세팅을 통해 Parent Calss를 "BP_WizardSkill"로 설정합니다.
2. Decal 컴포넌트 추가
* Decal?
Decal은 Mesh 표면에 렌더링되는 Material로 월드 화면에 그려내는 스티커라고 보면됩니다!
3. Get Cursor Location 메크로 생성 및 구현
1. Get Hit Result Under Cursor For Objects
Unreal이 제공하는 함수로 마우스 커서가 위치하는 곳의 "Hit Result(구조체)"를 반환합니다.
2. Break Hit Result
위 "Get Hit Result..."와 짝을 이루며 "HitResult" 구조체 내부 정보를 개별적으로 반환해주는 역할을 합니다.
4. BeginPlay 이벤트 구현
1. On Cursor Location
우리가 조종하는 마우스 커서의 위치의 정보를 반환합니다. 보통 Pawn에 붙어있는 Camera Component와 Mouse 커서 등은 AController 타입입니다!
2. On Cursor Location -> Hit Actor
마우스 커서가 위치한 지점에 Hit이 발생한 Actor 정보를 가져옵니다. 간단한 Warp만 진행할 예정이므로, "Wall"일 경우에만 "Set Visibility"를 통해 화면에 렌더하도록 합니다!
3. Set World Location
"Set Visibility"를 통해 화면에 렌더하는 동시에 Decal Component의 World 위치를 지정해줍니다!
* 맥락은 Cursor 위치 "Wall" Actor 라면 Decal을 화면에 렌더하고, 그렇지 않으면 렌더하지 않습니다.
5. Spell 구현
1. BP_WizardSkill::Spell 이벤트
Heal과 마찬가지로 BP_WizardSkill에서 제공하는 Spell 이벤트를 정의합니다.
2. Get Cursor Location -> Location
Spell 호출을 통해 Decal 이 가리키는 위치로 이동하기 위해서 "Location" 정보가 필요합니다. 따라서, 개별적으로 "Location(Vector 타입)" 변수를 생성해 Get Cursor Location이 반환하는 위치 정보를 저장해둡니다.
3. SetCanMove
Heal과 동일합니다. "BP_Player"의 CanMove 변수를 "False"로 변경하고 움직이지 못하도록 합니다.
* 맥락은 마우스 커서 위치 정보를 저장, 몽타주를 재생합니다.
6. EndSpell 구현
1. Set Can Move
Heal 과 동일합니다.
2. Set Actor Location
"Spell" 커스텀 이벤트 호출에서 저장한 Cursor 위치 정보를 통해 "BP_Player"의 위치를 변경합니다.
Throw, 투적 마법 스킬
1. BP_WizardSkill_Throw
역시, 클래스 세팅을 통해 Parent Class를 "BP_WizardSkill"로 설정합니다.
2. Particle 컴포넌트 추가
Particle System 컴포넌트를 추가하고 Particle Template을 미리 지정해두지 않습니다. 다양한 투척 스킬을 구현할 예정이라서, 추후에 이벤트 그래프를 통해 구현할 예정입니다. 예를 들면, "Fireball"을 "Throw Item"으로 지정하면 Particle Tempalte을 "P_HandFireball"로 지정하고, "Iceball"을 "Throw Item"일 경우 Particle Template을 "P_HandIceball"로 지정합니다.
2. BeginPlay 구현
1. Set Active
간단하게, 시작과 동시에 Particle System의 활성화를 꺼줍니다.
3. OnFocus + OffFocus 이벤트 구현
1. BP_WizardSkill::OnFocus
앞서 BP_WizardSkill에서 선언한 OnFocus 커스텀 호출은 Particle System을 활성화 시킵니다.
2. BP_WizardSkill::OffFocus
위와 반대로 Particle System을 비 활성화 시킵니다.
4. Spell 이벤트 구현
1. Set Can Move
Heal 그리고 Warp와 동일합니다.
2. Play Anim Montage
Heal 그리고 Warp와 동일합니다.
5. EndSpell 구현
6. Throw 커스텀 이벤트 생성 및 구현
1. Spawn Actor By Class
추후에 구현할 "Change Item" 함수를 통해 얻어온 Throw Item (투척 종류, eg) Fireball, Iceball)을 특정 위치와 회전 값을 통해 Spawn합니다. 이때, Spawn할 Actor는 "Projectile Movemnt" 컴포넌트를 갖고 있어야합니다. 그렇지 않으면, 움직이지 않겠죠...ㅎㅎ
2. Throw Items 배열
추후에 구현할 Throw Item 구조체를 담고 있는 배열입니다. 미리 설명하자면, Throw Item 구조체는 나중에 구현할 BP_Throw Item 클래스의 참조와 Particle System을 담고 있습니다. 여기서 Particle System은 투척 종류에 따라서 달라지는 손에 들고 있을 Particle System을 의미합니다. 정리하자면, 손에 들고 있을 이펙트와 마법 공격 시 투척할 마법 공격을 구조체에 담고있는것입니다.
7. AN_WizardAttack -> AN_WizardThrow 로 변경 및 구현 수정
1. Get Weapon Current
BPI_Weapon 인터페이스에서 선언하고, BP_Player 내부에서 오버라이딩한 "Get Weapon Current" 함수는 현재 Player 객체의 Combat Type 상태를 반환합니다.
2. BP_WizardSkill_Throw::Throw 커스텀 이벤트 호출
결과적으로, 현재 "AN_WizardThrow" 노티파이는 BP_WizardSkill_Throw 에서 구현한 Throw 커스텀 이벤트를 호출합니다.
8. BP_Fireball 수정 + BP_Iceball 생성
1. 클래스 세팅 -> Parent Class를 BP_ThrowItem으로 설정
2. Begin Overlap
BeginOverlap(충돌) 함수는 그대로 "On Comoponent Begin Overlap"을 호출하기 보다, 상위 클래스(BP_ThrowItem)에서 생성한 "BeginOverlap"함수에게 필요한 인자들을 전달하는 것으로 구현합니다!
9. Change Item 함수
1. Find Index 로컬 변수 생성
분기 반복문(For Each)을 돌며 새로운 "ThrowItem(투척 종류)"를 찾으면 해당 index를 "FindIndex"로 값으로 설정합니다.
2. Break 조건
입력으로 받은 Throw Item과 같은 Throw Item 구조체를 "Find Index"를 통해 "ThrowItems" 배열에서 찾을 경우 Break합니다.
3. Completed 조건
"Completed" 조건으로 "Find Index" 변수를 "Current(Index)"로 설정합니다. 그리고 "ThrowItems" 배열의 "Current" 인덱스에 해당하는 "ThrowItem" 구조체를 통해 현재 설정할 "Template", 즉 Particle System을 설정합니다.
ThrowItem(Fireball or Iceball)
1. BP_ThrowItem 생성
2. Get Owner To Wizard + Get Owner To Throw 함수 구현
1. Get Owner To Throw
Owner = BP_WizardSkill_Throw 액터
2. Get Owner To Wizard
BP_WizardSkill_Throw 의 Owner = BP_Wizard
3. BeginOverlap(충돌) 함수 구현
1. 입력 생성 + Spawn Emitter At Location
BeginOverlap 함수의 입력들은 Spawn Emitter At Location 이벤트, 즉 폭발 Emitter를 Spawn하기 위한 변수들입니다.
2. Send Damage 함수
"BP_Weapon"에서 제공하는 비 가상 메서드 "Send Damage" 함수를 역시 호출해야겠죠
Enemy, 피격 구현
1. EventGraph -> Hitted 노드 그룹 추가 구현
1. Cast To BP_Sword로 형 변환
충돌 발생과 함께 "Damage Causer"를 BP_Sword로 형 변환 할 때, 변환이 실패하면 "Damge Causer"가 "BP_Wizard"임을 추론할 수 있습니다. 따라서, Cast Failed 핀을 다시 Cast To BP_Wizard로 연결하여 Wizard 공격에대한 피격 반응을 구현합니다.
2. Set Active
"P_AttachFire" 파티클 시스템을 Active 해줍니다!
'게임개발 > Unreal 블루프린트' 카테고리의 다른 글
[Unreal_블루프린트]#24_Skill UI (0) | 2022.09.26 |
---|---|
[Unreal_블루프린트]#23_Weapon Change, Scroll 액션 이벤트 (0) | 2022.09.26 |
[Unreal_블루프린트]#21-2_Interface, No Combo (1) | 2022.09.25 |
[Unreal_블루프린트]#21-1_Interface, Combo (0) | 2022.09.25 |
[Unreal_블루프린트]#20_Magical Attack (0) | 2022.09.16 |