블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2307)
Unity3D (564)
Programming (470)
Unreal (4)
Gamebryo (56)
Tip & Tech (182)
협업 (34)
3DS Max (3)
Game (12)
Utility (114)
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (37)
Android (12)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (19)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (5)
Total1,331,907
Today10
Yesterday172
Statistics Graph

달력

« » 2019.10
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

공지사항

태그목록

'Effect'에 해당되는 글 2건

  1. 2011.03.17 타격감 향상을 위한 방법론
  2. 2011.02.08 이펙트 출력

 

 우선적으로  천몽(iliyard)님이 올리신 내용을 기초로 하여 필요부분을 추가 서술했음을 알려드립니다.

 

 1.    Overview

· 타격감이란??..

  말 그대로 게임내에서 유저가 상대방을 때릴 때나 피격시 느낌을 얼마나 잘 받을수 있게 해주는가를 말하는 것. 이 타격감을 향상 시키기 위해서는 여러가지

  요소가 있는데 각 요소들 완성도를 높여 타격감을 극대화시키는데 중점을 둔다.

 

2.    Animation

    2.1 공격 동작

        2.1.1 무기에 따른 적절한 동작

                ·무기의 종류에 따라 적절한 동작을 해야 한다. , 무기가 칼이냐 도끼냐에 따라 공격 애니메이션이 틀려야 한다.

 

        2.1.2 중량감 표현

                ·같은 무기더라도 어떤 타입이냐에 따라 그 무게가 달라진다. 단검처럼 가벼운 무기는 움직임도 가벼워야 하고 양손 무기처럼 무거운 무기는 

                   움직임에 무게감이 느껴져야 한다. 즉 무게의 차이는 공격속도와 밀접한 관계를 가진다.

 

        2.1.3 속도의 완급 조절

                ·공격을 할때에는 단순히 휘두르기만 하지 않는다. 2.1.2 중량감 표현에서도 설명했듯이 각 무기별로 무게가 다르기때문에 공격 준비동작이나

                    공격시 동작이 각각 다른 속도및 다른 가속도를 가지고 있다.  

                    단검의 경우 무게가 가볍기 때문에 준비동작 자체가 굉장히 짧고, 공격속도로 일정하며, 양손검이나 양손둔기같이 무거운 무기류는 무거운 무게 

                    때문에 준비동작이 긴 반면 가속도는 점점 빨라지게 된다. 

 

    2.2  피격 동작

             ·가장 이상적인 피해 동작은 모든 공격에 대해 대응하는 동작이 있는 것이다. 하지만 그러기엔 게임제작상 리소스가 너무 많이 필요하니 타입에

                따라 몇가지로 축소한다. 보통 2종에서 4종(단순피격, 크리티컬피격, 스턴, 넉백)으로 줄여서 표현하는 경우가 많다.

 

        2.2.1 방향

             · 왼쪽, 오른쪽, 중앙, 후면에서 힘이 가해졌다는 느낌이 들도록 각각의 피격 동작을 만든다.(이 또한 리소스 제약상 줄여서 표현하는 경우가 많다.)

             · 중앙인 경우는 찌르기 공격이나 원거리 공격에 대한 피해 동작으로 맞춰 만든다.

 

        2.2.2 데미지 세기

             · 크리티컬 데미지나 특정 스킬 공격을 받았을 경우에는 뒤로 날라가서 넘어지는 동작(넉백)을 만든다.

 

   3. 프레임 정지

        · 주로 대전 격투류 게임에서 많이 표현되는 표현방법. 타격시 일정프레임을 정지시킨후  다시 그 다음 애니메이션시 정지된 프레임시간부터 나머지

               애니메이션 시간만큼을 빠르게 돌리는 방법. 잠깐의 프레임동안 정지되어 있어서 타격이나 피격에 대한 인지가 강하게 되며, 후에 정지되어 까먹은

               프레임만큼 빨리 돌리더라도 시각적으로는 빠르다고 인지하기가 어렵다. (물론 정지시간이 많으면 인지가 됨 ^^)

 

3.    이펙트

    3.1. 궤적(Trail)

         · 실제 세계에서 칼의 움직임은 연속적이지만 게임에서 칼의 움직임은 비연속적인 칼의 위치들을 나타내는 프레임들을 모아놓은 것이다. 따라서 빠른

             공격 애니메이션의 경우 칼이 움직임이나 어떤 부위를 공격하고 있는지 알아내기란 쉽지 않다. 특히 게임플레이시 FrameRate(초당 프레임수)

             에도 많은 영향을 받는다. 다음과 같은 궤적 효과를 사용함으로써 칼의 움직임이나 공격의 영향이 미치는 범위를 보여준다.

         · 궤적을 나타내는 방법에는 메쉬, 파티클, 왜곡효과및 혼합하여 사용경우도 많다. 

 

 


 

       3.2 파티클(Particle)

               · 대부분의 이펙트에 적용되는데 마법류표현에서 더 많이 쓰인다. 

 

[공격의 방향을 나타내기 위한 2D 파티클 - 피표현- ]

 

 


 


 

 [공격 이펙트]

 

 

         3.3 광원[Light)

                 · 적을 가격하거나 피격 당하는 순간 캐릭터의 타격 지점 & 지형에 광원을 표현 함으로서 타격감을 증진시키는데 중요한 역할을 한다.

                      타격감을 표현하는데 있어서 필수적인 요소중 하나다. 하지만 광원표현은 실시간 계산이 이루어져야 하는만큼 게임 플레이시 상당한

                      포퍼먼스를 요구한다. 고사양을 지향하는 게임이면 모를까 저사양을 고려한 게임이라고 한다면 표현의 한계를 가진다.


 

        3.4 위치

             · 타격 이펙트중 피격자의 몸에서 나타나는 이펙트의 위치는 무기와 피격자가 부딪히는 부분에서 터지게 한다. 이때 그 위치를 계산하기

                 어렵다면 공격 종류에 따라 그 위치를 미리 정해놓는다.

 

        3.5 타이밍

             · 타이밍을 맞추는데는 두 가지 방법 프레임 체크와 시간 체크가 있다.(개발사마다 기준이 다르다.) 

             · 그러나 프레임 체크 방식이 시간 체크 방식보다 정교 하므로 가능한한 프레임 체크 방식(1초=30프레임)으로 한다.

             · 현재 설명중인 모든 요소들이 이 타이밍이 서로 맞지 않으면 어떠한 타격감도 얻을수 없다. 타격위치, 시간, 반응등 모든것이 각기 적절한

                  타이밍 속에서 빛을 발한다.

 

           3.5.1 프레임 체크

                 · 보통 Collision Box를 이용하여 무기가 피격체에 닿았을때 자동으로 필요 이펙트를 표현해 주기도 하지만 이는 플레이시 항상 계산을

                      하고 있어야 하기 때문에 많은 퍼포먼스를 요구한다. 그리하여 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가

                      적에게 닿는 프레임이라고 하면 그 순간 이펙트를 터트려 주는 방식으로 하여 퍼포먼스를 줄이기도 한다.   

           3.5.2 시간 체크

                 · 프레임 체크방식과 개념은 같다. 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가 적에게 닿는 프레임이라고

                      하면 1 프레임에서 15 프레임까지의 사간을 계산해서 0.7초라고 한다면 애니메이션이 시작 한 후 0.7초가 지난 다음에 이펙트를 터트려

                      주도록 한다.

 

4. Sound Effect

 · 사운드 효과는 타격감을 살리는데 매우 중요한 역할을 하는데 공격자의 무기 종류와 피격자의 보호구에 따라 그 효과음이 달라져야 한다.

 

 

5. 카메라

    5.1 카메라 흔들기(Camera Shake) 

          · 짧은 시간안에 화면을 랜덤하게 흔들어 주는 방법인데 강력한 공격(크리티컬 데미지)이나 폭발을 일으키는 공격시에 이용한다.

              보통 영화나 미디어의 연출시 많이 사용하는 방식이었으나 게임산업이 발전함에 연출을 강조하는 추세이니 만큼 Camera Shake표현

              또한 많이 해주고 있다. (CameraShake에 대해서는 따로 게시예정)

 

    5.2 카메라 전환(Camera Move)

         · 무기의 중량감이나 강력함, 공격 방향등 공격 효과를 좀 더 극대화 시키기 위한 방법이다.

         · 거대한 검을 수평 방향 왼쪽으로 휘드르게 될 때 그 검이 적에게 맞는 순간 카메라를 왼쪽으로 약간 이동시킨다. 위로 솟구쳐 올리는

             공격일 경우에는 카메라를 위로, 수직 방향으로 내려치는 공격일 경우에는 카메라를 아래로 약간 이동시킨다.

 

6. 동기화(Sync)

        · 위에서 설명한 타이밍과 유사하다고 할수 있다. 하지만 위의 타이밍은 각각의 동기화라고 한다면 현재 설명하는 동기화는 연출전체의

             타이밍이라고 보면 이해가 빠를것이다. 예를 들어 A라는 캐릭터 B라는 몬스터를 공격하는데 A가 공격이 끝나기도 전에 몬스터가

             맞는 동작을 취한다거나 A가 공격 했는데도 불구하고 한 템포 느리게 반응한다면 타격감을 느끼기 힘들다.

        · , 액션이 취해지면 그에 따른 피드백의 타이밍이 적절해야 한다. 이를 위해서는 클라이언트쪽에서의 어느 정도의 연출이 필요하다.

             예를 들어 A B를 때리는 동작에 들어갈 때 서버에 공격 메시지 패킷을 보내면 서버에서는 B가 입는 데미지를 계산하여 클라이언트에

             보내주는데 이때 A의 공격 동작이 다 끝나기도 전에 데미지 패킷이 도착한다면 클라이언트는 데미지를 바로 적용시키는게 아니라 이걸 보관

             하고 있다가 A의 공격 동작에 맞춰서 이펙트와 함께 B는 맞는 동작을 취하며 에너지가 깎이는 식이다.

 

7.    기타

    7.1 데미지 표현

        · 데미지를 입거나 입혔을 때 얼마만큼의 데미지를 입혔는지를 알려주는데 데미지 수치 또한 연출이 필요하다.

            (UI 연출 이펙트로 명명하는 경우가 많다.) 

        ·애니메이션이나 이펙트는 임펙트있게 표현되는데 실제 데미지 수치는 밋밋하게 그냥 뜬다면 좀 뭔가 부족하지 않은가?

     7.2 반전 (Invert)

        · 타격이나 피격시 좀 더 명확하게 인지 하기 위하여 인위적으로 캐릭터나 배경전체의 색을 반전시키는 기법을 말한다.

 

[캐릭터 반전기법의 예]

    7.3 배경블랜딩

       · 이펙트는 주로 어두운 배경에서 그 화려함이 가중된다. 하지만 밝은 캐주얼느낌의 게임이나 한낮의 밝은 필드에서 전투시 이펙트를 화려하게 표현한다

             해도 하얗게 색이 발해버리는 경우를 본적이 있을것이라 생각한다. 이와 같은 경우를 줄이기 위해서 일부러 마법사 같은 법사캐릭의 경우 스킬

             시전시 자신의 캐릭터나 피격되는 캐릭을 제외한 나머지 요소에 대해 일시적으로 어둡게 톤을 낮추어 이펙트 표현 뿐만아니라 시각적으로 집중도를

             높혀 타격감을 배가 시키는 방법이다.

 

타격감에 대해 글을 써보려 했는데 마침 천몽님의 글을 발견하여 더 쉽게 글을 쓸수 있었던듯 하다.

이펙터라면 이런 타격감의 종류와 표현 방식에대해 어느 디자인 파트보다 더 자세히 알고 있어야 한다고 생각한다.

추후 이 타격감요소에 대해 각각 상세 예시를 올려보겠습니다. 

'Tip & Tech' 카테고리의 다른 글

DLL 사용한다면 참고하세요  (0) 2011.04.19
미들웨어 정리  (0) 2011.04.13
타격감 향상을 위한 방법론  (0) 2011.03.17
예외 처리 ~~ tip  (0) 2011.02.08
디버깅 메세지 출력 매크로 수정판  (0) 2011.01.31
GPG 명예의 전당.베스트 오브 베스트  (0) 2011.01.21
Posted by blueasa

댓글을 달아 주세요

이펙트 출력

Gamebryo/Effect / 2011.02.08 17:03

이펙트 애니메이션이 종료되는 시점(이펙트 애니메이션 시간)을 알아야한다.
아래 함수는 이펙트 애니메이션 길이(시간)을 알아내는 함수이다.

//////////////////////////////////////////////////////////////////////////////
<이펙트 출력 순서>
1. 이펙트를 로딩한다.
2. 아래 함수를 통해 애니메이션 길이(m_fAnimLength)을 구한다.
3. 이펙트 애니메이션 시작 시간을 정한다.
    NiTimeController::StartAnimations( m_spEffect, m_fStartTime );
4. 이펙트 종료를 체크한다.
    if( fTime - m_fStartTime >= m_fAnimLength )
        m_spEffect = 0;   // 이펙트 노드 제거
    else
        m_spEffect->Update( fTime );
//////////////////////////////////////////////////////////////////////////////

void RecursiveGetAnimRange(NiAVObject* pkObject, float& rfLoKeyTime, float& rfHiKeyTime)
{
    NiTimeController* pkController = pkObject->GetControllers();
    while ( pkController )
    {
        float fLoTime = pkController->GetBeginKeyTime();
        float fHiTime = pkController->GetEndKeyTime();
        if ( fLoTime < rfLoKeyTime )
            rfLoKeyTime = fLoTime;
        if ( fHiTime > rfHiKeyTime )
            rfHiKeyTime = fHiTime;

        pkController->SetAnimType( NiTimeController::APP_INIT );
        pkController = pkController->GetNext();
    }

    // Do the same for any animation controllers attached to the rendering properties
    if ( NiIsKindOf( NiAVObject, pkObject ) )
    {
        NiAVObject* pAVObj = (NiAVObject*)pkObject;
        pAVObj->SetSelectiveUpdate(true);
        pAVObj->SetSelectiveUpdateTransforms(true);
        pAVObj->SetSelectiveUpdatePropertyControllers(true);
        pAVObj->SetSelectiveUpdateRigid(false);

        NiTListIterator kPos = pAVObj->GetPropertyList().GetHeadPos();
        while ( kPos )
        {
            NiProperty *pProp = pAVObj->GetPropertyList().GetNext( kPos );
            if ( pProp )
            {
                for ( pkController = pProp->GetControllers(); pkController; pkController = pkController->GetNext() )
                {
                    float fLoTime = pkController->GetBeginKeyTime();
                    float fHiTime = pkController->GetEndKeyTime();
                    if ( fLoTime < rfLoKeyTime )
                        rfLoKeyTime = fLoTime;
                    if ( fHiTime > rfHiKeyTime )
                        rfHiKeyTime = fHiTime;

                    pkController->SetAnimType( NiTimeController::APP_INIT );
                }
            }
        }

    }

    if ( NiIsKindOf( NiNode, pkObject ) )
    {
        NiNode* pkNode = (NiNode*)pkObject;
        for ( unsigned int i = 0; i < pkNode->GetArrayCount(); ++i )
        {
            NiAVObject* pkChild = pkNode->GetAt( i );
            if ( pkChild )
                RecursiveGetAnimRange( pkChild, rfLoKeyTime, rfHiKeyTime );
        }
    }
}


------------------------------------------------------------------
ex)
    float fLoTime =  NI_INFINITY;
    float fHiTime = -NI_INFINITY;
    RecursiveGetAnimRange( m_spModel, fLoTime, fHiTime );
    m_fAnimLength = fHiTime - fLoTime;    // 애니메이션 전체 시간 계산

[출처] GameBryo - 이펙트 출력|작성자 모냐

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa

댓글을 달아 주세요