관리 메뉴

도드넷

게임 제작 일지#4 - 유니티 애니메이션 만들기 + 캐릭터 대칭 설정 본문

창고/게임 제작 [시즌2]

게임 제작 일지#4 - 유니티 애니메이션 만들기 + 캐릭터 대칭 설정

도드! 2016. 10. 6. 04:30
반응형




게임 제작 일지#4 - 유니티 애니메이션 만들기!


유닛을 선택하고 이동시킬 수 있으니 애니메이션을 만들차례다.


#1 유니티 애니메이션 만들기


일단 캐릭터를 완벽히 구성해야한다. 중간에 수정할경우 애니메이션 위치등이 망가질수있기 때문이다.


애니메이션은 제작은 정말간단한데 게임 오브젝트를 누른뒤 애니메이션 패널에가서 Create 를 눌러주면된다.


그리고 녹음 버튼이 눌린 상태에서 만들어진 바디파트를 이동하고 돌리고 늘이고 줄여서 애니메이션을 만들면된다.



#2 유니티 아이들 애니메이션


뛰는 애니메이션을 만들기전에 간단한 Idle 애니메이션부터 만들어야한다.


아이들은 보통 단순한 숨쉬는 애니메이션이면 되는데 그냥 몸이 아래로 내려갔다가 위로 올라오게만 해도 된다.


아이들 애니메이션은 3 키프레임 으로 구성된다.


1. 원상태


2. 몸통등 전체적 위치 아래로


3. 원상태




#3 유니티 이동 애니메이션, 달리기 애니메이션


현재 나의 달리기 애니메이션은 대표적 5 키프레임으로 구성된다.

나머지는 유니티 애니메이션 시스템에 의해 부드럽게 구현된다.


1. 앞다리 앞으로올리기 + 뒷다리 뒤로밀기

(트랜시션이 존재하므로 이렇게 뜬금없이 시작해도 된다.)


2. 크로싱

(앞다리와 뒷다리 교차)


3. 앞다리 뒤로밀기 + 뒷다리 앞으로올리기


4. 크로싱

(앞다리와 뒷다리 교차)


5. 앞다리 앞으로올리기 + 뒷다리 뒤로밀기

(원상복귀)


#4 선택시 발바닥에 원 생기게 하기, 스프라이트 활성/비활성


- 3D 원처럼 캐릭터를 감싸게 하는 원을 만들려면 원하나를 반원 두개로 구성해서 한 반원은 소팅오더에 의해 캐릭터 뒤로 넘기고 나머지 하나는 캐릭터 앞으로 넘기면 된다.


스프라이트의 온 오프는 다음 스크립트로 결정한다.


public GameObject This_Ring;

public SpriteRenderer[] This_Rings_SR;


....



This_Ring = transform.FindChild("Selected_Ring").gameObject;

This_Rings_SR = This_Ring.GetComponentsInChildren<SpriteRenderer>();



        if (Selected)
        {
            This_Rings_SR[0].enabled = true;
            This_Rings_SR[1].enabled = true;
        }
        else
        {
            This_Rings_SR[0].enabled = false;
            This_Rings_SR[1].enabled = false;
        }



원을 표시/비표시 하기위해 컨트롤 해야할 스프라이트 랜더러가 2개 이상이므로 배열을 정의하고

두 반원을 포함하는 게임오브젝트를 찾아서 그 안에 존재하는 스프라이트 랜더러들을 모두 찾아서 배열에 저장하고


어짜피 2개니까 0번, 1번 스프라이트 랜더러의 변수 enabled 을 참,거짓 설정해서 스프라이트 끄고 킨다/



#5 플레이어 소유의 유닛 그리고 팀


- 유닛을 팀과 플레이어 별로 관리하기 위해서 플레이어 컨트롤러와

유닛 정보에 각각 팀 번호 / 플레이어 번호를 할당했다.


유닛 클릭시 플레이어 번호가 일치하면 (명령을 위한) 선택이 가능하고

일치하지 아닐경우 그냥 선택만하게 된다. (정보표시만)


팀번호는 자신과 다를경우 적으로 간주하게된다.

만약 자신의 소유이지만 팀이 다르면 어떻게 될까?


그럼 자기자신을 적으로 간주하게 된다 -_- ;


팀번호는 순전히 아군/적군용이고 플레이어 번호는 소유 구분용이다.


현재까지 그냥 구상한건 이 정도. 문제생기면 바꾸면 되니까. 



#6 캐릭터 대칭 설정


            if (This_Stats.X_Speed > 0)
            {
                // 뒤집기
                if (!flipped)
                {
                    Vector3 newvec = This_Transform.localScale;
                    newvec.x = newvec.x * -1;
                    This_Transform.localScale = newvec;
                    flipped = true;
                }
            }

            if (This_Stats.X_Speed < 0)
            {
                // 뒤집기
                if (flipped)
                {
                    Vector3 newvec = This_Transform.localScale;
                    newvec.x = newvec.x * -1;
                    This_Transform.localScale = newvec;
                    flipped = false;
                }
            }

 



반응형
Comments