응애맘마조
230913 강의 본문
팀 포폴을 만들면서 필요한 기능들이 보여 복사 생성과 카메라의 주시에 대해 강의했습니다.
먼저 복사 생성입니다. 캐릭터나 오브젝트를 많이 넣게 되면 FPS가 당연히 많이 떨어지게 됩니다. 그래서 복사해서 생성하는 방법으로 조금이나마 FPS가 줄어드는 것을 줄이고자 이미 생성된 캐릭터를 복사하는 식으로 만들었습니다.
playerClone = Actor::Create(player);
변수 이름을 PlayerClone으로 해서 만들었습니다. 여태 Create함수 안에는 매개변수가 들어가지 않았는데 이번에 새로 함수를 하나 만들었습니다.
Actor* Actor::Create(Actor* src)
{
Actor* temp = new Actor(*src);
temp->CopyChild(src);
return temp;
}
temp를 사용해 동적할당을 하고 CopyChild를 사용했습니다.
void GameObject::CopyChild(GameObject* src)
{
for (auto it = src->children.begin(); it != src->children.end(); it++)
{
GameObject* Child = nullptr;
GameObject* srcChild = it->second;
//Child 생성
if (it->second->type == ObType::GameObject)
{
Child = new GameObject(*srcChild);
}
if (it->second->type == ObType::Actor)
{
Actor* src = (Actor*)srcChild;
Child = new Actor(*src);
}
if (it->second->type == ObType::Camera)
{
Camera* src = (Camera*)srcChild;
Child = new Camera(*src);
}
if (it->second->type == ObType::Light)
{
Light* src = (Light*)srcChild;
Child = new Light(*src);
}
if (it->second->type == ObType::Terrain)
{
Terrain* src = (Terrain*)srcChild;
Child = new Terrain(*src);
}
if (it->second->type == ObType::UI)
{
UI* src = (UI*)srcChild;
Child = new UI(*src);
}
if (it->second->type == ObType::Billboard)
{
Billboard* src = (Billboard*)srcChild;
Child = new Billboard(*src);
}
if (it->second->type == ObType::Rain)
{
Rain* src = (Rain*)srcChild;
Child = new Rain(*src);
}
if (it->second->type == ObType::Pop)
{
Pop* src = (Pop*)srcChild;
Child = new Pop(*src);
}
//주소연결
Child->root = this->root;
Child->skelRoot = this->root;
Child->parent = this;
children[Child->name] = Child;
//테이블연결
root->AddChild(Child);
//자식의 재귀호출
Child->CopyChild(srcChild);
}
CopyChild의 함수 내용입니다. 재귀호출을 사용해서 여태 만들었던 것들을 생성하는 방식입니다. 하지만 아직 완성되지는 않아서 불완전하게 나옵니다.

ImGui에서도 그렇고 표기가 되지 않거나 이상하게 나오거나 공백 창이 나오고 모델이 이상하게 나옵니다. 아마 내일 고쳐질 것 같습니다.
이번엔 카메라 주시입니다. 게임을 하다 보면 카메라가 특정 오브젝트나 위치에 고정되어 있고 그에 따라 움직이고 난 다음 카메라가 따라 움직이는 현상을 본 적이 있을 겁니다.
Vector3 dis = player->Find("None")->GetWorldPos() - Camera::main->GetWorldPos();
Camera::main->MoveWorldPos(dis * 0.002f);
플레이어의 위치에서 카메라의 위치 값을 뺸 값으로 위치를 잡고 상수 값을 넣어 천천히 움직이도록 합니다. DELTA를 넣지 않은 것은 이미 MoveWorldPos에 DELTA가 포함되어 있는데 두 번 들어가기 때문에 넣지 않았습니다.
읽어주셔서 감사합니다.
Comments