"Spell" 커스텀 이벤트 호출에서 저장한 Cursor 위치 정보를 통해 "BP_Player"의 위치를 변경합니다.
Throw, 투적 마법 스킬
1. BP_WizardSkill_Throw
BP_WizardSkill_Throw 화면
역시, 클래스 세팅을 통해 Parent Class를 "BP_WizardSkill"로 설정합니다.
2. Particle 컴포넌트 추가
BP_WizardSkill_Throw
Particle System 컴포넌트를 추가하고 Particle Template을 미리 지정해두지 않습니다. 다양한 투척 스킬을 구현할 예정이라서, 추후에 이벤트 그래프를 통해 구현할 예정입니다. 예를 들면, "Fireball"을 "Throw Item"으로 지정하면 Particle Tempalte을 "P_HandFireball"로 지정하고, "Iceball"을 "Throw Item"일 경우 Particle Template을 "P_HandIceball"로 지정합니다.
2. BeginPlay 구현
BP_WizardSkill_Throw의 BeginPlay 이벤트
1. Set Active
간단하게, 시작과 동시에 Particle System의 활성화를 꺼줍니다.
3. OnFocus + OffFocus 이벤트 구현
BP_WizardSkill_Throw의 "BP_WizardSkill::OnFocus"
1. BP_WizardSkill::OnFocus
앞서 BP_WizardSkill에서 선언한 OnFocus 커스텀 호출은 Particle System을 활성화 시킵니다.
2. BP_WizardSkill::OffFocus
위와 반대로 Particle System을 비 활성화 시킵니다.
4. Spell 이벤트 구현
BP_WizardSkill_Throw의 BP_WizardSkill::Spell 커스텀 이벤트 구현
1. Set Can Move
Heal 그리고 Warp와 동일합니다.
2. Play Anim Montage
Heal 그리고 Warp와 동일합니다.
5. EndSpell 구현
BP_WizardSkill_Throw의 "BP_WizardSkill::EndSpell"
6. Throw 커스텀 이벤트 생성 및 구현
BP_WizardSkill_Throw::Throw 커스텀 이벤트 구현
1. Spawn Actor By Class
추후에 구현할 "Change Item" 함수를 통해 얻어온 Throw Item (투척 종류, eg) Fireball, Iceball)을 특정 위치와 회전 값을 통해 Spawn합니다. 이때, Spawn할 Actor는 "Projectile Movemnt" 컴포넌트를 갖고 있어야합니다. 그렇지 않으면, 움직이지 않겠죠...ㅎㅎ
2. Throw Items 배열 FThrowItem 구조체 내부추후에 구현할 Throw Item 구조체를 담고 있는 배열입니다. 미리 설명하자면, Throw Item 구조체는 나중에 구현할 BP_Throw Item 클래스의 참조와 Particle System을 담고 있습니다. 여기서 Particle System은 투척 종류에 따라서 달라지는 손에 들고 있을 Particle System을 의미합니다. 정리하자면, 손에 들고 있을 이펙트와 마법 공격 시 투척할 마법 공격을 구조체에 담고있는것입니다.
7. AN_WizardAttack -> AN_WizardThrow 로 변경 및 구현 수정
AN_WizardThrow의 Received Notify 함수 구현 화면
1. Get Weapon Current
BPI_Weapon 인터페이스에서 선언하고, BP_Player 내부에서 오버라이딩한 "Get Weapon Current" 함수는 현재 Player 객체의 Combat Type 상태를 반환합니다.
2. BP_WizardSkill_Throw::Throw 커스텀 이벤트 호출 BP_WizardSkill_Throw의 이벤트 그래프 중 "Throw" 커스텀 이벤트 구현 화면결과적으로, 현재 "AN_WizardThrow" 노티파이는 BP_WizardSkill_Throw 에서 구현한 Throw 커스텀 이벤트를 호출합니다.
8. BP_Fireball 수정 + BP_Iceball 생성
왼쪽부터 BP_Fireball, BP_Iceball의 이벤트 그래프
1. 클래스 세팅 -> Parent Class를 BP_ThrowItem으로 설정
2. Begin Overlap
BeginOverlap(충돌) 함수는 그대로 "On Comoponent Begin Overlap"을 호출하기 보다, 상위 클래스(BP_ThrowItem)에서 생성한 "BeginOverlap"함수에게 필요한 인자들을 전달하는 것으로 구현합니다!
9. Change Item 함수
BP_WizardSkill_Throw의 ChangeItem 함수 구현 화면
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 생성
BP_ThrowItem 블루프린트 에디터 창 화면
2. Get Owner To Wizard + Get Owner To Throw 함수 구현
BP_ThrowItem 의 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(충돌) 함수 구현
BP_WizardSkill_Throw의 BeginOverlap 함수 구현
1. 입력 생성 + Spawn Emitter At Location
BeginOverlap 함수의 입력들은 Spawn Emitter At Location 이벤트, 즉 폭발 Emitter를 Spawn하기 위한 변수들입니다.
2. Send Damage 함수
"BP_Weapon"에서 제공하는 비 가상 메서드 "Send Damage" 함수를 역시 호출해야겠죠
Enemy, 피격 구현
1. EventGraph -> Hitted 노드 그룹 추가 구현
BP_Enemy의 Event Graph 중 Hitted Event 추가 구현 화면
1. Cast To BP_Sword로 형 변환
충돌 발생과 함께 "Damage Causer"를 BP_Sword로 형 변환 할 때, 변환이 실패하면 "Damge Causer"가 "BP_Wizard"임을 추론할 수 있습니다. 따라서, Cast Failed 핀을 다시 Cast To BP_Wizard로 연결하여 Wizard 공격에대한 피격 반응을 구현합니다.