클래스 3가지 속성에 대해 알아보려고 한다
1. 상속성
2. 은닉성
3. 다형성
상속성 (Inheritance)
상위 클래스의 특성을 하위 클래스가 물려받는 것
기본 구조
Character (상위 클래스)
언리얼에서 상속하는 방법
변수설정
상속하는 방법 1
만들어진 개체에 디테일에서 상위 클래스를 변경
상속하는 방법 2
클래스를 만들때 처음부터 상위 클래스를 설정
주의
자식 클래스에서 부모 클래스의 변수는 사용 가능하지만 부모 클래스에서 자식 클래스의 변수는 사용 불가능
※ 언리얼 TIP
자식 클래스에서 사진에 보이는 Show Inherited Variables 를 체크하면 부모 클래스에서 선언한 변수를 확인 가능
캐스트
타입 변환을 위한 도구
주요 목적
1. 타입 확인
- 어떤 객체가 특정 클래스 타입인지 확인
2. 특정 기능 접근
- 캐스팅 후 해당 클래스의 고유 기능 사용
- 변수나 함수에 접근
☆ 예시 ☆
Mage → Player로 캐스트
- 성공: 플레이어의 특수 기능 사용 가능
- 실패: 일반 Mage로 취급
캐스트는 상속 관계에서 특정 자식 클래스 인지를 확인 하는 것이다.
같은 부모를 가졌다고 해서 서로 캐스트가 되지는 않는다.
실제 예시
플레이어 감지 시스템
트리거 박스 오버랩 시: Other Actor를 PlayerCharacter로 Cast
성공 시
- 플레이어의 스탯 확인
- 퀘스트 진행 상태 확인
- 특정 이벤트 발생
실패 시
- 일반 충돌 처리
- 로그 기록
- 공격 판정 시스템
맞은 대상을 Interface_Damageable로 Cast
성공 시
- TakeDamage 함수 호출
- 데미지 이펙트 재생
실패 시
- 물리적 반응만 처리
은닉성 ( Encapsulation )
내부 데이터를 외부로부터 보호하여 잘못된 값이나 조작 방지
접근제어 수준
Private (비공개)
- 같은 클래스 내에서만 접근 가능
- 외부에서 직접 수정 불가능
- 가장 강력한 은닉성 제공
Protected (보호)
- 자식 클래스까지만 접근 가능
- 상속 관계에서 공유해야 할 데이터에 사용
- 부모-자식 간 은닉성 제공
Public (공개)
- 어디서나 접근 가능
- 외부에 공개할 인터페이스에 사용
- 은닉성 없음
언리얼에서 사용방법
결과
실제 사용 예시
체력 시스템
Private 변수
currentHealth (현재 체력)
maxHealth (최대 체력)
armorValue (방어력)
regenerationRate (회복률)
이 값들은 직접 수정되면 안되는 핵심 데이터이자 잘못된 값 설정 방지를 위해 접근 방지
Protected 함수
calculateDamage()
clampHealth()
applyArmor()
자식 클래스에서 데미지 계산 방식을 커스터마이즈 할 수 있게 설계해야함
예) 일반 캐릭터는 기본 방어력만 계산하지만 탱커 클래스는 추가 방어력 보너스를 적용 등
Public 함수
TakeDamage()
Heal()
GetCurrentHealth()
IsAlive()
외부에서 필요한 상호작용은 허용해야한다
예) UI가 현재 체력을 표시하기 위해 GetCurrentHealth() 호출 등
이런 구조로 설계하면 핵심 데이터를 보호함과 동시에 유연하고 사용법이 단순해진다.
다형성 ( Polymorphism )
같은 인터페이스로 다른 구현을 제공하거나 하나의 기능이 여러 형태로 동작
코드의 재사용성 향상과 유연한 시스템 설계가 가능해짐
오버라이딩( 재정의 )
실행
결과
오크 클래스에 parent 노드 추가 후 실행
결과
Parent 노드
부모 클래스의 기능도 그대로 활용
기존 기능을 완전히 대체하는 것이 아닌 추가하는 방식이다
동일한 이벤트( OnDamaed )로 각각 다른 대상에게 데미지 입히기
결과
인터페이스 ( Interface )
여러 클래스에서 공통적으로 구현해야 할 기능을 정의
실제 구현은 포함하지 않고 선언만 한다 ( '이런 기능이 있어야 된다'를 명시)
인터페이스 선언 방법
Return
Return값이 있는 경우
특징
- 반드시 값을 반환해야 함
- 함수(Function)로 생성됨
- 구현 시 Return Node가 필요
- 동기적 실행 (즉시 값 반환)
- 하나의 응답만 가능
사용예시
GetHealth(): return float
- 현재 체력값 즉시 반환
- 다른 시스템이 이 값을 바로 사용 가능
CanInteract(): return boolean
- 상호작용 가능 여부 즉시 반환
- UI가 이 값으로 상호작용 버튼 표시/숨김
Return값이 없는 경우
특징
- 이벤트(Event)로 생성됨
- 구현 시 이벤트 그래프에서 구현
- 비동기적 실행 가능
- 여러 응답자가 반응 가능
사용 예시
OnDamaged()
UI 업데이트, 사운드 재생, 파티클 효과 (여러 시스템이 동시에 반응)
OnGameStateChanged()
여러 액터가 동시에 상태 변경,UI 업데이트,배경음악 변경 (여러 시스템이 동시에 반응)
예시 실행
결과
FlyStart 출력 → (1초 뒤) → Fly 출력
IFlyable 인터페이스의 Fly()는 리턴값이 없어서 이벤트로 생성여러 동작(텍스트 출력, 딜레이)을 순차적으로 실행 가능
만약 GetFlySpeed(): return float 같은 함수였다면?
리턴값이 있어서 함수로 생성 되고 Return 노드로 속도값을 즉시 반환해야 함
'언리얼 > 문법' 카테고리의 다른 글
[Unreal5] Collision (3) | 2024.11.08 |
---|---|
[Unreal5] 블루프린트 Structure(구조체),Vector, Location, Rotate (0) | 2024.11.07 |
[Unreal5] 블루프린트 Swap, 배열, 로또번호 생성기, 버블정렬 (5) | 2024.11.05 |
[Unreal5] 블루프린트 Random, 게이트, Enum (2) | 2024.11.01 |
[Unreal5] 블루프린트 반복문(While,For),DO (0) | 2024.10.30 |