프로그래밍 공부
작성일
2023. 11. 30. 16:05
작성자
WDmil
728x90

AnimationInstancing객체를 사용해서 응용해보자.

 

인스턴싱 작업을 위해 Buffer에 데이터 범위를 설정하고. 해당 범위값에 대한 데이터를 활용해서

 

데이터를 넘겨주는 작업을 진행한다.

 

// FireBallManager 클래스의 생성자
FireBallManager::FireBallManager()
{
    // ModelInstancing을 생성하고 이름을 설정합니다.
    modelInstancing = new ModelInstancing("FireBall");

    // 첫 번째 메시에 대한 블렌드 스테이트를 추가적으로 설정합니다.
    modelInstancing->GetMesh(0)->GetBlendState()->Additive();
    // 첫 번째 메시에 대한 래스터라이저 스테이트를 양면 시점으로 설정합니다.
    modelInstancing->GetMesh(0)->GetRasterizerState()->CullMode(D3D11_CULL_NONE);

    // FireBall 객체들을 모두 할당하고 초기화합니다.
    fireBalls.resize(FULL_SIZE);
    for (FireBall*& fireBall : fireBalls)
    {
        fireBall = new FireBall(modelInstancing->Add());
    }
}

// FireBallManager 클래스의 소멸자
FireBallManager::~FireBallManager()
{
    // ModelInstancing을 메모리에서 해제합니다.
    delete modelInstancing;

    // FireBall 객체들을 순회하면서 메모리에서 해제합니다.
    for (FireBall* fireBall : fireBalls)
        delete fireBall;
}

// FireBallManager 클래스의 업데이트 함수
void FireBallManager::Update()
{
    // 각 FireBall 객체를 업데이트합니다.
    for (FireBall* fireBall : fireBalls)
        fireBall->Update();

    // ModelInstancing을 업데이트합니다.
    modelInstancing->Update();
}

// FireBallManager 클래스의 렌더링 함수
void FireBallManager::Render()
{
    // ModelInstancing을 통해 인스턴싱된 객체들을 렌더링합니다.
    modelInstancing->Render();

    // 각 FireBall 객체를 렌더링합니다.
    for (FireBall* fireBall : fireBalls)
        fireBall->Render();
}

// FireBallManager 클래스의 GUI 렌더링 함수
void FireBallManager::GUIRender()
{
    // ModelInstancing을 통해 인스턴싱된 객체들의 GUI를 렌더링합니다.
    modelInstancing->GUIRender();

    // 각 FireBall 객체의 GUI를 렌더링합니다.
    for (FireBall* fireBall : fireBalls)
        fireBall->GUIRender();
}

// 새로운 FireBall을 발사하는 함수
void FireBallManager::Fire(Vector3 pos, Vector3 direction)
{
    // 비활성화된 FireBall을 찾아 발사합니다.
    for (FireBall* fireBall : fireBalls)
    {
        if (!fireBall->IsActive())
        {
            fireBall->Fire(pos, direction);
            return;
        }
    }

 

캐릭터가 공격을 하면, FireBall이 케릭터의 정면을 향해 이동하게 작업할것 이다.

 

FireBall을해당되는 위치에 생성하고, 활성화 되어있다면 계속 생성하며, 만약, 객체가 없을경우, 이동하지 못한다.

 

void TopviewTraveler::Attack()
{
    FireBallManager::Get()->Fire(localPosition, GetForward());
}

케릭터는. 공격시 싱글톤으로 만들어진, FIreBallManager에 불의 생성오더를 넣는다.

 

현재 위치에서 케릭터의 정면으로 공격모션을 넣으라는 명령을 넣는다.

 

그렇게 되면, FireBall은 현재 IsActive라면, DELTA 시간만큼 정면으로 이동한다.

 

 

 

즉, FireballManager에서는 객체의 렌더만 가지고 있고,

 

FireBall 객체는 해당객체가 생성될 떄. Transform 데이터를 FireBallManager 에 넘겨주어 생성되며,

 

정면으로 이동하는 에니메이션을 약 2초간 출력하는것 이다.

 

IsActive는 충돌Collider에도 관련이 있음으로. IsAcvite가 꺼진다면, 충돌이 안되고 렌더도 종료된다.

728x90