문법질문
343
30 asked
안녕하세요. 애니매이션 코딩을 선생님이랑 똑같이 작성하던 중에 float wait_run_ratio=0; 변수 선언하는 부분을 원래 void update함수 전에 넣는 것인데 실수로 update 함수 안에다가 넣는 실수를 해버리고 말았습니다. 제가 문법을 백프로 이해한 것은 아니라 그런지 왜 업데이트 함수안에다가 변수 선언을 하면 애니매이션이 제대로 작동하지 않는 거죠?
Answer 2
2
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
빠른 답변 감사합니다. 처음 프로그램을 배우는 거라그런지 정말 모든게 낯설지만 신기하기도 하고, 대단한 것 같기도 합니다. 기초를 쌓아서 빨리 저만의 게임을 만들고 싶네요. ~~~
UI 기능 관련 질문이 있습니다!
0
24
2
픽셀 좌표 스크린 좌표
0
26
0
전체적으로 코드 읽는게 굉장히 오래 걸리네요...
0
67
2
카메라 #2 수업 캐릭터 쓰러짐 해결
0
79
1
플레이어 움직임이 끝날때, 기울어짐 현상
0
81
1
Input 적용과 관련하여 질문 있습니다.
0
72
1
디버그 불가.. Unity에 연결 불가
0
76
1
달리기 애니메이션 에러
0
85
2
오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다
0
63
1
GetKey 오류
0
108
2
에셋을 어디에 올려두신지 알 수 있나요?
0
104
1
재귀호출? 오류나는데 왜 이래요 ?
0
167
6
Animation blending 파라미터 계산
0
65
1
newPos와 to지점이 겹쳐져야 하는거 아닌가요?
0
94
3
오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다
0
85
2
질문있습니다
0
142
2
아 이거 소스코드 같은거 없나요?
0
140
3
질문 드립니다. string.IsNullOrEmpty(name)
0
85
2
@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?
0
133
2
유니티6 NavMesh 안되는분들
1
174
1
Unity6 Unity-Chan Material 마젠타 문제 해결법
7
524
1
GetComponent<Poolable> 질문드립니다.
0
99
2
UI 불러오지 못함
0
116
2
UI 자동화 #1 - Util.cs의 FindChild함수에서 component.name에 컴포넌트 이름이 뜹니다.
0
152
2

