• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

애니매이션 질문입니다 (조금 길어요)

21.09.03 18:07 작성 조회수 323

0

중간에 듣다가 점프하는 애니매이션을 넣어보고 싶어서 

강의 일시정지 해놓고 점프 하는 애니매이션을 혼자 만들어봤는데

조금 이상한? 부분과 이해가 안가는 부분이 많아서 질문드립니다.

일단 점프 Animation은 유니티짱의 JUMP00 을 사용하였습니다.

점프 조건은 스페이스바를 누를 때 작동되게 하였습니다.

또한 유니티 툴에서 Parameters 부분에 float로 jump를 추가하였습니다.

(점프 애니매이션을 실행할때 유니티짱의 position 이 변경이 안되는것을 확인하고 진행하였습니다.)

Script코드랑 유니티툴 사진 첨부 하겠습니다.

먼저 Define.cs 에 KeyboardEvent enum타입으로 선언 하였습니다.(아직 왜 Define이라는 파일을 만들어서 관리하는지는 정확하게 이해는 안가지만 그런가보다 하고 여기 선언 하였습니다.)

그리고 왜인지는 모르겠지만 그냥 강의한거 따라서 InputManager.cs 에 사진과 같은 코드를 작성하였습니다.

그리고 이해는 아직 못하였지만 마우스 클릭을 할때 OnmouseClicked 를 Start에 만들어 주었기때문에 똑가이 만들고 선언해주었습니다

그리고 유니티 툴의 State 머신입니다.

현재 State 머신에서 WAIT를 눌러보면 WAIT -> RUN에서는 Has Exit Timed이 꺼져있고 WAIT -> JUMP에는 제가 Has Exit Time 을 껏습니다.

그리고 RUN -> WAIT : Has Exit Time OFF 상태이고

RUN -> JUMP : Has Exit Time OFF 상태입니다.

그리고 JUMP -> WAIT : Has Exit Time OFF상태이고

JUMP -> RUN : Has Exit Time ON(체크된상태) 입니다.

JUMP -> RUN에서 Has Exit Time 을 꺼버리면 

WAIT 애니매이션이 계속 지속이 되고 Has Exit Time 켜주면 

다시 애니매이션이 동작합니다. 다만, 여기서

점프를 하고난 후에

잠시 뛰는 애니매이션을 실행하고 다시 WAIT 애니매이션을 실행합니다.

궁금한 질문 입니다.

질문1 :

막연한 질문이지만 왜 점프를 하고난 뒤에 뛰는 애니매이션을 잠깐 실행하고 멈추는 지 모르겠습니다.

JUMP, RUN의 Blending부분을 안곂치게 실행을 해보아도 똑같았습니다.

질문2 :

PlayerController.cs에서 작성한 

void OnKeyBoardPressed(Define.KeyBoardevent evt)

{

        if (_state == PlayerState.Die)

            return;

        Animator anim = GetComponent<Animator>();

        anim.Play("JUMP");

    }

이 함수 없이도 

InPutManager.cs 에 

if(Input.GetKeyDown(KeyCode.Space) == true)

        {

            KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space);

            _pressed_space = true;

        }

        if(Input.GetKeyUp(KeyCode.Space) == true)

        {

            KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space);

            _pressed_space = false;

        }

이 부분과 PlayerController.cs에서 작성한

이부분만 있어도 점프가 되던데

어떠한 식으로 함수를 주고받는 것인지 이해가 안갑니다..

Playercontroller.cs의 Start()함수에서

Managers.Input.KeyBoardAction -= OnKeyBoardPressed;

        Managers.Input.KeyBoardAction += OnKeyBoardPressed;

이 두줄을 주석처리하거고 실행하면 에러가나서 점프가 안되는데 왜 저런식으로 코드를 짜야 점프가 되는지 모르겠습니다.

질문 3 :

Playercontroller.cs의 OnKeyBoardPressed의 인자러(Define.KeyBoardEvent evt) 이런식으로 넘겨 주고 밑에 if문으로 함수를 짯는데 Define.KeyBoardEvent evt 의 의미가 Define.KeyBoardEvent 이녀석이 true라는 말이거나 아니면 뒤에 Define.KeyBoardEvent에서 P_Space를선언 해주었다는 말이랑 같은 말인가요?

질문 4 :

Start()에서Managers.Input.MouseAction -= OnMouseClicked;

        Managers.Input.MouseAction += OnMouseClicked;

이러한 부분이 콜백함수인것은 알겠는데 어떤식으로 호출하고 호출되는지 모르겠습니다..

질문 5: 

학교가 게임만드는 학과인데 

이때까지 수업들어왔던 내용들이 이해를 못한 부분들이 많은데 그냥 이대로 수업을 쭉 듣고 혼자 실습하는 형태로 진행하는것이 좋을까요 아니면 이해가 될떄까지 늘어지는게 좋은방법인가요..?? 2학년인데 게임개발 잘하시는 분들보면 현타가 옵니다..ㅠㅠ

질문내용을 이해하기 어려우실 수 있는데 답변드린다면 정말정말 감사하겠습니다.

감사합니다.

답변 4

·

답변을 작성해보세요.

4

안녕하세요.

위 내용이 모두 이해가 안 가신다고 하면,
사실 어디부터 설명을 해야 할지 살짝 난감한 상황입니다.
질문에 대한 대답을 드리는게 당장 큰 의미가 없고,
공부 방법에 대해서 먼저 같이 고민을 해볼 필요가 있어 보이네요.

1) enum에 대해서 이해하고 계신지
2) delegate와 콜백 함수에 대해 이해하고 계신게 맞는지
3) 유니티에서 디버깅과 로그 찍는 것에 대해 숙지하고 계신지
4) 게임학과라 하셨는데 프로그래머인지, 기획 같은 기타 직군인지
~부터 말씀주시면 도움 될 것 같습니다.

그리고 프로그래밍을 공부할 때
너무 어려운 것은 이해를 못하고 넘어간 후 반복 학습이 좋은 것은 맞지만,
그렇다고 정말 모든 내용을 스킵하는 것은 안 되고
enum이나 delegate과 같이 아주 기본적인 것은 반드시 이해를 하고 넘어가야 합니다.
사실 위 코드에서 애니메이션을 코드에서 관리하고 있는데,
코드가 돌아가는 구조가 이해가 안 가기 때문에
덩달아 애니메이션도 분석이 안 되는 것은 어찌보면 당연한 겁니다.
먼저 전체적인 코드에 대해 이해를 하도록 노력한 다음,
애니메이션이 수정되는 부분에 따로 로그를 찍어보면서 접근을 해야합니다.

그리고 2학년인데 게임 개발을 잘하는 분들 보면 현타가 오신다고 하시는데..
저는 코딩 공부를 대학교도 아니고 졸업 후에 28살부터 본격적으로 했습니다 ^^
그 전에는 학교 과제만 깨작 깨작 하고 사실 코딩을 좋아하지도 않아서
프로그래머가 될 생각이 1도 없었습니다..

그러니 빠르고 늦고는 중요한게 아니고 지금부터 하면 오히려 저보다 훨~~씬 빠르신겁니다.

2

우선 InputManager는 삭제하시고
일반적인 방법처럼 PlayerController 같은데서의 Update 안에서
체크하는 방식으로 수정하시기 바랍니다.
InputManager는 마우스 등이 개입할 떄 효과적인데
굳이 키보드 키반 게임에서 넣어서 너무 많은 분들의 혼동을 야기한 것 같아 Part7부터 사라집니다.

두번째로 점프중일 때 Moving으로 바뀌는게 문제라면,
그 부분을 예외처리하면 그만입니다.
그리고 점프 애니메이션은 보통 [점프할 때]-[부양중]-[착지중] 애니메이션으로 나뉘는 경우가 많은데
그럴 때는 코드에서 관리하기 보단 점프를 유니티의 애니메이션 State에서 
전환하는게 더 수월할 수 있긴 합니다.

마지막으로 이러한 세세한 부분은 질문을 주시기 보다는
지금 하신 것처럼 계속 스스로 답을 찾아야 합니다.
코딩은 원래 새로운 문제가 발생하고,
그 문제를 해결하는 과정을 무한 반복하는 것입니다.
이건 신입이나 경력 20년차나 동일한 것이고
정해진 길이란 없으니 그냥 계속 헤딩하면서 고민해보시기 바랍니다.


starkshn님의 프로필

starkshn

질문자

2021.09.08

항상 친절하게 답변해주셔서 정말정말 감사합니다.

비록 온라인으로 강의를 구매서 질문글을 올리는것이지만 이렇게 친절하게 답변해주시는 강사님이 정말감사합니다~

계속 헤딩해보겠습니다~

0

irakwin님의 프로필

irakwin

2023.03.28

강의 중 실수로 유니티짱 오브젝트를 선택한채로 Animation 창에서 Create 를 눌렀는대, 그것 때문인지 강의대로 따라와도 "뚜벅 뚜벅" 로그가 뜰 때 오류가 뜹니다. 좀 도와주세요 ㅠㅠ

(오류 내용 : 'UnityChan' AnimationEvent 'NewEvent' on animation 'RUN00_F' has no receiver! Are you missing a component?)

0

starkshn님의 프로필

starkshn

질문자

2021.09.06

교수님이 알려주신대로 제가 Delegate 부분이 부족하다고 느껴 복습을 하고와서 며칠동안 코드를 보고 JUMP하는 애니매이션을 만들어봤습니다.

먼저

InputManager.cs의 상단부분에

Action이라는 Delegate 객체 KeyBoardaction을 선언해주었습니다. 초기값은 null입니다.

그리고나서 

KeyBoardAction != null 일때 밑에 if 문이 실행되도록 하였습니다.

여기서 궁금한것이

<첫번째 질문 1 : >

InputManager.cs에서 MouseAction은 Action이라는 delegate의 객체로 null 값을 주어 선언을 하셨습니다.

근데 OnUpdate()함수안에서  if(MouseAction != null)일때 밑에 코드들이 실행되도록하셨는데

Managers.cs 에서 _input.OpUpdate()를 호출하고있는 상황에서 어떻게 MouseAction값이 null이 아니게 되어서 밑에 Input.GetMouseButton이나 제가 작성한 Input.GetKeyDown(Keycode.Space) 부분이 실행되는지 이해가 가지 않습니다.

그리고 마저 코드를 설명하자면  어찌하였건 

InputGetKeyDown으로 키보드를 입력받아

KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space) (P_Space는 제가 Define에서 정의한 Enum값입니다.)

으로 값을 불러오게되면 

밑의 사진처럼

"들어옴"이 콘솔에 찍히고

_state = PlayerState.Jump; 가 되어

점프를 하게됩니다. 그리고

유니티 툴에서 WAIT, RUN, JUMP에 각각 

Condition을 주어 1보다 작으면 가만히 있게 하였고 0보다 크면 점프애니매이션 Condition을 일단 달아주었습니다.

그런데 점프를 하는동안에 콘솔창에 "점프했다가" 계속 찍히고 클릭하여 움직이면 더이상 콘솔창에 "점프했다"가 안찍히고 _state가 Moving으로 변하는거 같습니다

그래서 실제로 플에이버튼을 누르면 콘솔창에 점프하는동안 "점프했다"가 계속 찍히는거랑 점프하고 유니티짱이 WAIT애니매이션이 한번 더 끝날때까지 이동을 시켜도 WAIT애니매이션이 한번더 반복하는 부분말고는 

이동할때 점프하거나 가만히 있을 때 점프를 한번씩하는것은 어느정도 된거같습니다.

<두번째 질문 입니다>

이처럼 점프같은 애니매이션을 짤 때 저처럼말고 어떤식으로 짜야 효율적이고 쉽게 짤 수있나요..?ㅜ

(애니매이션을 넣을 때 어떤식으로 코드를 짜야할지 막막해집니다)

그리고 제 점프하는 애니매이션 코드를 수정하거나 부족한 부분이 있다면 어느 부분인지 알 수 있나요..??? 부족한 부분을 계속 매꾸고싶습니다