유니티 강좌라니!! 이게 얼마만 인것일까요???

으으..... 제가 최근 제작하던 게임 아실 것이라고 믿습니다.

그 게임에 버그가 많이  생겨버려서..... 흐으윽.....

는 한동안 이것만 할 것 같군요!


아무튼 이제 작성을 하도록 하겠습니다.

그러면 먼저 UI라는 것을 알아야 합니다.

UI라는 것이 무엇일까요??? 

그것은 간단합니다.

게임을 보다 더 게임답게 만들어주는 화면을 가득 채워주는 그런 것들입니다.


게임을 하다가 esc를 누르게 되면 환경설정 메뉴로 들어갈 수 있는 창이 뜨는데 그것도 UI라고 할 수 있을지도 모르겠습니다.


그럼 UnityGUI를 알아보도록 하겠습니다.

이것은 스크립트 기반으로 GUI를 구현하는 것입니다.

이 기능을 이용해서 버튼, 문자, 텍스처를 게임 화면에 그릴수 있게 됩니다.

UnityGUI의 스크립트는 전용 이벤트 함수인 OnGUI로 실행하도록 작성을 합니다.

OnGUI외의 이벤트 함수에선 반영되지 않으니 주의해 주시길 바랍니다.


텍스트나 이미지 배치(레이아웃), 그리기, 입력을 할 때 이벤트 처리등은 모두 OnGUI()의 안에 넣습니다.

다음은 화면에 문자와 버튼을 표시하는 예제 코드입니다.

using UnityEngine;

using System.Collections;

public class SampleGui : MonoBehaviour

{

void OnGUI()

{

GUI.Label (new Rect(10, 10, 100, 40), "Label");


if (GUI.Button(new Rect(10, 50, 100, 50), "Button"))

{

Debug.Log("Push Button");

}

}

}

그럼 이제 예제 코드를 실행하면 'Label'문자와 [Button] 버튼이 표시가 됩니다.

GUI.Label()은 화면에 텍스트와 이미지를, GUI.Button()은 화면에 버튼을 표시하고 그것을 누르게 되면 true를 반환하게 합니다.

그러면 버튼을 누르게 되었을 때에 if문이 실행! 그리고는 Debug.Log()를 표시합니다.

+ Rect클래스를 사용하면 위치와 표시 범위를 설정할 수 있습니다!

+ 그뒤에 " "로 오는 것은 작성될 문자열입니다!


----------------------------------------------------------------------------------------------


그러면 이제 UnityGUI컨트롤을 해보도록합시다!


라벨이나 버튼 말고도 다양한 UI 부품이 준비가 되어있습니다.

유니티에서는 이 UI부품을 컨트롤이라고 한답니다.

각 컨트롤과 예제 코드를 설명 들어가겠습니다.


_ Label / Box _

Label과 Box를 하나로 묶었는데요 그냥 간단합니다.

아까 Label을 체험해 보셨을 것이라고 저는 생각합니다.

그러면 이제 설명을 드리자면 Box는 Label에서 Button처럼 틀이 생기는 것 입니다...

(되게 적당한 설명....????)

아무튼 그런 겁니다.

+ 텍스트와 텍스쳐를 같이 표시할 때는 GUIContent 클래스로 모아서 지정할 수 있습다. 이건 모든 것들에게 해당이 됩니다. 그냥 보면 알아요


public Texture texture;


void OnGUI()

{

GUI.Label(new Rect(10, 10, 50, 50), "Label");

GUI.Label(new Rect(10, 70, 50, 50), texture);

GUI.Label(new Rect(10, 130, 100, 50), new GUIContent("Label", texture));


GUI.Box(new Rect(100, 10, 50, 50),"Box");

GUI.Box(new Rect(100, 70, 50, 50), textrue);

GUI.Box(new Rect(100, 130, 100, 50), new GUIContent("Box", texture));

}


----------------------------------------------------------------------------------------------


_ Button / RepeatButton _

뭐.... Button은 아실 겁니다.

아까 만져봐서....

그러면 이제 무엇이 문제인가???

RepeatButton이 문제인데요 이것은 누르고 있는 동안이 셋팅이 됩니다.

Button은 누르면 true가 반환이 되었죠?

RepeatButton은 누르고 있는 동안입니다.


public Texture texture;


void OnGUI()

{

if(GUI.Button(new Rect(10, 10, 50, 50), "Button"))

{

Debug.Log("Push Button 1");

}

if(GUI.Button(new Rect(10, 70, 50, 50), texture))

{

Debug.Log("Push Button 2");

}

if(GUI.Button(new Rect(10, 130, 100, 50), new GUIContent("Button", texture)))

{

Debug.Log("Push Button 3");

}

if(GUI.RepeatButton(new Rect(160, 10, 100, 50), "RepeatButton"))

{

DeBug.Log("Push RepeatButton 1");

}

if(GUI.RepeatButton(new Rect(160, 70, 100, 50), texture))

{

Debug.Log("Push RepeatButton 2");

}

if(GUI.RepeatButton(new Rect(160, 130, 150, 50), new GUIContent("RepeatButton", texture)))

{

Debug.Log("Push RepeatButton 3");

}

}


----------------------------------------------------------------------------------------------


_ TextField / TextArea / PasswordField _

TextField는 한 줄짜리 텍스트 입력란을 표시합니다.

인수에는 입력란에 표시할 텍스트를 지정합니다.

반환값으로 항상 입력란의 문자열을 돌려줍닏니다.

입력되어 도돌아온 텍스트를 다음 프레임에서 텍스트 입력란에 반영시키려고 인수로 지정하는 string 변수와 반환값을 받아들이는 string변수를 똑같이 했습니다.


TextArea는 여러 행으로 된 텍스트 입력란입니다.


PasswordField는 표시할 문자열을 지정한 문자로 모두 치환해서 표시합니다.

암호를 입력할 때 사용합니다.


string textFieldText = "TextField";

string textAreaText = "TextArea";

string passwordFieldText = "PasswordField";

char maskChar = '*';


void OnGUI()

{

textFieldText = GUI.TextField(new Rect(10, 10, 100, 30), textFieldText);

textAreaText = GUI.TextArea(new Rect(10, 50, 100, 80), textAreaText);

passwordFieldText = GUI.PasswordField(new Rect(10, 140, 100, 30), passwordFieldText, maskChar);

}


----------------------------------------------------------------------------------------------


_ Toggle / Toolbar / SelectionGrid _

Toggle은 On / Off 체크박스가 딸린 Label을 표시합니다. 인수로 선택 상태를 지정할 수 있습니다.

반환값은 현재 상태를 반환!


Toolbar는 버튼 여러 개를 하나의 행에 가로로 표시합니다.

버튼 여러 개 중에서 항상 버튼 하나를 선택한 버튼 그룹입니다. 

표시할 내용을 인수로 지정할 때 string 배열이면 텍스트, Texture배열이면 이미지, GUIContent 배열이면 텍스트와 Texture가 혼합된 버튼을 입니다.

반환값은 선택된 버튼의 인덱스가 됩니다.


SelectionGrid는 옆으로 나열할 버튼 수를 지정해서 버튼 여러 개의 열로 표시합니다.

그 밖의 동작은 Toolbar와 같습니다.


bool toggleValue = ture;


int toolbarSelected = 0;

string[] toolbarTexts = {"Toolbar 1", "Toolbar 2", "Toolbar 3"};

int gridSelected = 0;

string[] gridTexts = {"Grid 1", "Grid 2", "Grid 3", "Grid 4", "Grid 5"};

int gridXCount = 3;


void OnGUI()

{

toggleValue = GUI.Toggle(new Rect(10, 10, 100, 30), toggleValue, "Toggle");

toolbarSelected = GUI.Toolbar(new Rect(10, 50, 200, 80), toolbarSelected, toolbarTexts);

gridSelected = GUI.SelectionGrid(new Rect(10, 140, 200, 80), gridSelected, gridTexts, gridXCount);

}


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

플레이어는 움직이는데 적군은 그대로라면....?

매우 이상한 상황이 연출되는 군요!

어느 누가 근육을 사용하지 않고 그렇게 활동을 합니까??

관절과 근육을 사용하지요!

그래서 일단 적군도 일일이 설정을 해야합니다.

노가다가 예상되는 군요.....흐음....


그러면 먼저 차이점을 알아야 겠군요!

늑대와 드래곤은 인간이 아닙니다.

그러니 휴머노이드는 아니군요! 그래서 Generic이 됩니다.

휴머노이드에서만 가능한 것은 사용하지 못하겠군요!

하지만 상관없습니다!

스테이트 관리만 하면 되는 것이거든요!


플레이어는 대기, 이동, 공격, 쓰러짐이 있었습니다.

하지만 늑대와 드래곤은 HP가 0이 된다면 그자리에서 사라지게 해야겠습니다.

저는 모아서 설명을 하지만!

따로 설정해 주세요!

혼동이... 왜 책에서 따로하라는지 모르다갘ㅋㅋㅋ


아무튼 시작하겠습니다!!!

---------------------------------------------------------------

그럼 이제 다시 애니메이션 데이터를 설정합시다.

Inspector에서 Rig 탭란의 Animation Type이 Generic으로 설정되어 있는지 확인합니다.

이 작업은 모델 데이터와 애니메이션 데이터 모두 확인을 합니다.

---------------------------------------------------------------

애니메이션 클립 설정은 작성을 하겠지만 이벤트 설정은 준비한 Animation에 따라 다르기 때문에 작성을 하지 않도록 하겠습니다.

그리고 다시 확인을 해보니 건들이는 항목이 없었던 것으로 기억을 합니다.

그러면 뭐..... AnimatorController 작성이네요??

백문이불여일견!!

위 사진처럼 AnimatorController를 Create에서 만든뒤에 이름을

늑대는 'WargAnimatorController'로

드래곤은 'DragonAnimatorController'로 설정합니다.

이름을 변경한 AnimatorController는 Animator뷰로 표시 합니다.

---------------------------------------------------------------

AnimatorController에 애니메이션 데이터를 드래그앤 드롭으로 꺼냅니다.

늑대와 드래곤의 혼동을 주의하세요

Stay를 디폴트 스테이트( 주황색 )으로 만들어 줍니다.

---------------------------------------------------------------

그리고 파라미터를 설정합니다.

캐릭터와 비슷한 방법으로 Float형 'Speed' / Bool형 'Attacking' / Trigger형 'Down'을 설정합니다.

Down을 만드는 이유는 스크립트를 재활용 하기 위해서 만들어 줍니다.

뭐... 사용안하면 그만이지요

---------------------------------------------------------------

그리고는 애니메이션 전환을 확인합니다.

그럼 이제 적용을 합니다!

하지만! 먼저 우리는 알아야 할 것이 있습니다!

Prefabs에서 각각 애니메이션이 존재하는 모든 Prefab에 AnimatorController를 설정합니다. ( Animator 컴포넌트 )

아마도.... 각각의 이름으로 되어 있으니 잘 적용하리라고 믿습니다.

그리고는 Animator 컴포넌트에 있는 Apply Root Motion의 체크는 해제합니다.

또 CharaAnimation스크립트를 추가합니다.

---------------------------------------------------------------

이제는 재생 버튼으로 잘 되었나 확인 합니다......

잘 되리라고 믿고 저는 이만!! 빠지도록 하겠습니다.

다음은 공격에 관하여 알아보도록 하겠습니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

스크립트를 이용하여 Animatorcontroller의 Parameters로 설정한 파라미터로 스테이트를 전환합니다.

그럼 이제 전환하는 스크립트를 준비합니다!

using UnityEngine;

public class CharaAnimation : MonoBehaviour

{

Animator animator;

CharacterStatus status;

Vector3 prePosition;

bool isDown = false;

bool attacked = false;

public bool IsAttacked()

{

return attacked;

}

void StartAttackHit()

{

Debug.Log("StartAttackHit");

}

void EndAttackHit()

{

Debug.Log ("EndAttackHit");

}

void EndAttack()

{

attacked = true;

}

void Start ()

{

animator = GetComponent<Animator>();
status = GetComponent<CharacterStatus>();
  
prePosition = transform.position;

}

void Update ()

{

Vector3 delta_position = transform.position - prePosition;
animator.SetFloat("Speed", delta_position.magnitude / Time.deltaTime);
  
if(attacked && !status.attacking)

{

attacked = false;

}

animator.SetBool("Attacking", (!attacked && status.attacking));

if(!isDown && status.died)

{

isDown = true;
animator.SetTrigger("Down");

}

prePosition = transform.position;

}

}

이렇게 셋팅합니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

이번에는 Animator에 관한 설정들을 배우도록 하겠습니다.

앞에 게시글처럼 끊어서 하지 않고 한번에 처리를 할 예정이니 그점은 알아주시기를 바랍니다.

---------------------------------------------------------------

모델의 애니메이션 처리는 Animator 컴포넌트에서 처리를 합니다.

이 컴포넌트가 애니메이션을 제어하는 데 필요한 데이터를 Animator Controller라 하는데

이것은 재생할 애니메이션, 애니메이션끼리 전환 관계, 애니메이션 전환조건이 저장됩니다.

---------------------------------------------------------------

그렇다면 편집은 어떻게 해야 할까요??

간단합니다.

Window메뉴에서 Animator를 선택하면 Animator 뷰가 표시가 됩니다.

일단 위 사진은 제가 먼저 작업을 하면서 만들어둔 모양인데.... 신경은 쓰시지 마시고 일단 합시다.


---------------------------------------------------------------


그러면 이제 플레이어에게 부여할 애니메이션을 설정합시다.

Animator Controller를 말이죠

Project 브라우저에서 Assets/Animations 경로를 들어갑니다. ( 없으면 만들기! )

폴더에서 Create 버튼으로 Animator Controller를 선택합니다.

'New Animator Controller'가 생성이 되면 'PlayerAnimatorController'로 이름을 변경합니다.


그리고 Animator뷰에 표시를 합니다.


당연히 첨엔 Any State만 표시되어 있습니다. ( 는 개뿔 책아 구라 작작좀.... 실은 Entry도 있습니다. ) 

책에서는 Alt키와 좌클릭을 이용하여 화면을 이동한다고 하는데..... 그냥 귀찮으니 휠을 누른 상태에서 이동을 합시다.


---------------------------------------------------------------


추가 State를 생성해야 하겠지요??

그러면 이제 Project에 있는 Player@____를 전부 불러옵니다.

드래그 앤 드롭으로 말이죠.

그럼 이제 기본 값을 설정해야 하겠죠??

그런데 이미 Stay를 먼저 꺼내셨기를 빌며 그러셨다면 아마 Stay가 기본 값입니다.

아닌 분들은 

---------------------------------------------------------------

그러면 이제 애니메이션 전환 피라미터가 필요합니다.

위 사진 처럼 만듭니다!

Float형을 추가하고 이름은 Speed로 설정합니다.

Bool형을 추가하고 이름은 Attacking으로 설정합니다.

Trigger형으로 추가후에 이름을 Down으로 설정합니다.

그러면 이제 Bool과 Trigger가 무엇이 다른지 모를지도 모르니 설명을 해야겠습니다.

Bool은 True값과 false값을 전환합니다만, Trigger는 전환되는 순간 false값으로 변경됩니다.

간단하게 말하면 스위치랑 조건부 형식이지요

---------------------------------------------------------------

이제는 전환 조건을 만들어야 겠죠???

그럼 이게 무엇을 하는 것이냐??

처음에 올린?? 사진에 화살표 같은 것들이 막!! 복잡하게!! 설정이 되어 있었습니다.

그것을 하는 것인데요!

이렇게 만든 화살표를 가볍게 클릭을 해준다면!

Inspector에 화살표의 파라미터를 편집할 수 있습니다.

그냥 간단하게 이런 느낌입니다.

Inspector에 표시된 트랜지션의 파라미터 내에 있는 Conditions에서 스테이트 간 전환 조건을 지정합니다.

당연히 설정한 파라미터는 클릭으로 선택하는 것이겠죠?

위 사진은 Conditions를 확대한 것인데요

+와 -로 추가또는 삭제가 가능합니다.

---------------------------------------------------------------

그러면 

이 화면 내에 있는 모든 화살표의 설정을 보도록 하겠습니다.

---------------------------------------------------------------

그러면 이제 애니메이션 전환을 직접 확인을 하시면 됩니다!


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

이번에는 공격에 관한 이벤트를 설정합니다.

- 무기로 공격이 시작된 타이밍에 적과 무기의 타격 판정을 시작하는 이벤트 함수

- 무기로 공격이 끝나는 타이밍에 적과 무기의 타격 판정을 종료하는 이벤트 함수

- 무기를 휘두른 후 다음 행동으로 전환 할 수 있는 상태를 알려 주는 이벤트 함수

이렇게 입니다.

그럼 이제 사진을 통해서 알아보도록 합시다.


1. Project 브라우저에서 Assets / 3D Assets / Player / Player@Attack을 선택해서 Inspector를 봅니다.

2. Inspector에서 Animations 탭을 클릭합니다.

3. 이벤트 추가 버튼으로 사진을 참고해 설정합니다.

공격이 시작되는 부분

공격이 끝나는 부분

공격 모션이 완전히 끝나가서 처음이랑 포즈가 처음으로 같은 부분


이렇게 설정을 합니다.


모든 설정을 맞추면 Apply를 눌러서 설정을 종료합니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

애니메이션 클립을 재생할 때에 특정 타이밍에 루트 게임 오브젝트에 설치한 스크립트의 이벤트 함수를 호출합니다.

애니메이션 이벤트는 Inspector엥서 애니메이션 클립을 편집할 때 표시되는 Events 속성에서 설정 가능합니다.

Events의 타임라인은 0~100이며 애니메이션 클립의 재생 위치를 나타냅니다.


뭔가 추가하는 듯한 그런 저 버튼을 누르면 애니메이션 라벨을 추가할 수 있습니다.

타임라인 위에서 추가된 라벨을 마우스로 드래그해 이동시키면 애니메이션 이벤트의 시작 타이밍을 변경가능 합니다.

라벨을 선택한 후에 Delete키를 누르게 된다면 삭제가 됩니다.

애니메이션 이벤트에서 라벨을 선택하면 Edit Animation Event 대화창이 나타난다고 합니다.

애니메이션 이벤트가 호출하는 함수 이름을 Function에 입력합니다.

애니메이션을 재생하는 컴포넌트와 같은 오브젝트에 추가된 스크립트만 호출할 수 있다는 점!!!

float / int / String / objecct는 이벤트 함수에 전달하는 값입니다.

- 애니메이션 이벤트용 이벤트 함수의 인수에는 0또는 1만 설정 가능합니다.

- 호출하려는 함수 이름이 Hoge일 때 스크립트에 작성가능 한 함수는

- void Hoge()

- void Hoge( float f )

- void Hoge( int i )

- void Hoge( string s )

- void Hoge( UnityEngine.Object o )

- 하지만 인수가 두 개인 경우 오류를 불러옵니다.

- 같은 스크립트 안에 같은 이름의 함수가 있는데 인수가 서로 다를 때는 먼저 만든 함수만 호출합니다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

애니메이션 클립을 설정합니다.

Player@Stay와 Player@Run을 먼저 설정하도록 하겠습니다.

각각을 이렇게 설정을 합시다

그리고 Apply를 눌러줍니다.

그 다음으로는 Player@Attack과 Player@Down을 이렇게 설정합니다.

이렇게 해서 일단 셋팅은 마치도록 하겠습니다??

셋팅은 일단 이런 식으로 하는 겁니다하고 알려드렸습니다.

이것을 참고해서 만들어 보시기를 바랍니다^^

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

캐릭터 애니메이션의 내용은 이렇습니다.

- 대기, 이동, 공격, 쓰러지는 연출

- 대기 중, 이동 중, 공격 중이라도 생명이 0이라면 쓰러집니다.

- 공격 중엔 검을 휘두르고 있을 때만 적과 무기 타격 판정이 유효합니다.


Unity엔 인간형 모델을 Humanoid라고 합니다.

캐릭터는 인간형이기에 앞서 설명한 것처럼 이 모델에 애니메이션 대상 변경 기능을 사용할 수 있습니다.


Project란에 미리 임포트를 시켜 놓은 모델 데이터를 선택합니다.

하지만 저는 제가 독학을 하고 있는 책자에서 샘플을 제공하여 주었습니다.

그러고 나면 Inspector에 'Player Import Settings'라는 것이 표시 됩니다.

그때 Rig라는 것을 누른 후에 인간형이라면 Animation Type을 Humanoid로 설정합니다.

Apply를 눌러 설정을 저장을 한다면 아래와 같이 체크 표시가 생길 겁니다.

그러면 이제 Animation Type에 Humanoid말고 다른 것은 무엇이 존재 하는지 그것을 알아보겠습니다.

- None : 애니메이션을 사용하지 않는 모델

- Generic : Humanoid가 적용되지 않는 모델

ex) 케르베로스, 드래곤

- Legacy : Unity 3.x 이전 버전의 애니메이션 시스템과 호환을 위한 설정

- Humanoid : 인간형 모델

ex) 오우거, 엘프, 인간

---------------------------------------------------------------

애니메이션 데이터를 설정할 차례입니다.

이번 게시글은 꽤 길게 진행할 생각입니다!!!


그럼 다시 본론으로 돌아와서

아까도 말을 하였듯이 제가 유니티 3D를 배울 때 사용하는 책자에서는 저에게 모션을 제공해 주었습니다.

대기 모션 / 이동 모션 / 공격 모션 / 쓰러지는 모션을 제공 받았습니다 (원래는 책사면 줍니다.....)

그럼 다시 설명을 하겠습니다.

일단 Project에 미리 임포트한 애니메이션 데이터를 선택합니다.

그러면 Inspector에 Player Import Settings가 다시 표시가 됩니다.

그리고 이번에도 Rig를 눌러서 Rig화면으로 변경 해줍니다.

그리고 Animation Type을 Humanoid로 설정합니다.

다시 Apply버튼을 눌러줍니다.


그리고 이 작업을 모든 인간형 모델의 애니메이션 데이터에 설정합니다.

---------------------------------------------------------------

이제는 앞서서 임포트한 애니메이션 데이터를 유니티에서 이용하기 위해 애니메이션 클립 파일로 만들어야 한답니다.

(먼데 이리 귀찮은데??)혼자 만들면 해야할게 너무 많잖아

Animation Clip(애니메이션 클립)은 임포트한 애니메이션 데이터에서 실제로 이용할 데이터만 뽑아서 유니티에서 사용하기 쉽게 조정한 데이터를 말합니다.


그럼 이제 본방입니다.

Project 브라우저에서 애니메이션 데이터를 하나 선택하고 나서 Inspector의 Animations 탭을 클릭합니다.

그럼 애니메이션 클립 설정화면이 나타납니다.

Clips에선 애니메이션 데이터를 추출하는 시간을 조절합니다.

그리고 FBX 애니메이션 데이터 하나에 애니메이션 여러 개를 모았다가 유니티에서 나누는 것도 됩니다. (이거는 솔직히 독학이라.... 책에는 쓰여 있는데 중요해 보이고 설명은 어렵고...???)

나머지는 뭐.... 애니메이션 클립의 재생 설정부분 입니다.


위 사진을 가지고 설명을 이어가겠습니다.

Loop Time : 이 속성에 체크하면 애니메이션이 반복 재생 됩니다.

- Loop Pose : 체크시 애니메이션 시작과 끝이 매끄럽습니다.


Root Transform Rotation

- Bake Into Pose : 체크하면 루트 오브젝트의 Transform -> Rotation에 애니메이션 값을 대입하지 않습니다. 회전 제어시 사용합니다.

- Based Upon : 회전의 루트 위치를 설정합니다.

- Original : 애니메이션 데이터를 따릅니다.

- Body Orientation : 상반신 전방을 루트의 Transform에서 Rotation으로 맞춥니다.

- Offset : 회전의 보정값을 설정할 수 있습니다.


Root Transform Position (Y)

- Bake Into Pose : 체크시 루트 오브젝트의 Transform -> Position -> Y에 애니메이션 값을 대입하지 않습니다. 캐릭터의 점프등을 관리할 때 사용합니다.

- Based Upon (at Start) : 수직 방향의 기준이 되는 것을 설정합니다.

- Original : 애니메이션 데이터를 따릅니다.

- Center of Mass : 오브젝트 중심을 루트의 Position -> Y에 맞춥니다.

- Feet : 발 위치에 맞춥니다.

- Offset : Position -> Y의 보정값을 설정할 수 있습니다.


Root Transform Position (XZ)

- Bake Into Pose : 체크시에 루트 오브젝트의 Transform -> Position -> XZ에 애니메이션 값을 대입하지 않습니다. 스크립트 쪽에서 오브젝트의 수평 위치를 제어할 때 이용합니다.

- Based Upon (at Start) : 수평 방향의 기준이 되는 것을 설정합니다.

- Original : 애니메이션 데이터를 따릅니다.

- Center of Mass : 오브젝트 중심을 루트의 Position -> XZ에 맞춥니다.


loop match 아이콘 : 속성 별 loop match 아이콘이 있습니다. 이 아이콘은 애니메이션의 시작과 끝을 연결했을 때 깔끔하게 재생되는지 나타냅니다. 아이콘이 초록이라면 문제가 없습니다. ( 색상 초록 -> 노랑 -> 빨강 이것은 시작과 끝의 포즈가 다른 정도)


Mirror : 애니메이션을 좌우 반전시킬 수 있습니다. 현재 설정값에 따라 어떻게 재생되는진 Inspector 맨 아래에 있는 [Preview]에서 확인할 수 있습니다. [재생] 버튼을 누르거나 타임라인을 조작해 Inspector만으로도 애니메이션을 확인할 수 있습니다. [Preview]오른쪽 위에 있는 슬라이더로 애니메이션 재생 속도를 조절합니다.

그러면 오늘 저는 이만 들어가보도록 하겠습니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

Mecanim(메카님)이란 유니티 4에서 추가가 된 새로운 애니메이션 시스템을 말한다고 합니다.

대표적인 기능으로는 Retargeting(애니메이션 대상 변경) / State Machines(상태 머신)

이렇게 존재합니다.


---------------------------------------------------------------


애니메이션 대상 변경이라는 것은 다양한 3D 모델에서 같은 애니메이션 데이터를 사용할 수 있게하는 기능입니다.

휴머노이드라는 것에 이 기능을 사용할 수 있다고 합니다.

예를 들어 8등신 3D 캐릭터용을 만든 것은 2등신에서도 적용이 된다고 하니 얼마나 편한 것인지를 모르겠네요


---------------------------------------------------------------


상태 머신이라는 것은 애니메이션의 상태 전환을 유니티에서 편집할 수 있는 기능입니다.

애니메이션간 전환 조건 / 블랜딩 설정 등을 시각적으로 확인이 가능합니다.

유니티 실행중에 애니메이션 전환을 디버깅할 수 있는 기능도 지원합니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,