인프런 커뮤니티 질문&답변

rlagusdn0086님의 프로필 이미지
rlagusdn0086

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

Animation Blending

문법질문

작성

·

244

1

안녕하세요. 애니매이션 코딩을 선생님이랑 똑같이 작성하던 중에 float wait_run_ratio=0; 변수 선언하는 부분을 원래 void update함수 전에 넣는 것인데 실수로 update 함수 안에다가 넣는 실수를 해버리고 말았습니다. 제가 문법을 백프로 이해한 것은 아니라 그런지 왜 업데이트 함수안에다가 변수 선언을 하면 애니매이션이 제대로 작동하지 않는 거죠? 

답변 2

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

float wait_run_ratio=0; 라는 것을 함수가 아닌 class에다 넣으면
이는 특정 class의 멤버 변수가 됩니다.
class를 설계도라고 제가 비유를 많이 하는데

public class Knight
{
    int hp;
}

위 예에서 Knight는 hp라는 정보를 갖고 있는 것이고, 
Knight k = new Knight을 통해 Knight을 생성하게 되면,
실제 Knight 객체의 메모리 구성에 hp라는 애가 같이 할당되어
Knight 객체가 소멸될때까지 유지됩니다.
(참고로 Knight가 class이기 때문에 '힙' 메모리 영역에 잡힙니다)

public class Knight
{
    void Attack()
    {
        int hp = 0;
        ...
    }
}

반면 위와 같이 만들면 아예 다른 얘기가 됩니다.
Knight는 Attack이라는 멤버 함수를 갖고 있고,
이는 Knight가 사용할 수 있는 일종의 동작이라서
Knight k = new Knight(); 을 한 다음에
k.Attack(); 형태로 해당 동작을 실행할 수 있습니다.

여기서 중요한건 int hp;가 이젠 함수 내부로 들어간 것이라서
이제 Knight 객체랑은 아무 상관이 없고,
함수가 내부 연산을 할 때 잠시 사용하고 끝나면 버리는 '임시적인' 메모리에 해당합니다.
그리고 그 '임시적'인 공간을 우리가 hp라는 이름으로 부르기로 한 셈이 되는거죠.
이렇게 만들 경우 int hp;는 '스택' 메모리 공간에 할당되며
'스택' 메모리는 함수가 끝나면 같이 소멸되기 때문에
계속 유지 되는 개념이 아니라 Attack()을 호출할 때마다
int hp = 0;로 다시 세팅되고, Attack()이 끝나면 다시 그 메모리는 날라갑니다.

우리가 Animation Blending에서 기존의 wait_run_ratio라는 변수를 유지시키고,
기존의 정보를 토대로 새로운 정보를 연산해야 의미가 있는데요.
만약 이를 잘못해서 함수 내부로 넣어주면,
로컬 변수가 되어 (임시 변수)
함수가 실행될 때마다 매 번 wait_run_ratio라는 임시 변수가 스택 메모리에 생성되고,
함수가 실행될 때 초기값 0으로 시작되기 때문에 기존의 값이 매 번 날라가게 됩니다.
따라서 코드가 정상적으로 동작하지 않는 것이죠.

사실 메모리 부분은 많이 헷갈리는게 맞고
C++ 같은 비교적 '로우'한 언어를 뜯어보면서 학습하는게 가장 이해하는게 좋습니다.
지금은 일단 개념적으로 [함수 안에 변수 선언 = 임시 변수 = 곧 날라감] [클래스 안에 변수 선언 = 유지되는 변수 = 쭉 유지됨]이라고 기억해주시면 되겠습니다.



 

0

rlagusdn0086님의 프로필 이미지
rlagusdn0086
질문자

빠른 답변 감사합니다. 처음 프로그램을 배우는 거라그런지 정말 모든게 낯설지만 신기하기도 하고, 대단한 것 같기도 합니다. 기초를 쌓아서 빨리 저만의 게임을 만들고 싶네요. ~~~

rlagusdn0086님의 프로필 이미지
rlagusdn0086

작성한 질문수

질문하기