DirectX/던파 모작 개발일지
7/21 아바타 시스템 구상
곰바닥
2022. 7. 21. 16:40
현재 엔진 구조에서 불편한 점
1. ChangeAnimtion을 할 때 문자열을 파라미터로 사용하는 것이 매우 귀찮음
지금 엔진
HairRenderer->ChangeAnimation("Idle_Avatar1");
CoatRenderer->ChangeAnimation("Idle_Avatar0");
이렇게 문자열 구분을 해줘야 함.
하고 싶은 거
사용자는 문자열을 않고 Enum class로 아바타, 모션을 변경 관리하고 싶어
ex)
- DnFAvator.ChangeMotion(PlayerMotion::Attack_1)
- DnfAvator.ChangeAvator(AvatarType::Dog,Part::Hair)
물론 아바타 인터페이스 클래스 내부에서는 String으로 매게 변수 전달하는 것이 더 좋을 것 같다.
2. 모션, 아바타 변경할 때 업데이트해야 하는 렌더러 종류가 너무 많음
지금 엔진
모션(Idle상태에서 Attack상태 등)을 바꿀 때마다
void Player::DoSomething()
{
HairRenderer_->ChangeAnimation("Attack_Avatar1") ,
WeaponRenderer->ChangeAnimation("Attack_Type1"),
CoatRenderer->ChangeAnimation("Attack_Type1")
}
이런 식으로 해야 함
하고 싶은 것
나는 그냥 DNFAvator.ChangeMotion(PlayerState::Attack)이라고 치면 자동으로
void DnfAvator::ChangeMotion(PlayerMotion _Motion)
{
HairRenderer_->ChangeAnimation("Attack_Avatar1") ;
WeaponRenderer->ChangeAnimation("Attack_Type1");
CoatRenderer->ChangeAnimation("Attack_Type1");
}
이렇게 하고 싶다.
3. 새로운 아바타를 만들려 할 때 쳐야 할 코드 수가 많음
머리 아바타 한 개 만들어야 하면 Player 클래스에서 쳐야 하는 코드
void Player::Start()
{
HairRenderer_->CreateFrameAnimationFolder("Idle_0", FrameAnimation_DESC("sm_hair0000a", 0, 10, 0.08f));
HairRenderer_->CreateFrameAnimationFolder("Attack_0", FrameAnimation_DESC("sm_hair0000a", 11, 20, 0.08f));
HairRenderer_->CreateFrameAnimationFolder("Attack_1", FrameAnimation_DESC("sm_hair0000a", 14, 22, 0.08f));
HairRenderer_->CreateFrameAnimationFolder("Attack_2", FrameAnimation_DESC("sm_hair0000a", 22, 30, 0.08f));
HairRenderer_->CreateFrameAnimationFolder("Move", FrameAnimation_DESC("sm_hair0000a", 30, 32, 0.08f));
HairRenderer_->CreateFrameAnimationFolder("Jump", FrameAnimation_DESC("sm_hair0000a", 33, 44, 0.08f));
//...
}
너무 많다....
나는 이렇게 만들고 싶다.
void Player::Start
{
DNFAvator.CreateAvator(AvatarType::Dog,AvatarPart::Hair);
}
void DNFAvator::CreateAvator(AvatarType _Type, AvatarPart _Part)
{
//Type과 _Part에 따른 CreateFrameAnimationFolder 하기
}
4. 이런 기능을 Player가 담당하면 Player클래스가 너무 비대해짐
따라서 아바타 관리 인터페이스가 필요함.
아바타 관리 인터페이스 DNFAvator - 제공하는 기능
1. 렌더러 링크
아바타 인터페이스 클래스에 Player가 들고 있는 렌더러 포인터를 연결한다.
2. 아바타 정보 로드
void DNFAvator::LoadAvator
{
HairString_.insert(make_pair("Hair1","sm_hair0001a");
HairString_.insert(make_pair("Hair1","sm_hair0001b");
HairString_.insert(make_pair("Hair2","sm_hair0002a");
CoatString_.insert(make_pair("Coat1","sm_coat0001a");
}
이런 느낌
3. 아바타 생성
void DNFAvator::CreateAvator(AvatarType _Type, AvatarPart _Part)
4. 아바타 변경
DnfAvator.ChangeAvator(AvatarType::Dog,Part::Hair)
5. 모션 변경
DnFAvator.ChangeMotion(PlayerMotion::Attack_1)
6.Enum -> String 변환
Enum 타입에 맞는 String 변환 > 아바타 클래스 내부에서는 String 전달이 더 편하기 때문