맥스스크립트 기초

반복문(for)

스크립팅하는애님 2019. 7. 9. 01:54
728x90
반응형

안녕하세요.

애니메이터가 들려주는 MAX Script의 스크립팅하는 애님입니다.

오늘은 반복문 for문에 대해서 얘기를 하겠습니다.

 

반복문이란 말 그대로 같은 행동을 반복 시기는 것입니다.

원한다면 무한정 반복 할 수도 있고, 횟수를 정해서 반복시키는 것도 가능합니다.

가장 기본적인 포문을 한번 확인해 봅시다.

 

1
2
3
4
for i = 1 to 5 do
(
    format "i = %\n" i
)
cs

 

맥스 스크립트에서 실행한것을 확인하기 전에 내용을 살펴봅시다.

1번 라인이 이야기중인 for문입니다.

for문은 for뒤에 변수를 지정하고 지정된 값에 조건에 맞게 반복을 합니다.

여기서는 i가 반복을 위한 변수가 되고 처음에는 1이 입력되고 1씩 증가하여 5가 되면 반복을 멈춥니다.

더 정확히 표현하면 뒤에 by 1(1씩 증가)

for i = 1 to 5 by 1 do

가 맞지만 1씩 증가하는 경우에는 생략하고 쓰지 않습니다.

그다음 format문을 사용하여 i의 값을 출력하도록 했습니다.

 

 

 

for i = 1 to 5 do는 for i in to 5 do와 동일합니다.

편한 대로 사용하시면 됩니다.

for문의 값의 증가(감소)는 다음과 같이 사용하면 됩니다.

 

for i = 1 to 100 by 2 do

1에서 2씩 증가하며 100이 될 때까지 반복을 합니다.(이경우 1에서 2씩 증가하기 때문에 홀수로 증가합니다.)

100을 넘으면 반복이 중단되므로 출력을 해본다면 99까지 만 출력됩니다.

 

 

for i = 100 to 1 by -1 do

100에서부터 1씩 감소하며 반복을 하다 1이 되면 종료합니다.

 

만약에 반복 중에 반복을 마무리하지 않고 빠져나오고 싶다면 exit를 사용하면 됩니다.

다음과 같이 작성해 봅시다.

 

1
2
3
4
5
for i = 1 to 100 do
(
    if(i == 3) do exit
    format "i = %\n" i
)
cs

 

잠깐 여기서 if문이 괄호도 없이 한 줄로 표현되어 있습니다.

조건문 다음으로 오는 실행문이 1줄인 경우에는 괄호를 붙이지 않고 1줄로 표현합니다.

다음과 같이 사용해도 결과는 같습니다.

 

1
2
3
4
if(i == 3) do
(
    exit
)
cs

 

 

 

 

 

다음으로 특정 경우에만 다음 내용을 실행하지 않고 반복을 진행하는 방법도 있습니다.

continue함수를 사용하면 됩니다.

 

1
2
3
4
5
for i = 1 to 10 do
(
    if(i == 3) do continue
    format "i = %\n" i
)
cs

 

조건을 한번 확인해 봅시다.

1부터 10까지 반복을 하는 for문인데,

if문을 사용하여 i값이 3이 될 때 continue를 실행합니다.

이 경우 다음 라인으로 오는 format문을 실행하지 않고 다시 for문으로 돌아갑니다.

눈으로 확인해 보면 이해하기 쉬우실 겁니다.

 

 

 

결과를 확인해 보면 i = 3이 빠지고 반복된 것을 확인할 수 있습니다.

 

저 같은 경우 exit나 continue를 자주 사용하지는 않습니다.

하지만 여러분이 만들고 싶은 스크립트에는 자주 쓰일지도 모르니 숙지해 두시면 좋습니다.

 

for문은 반복문이라는 이름에 맞게 같은 조건에서 값만 바꿔 가며 반복을 하고 있습니다.

이는 배열과 함께 사용하면 매우 효과 적입니다.

개인적으로는 배열과 함께 쓰기 위해 존재하는 것 같습니다. ㅎㅎ

맥스 화면의 모든 오브젝트를 배열에 저장하고 하나하나 확인하며 이름과 클래스를 확인하 며 조건에 맞춰 저장하거나 할 수 있게 해 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
allNode = $* as array
nodeNames = #()
helperNodes = #()
 
for i = 1 to allNode.count do
(
    append nodeNames allNode[i].name
    
    if (classof allNode[i] == Helper ) do append helperNodes allNode[i]
)
 
for i = 1 to nodeNames.count do
(
    format "%\n" nodeNames[i]
)
 
for i = 1 to helperNodes.count do
(
    format "%\n" helperNodes[i]
)
 
cs

 

무언가 쫘악 쓰여 있습니다.

겁먹을 것은 없습니다.

천천히 살펴보면 대부분은 배운 것이고 간단한 것입니다.

1번 라인의 allNode = $* as array는 영어의 숙어 정도로 생각하고 외워 두시면 좋습니다. ㅎㅎ

맥스 화면의 모든 오브젝트를 배열로 바꿔서 배열 변수 allNode에 넣는다입니다.

넵 변수에 오브젝트도 저장할 수 있습니다.

이런 기능들이 있기 때문에 맥스 스크립트로 오브젝트를 컨트롤할 수 있는 것입니다.

2번 3번 라인은 배열형 변수를 선언하는군요.

그다음으로는 for문이 3개로 나누어져 있는데 이것은 한 번에 보는 것이 아니고 각각 볼 수 있기 때문에 나누어 확인합시다.

5번 라인의 for문은 1번부터 allNode.count번째 까지 반복을 한다네요.

아까 allNode는 모든 오브젝트를 배열로 저장한다고 했습니다.

그럼 .count는 무엇일까요?

배열의 안에 있는 값의 개수를 찾는 값입니다.

allNode에 저장된 오브젝트의 수가 5개라면 5라는 값을 돌려줍니다.

그렇다면 1부터 5까지 반복하겠군요.

그다음으로 배열의 마지막 뒤에 값을 추가하는 append가 나왔습니다.

어디에 무엇을 추가하는지 확인해 봅시다.

nodeNames에 allNode[i].name을 추가하라는군요.

우선은 allNode[i].name이 뭔지를 알아야겠습니다.

오브젝트 뒤에 .name을 쓰면 해당 오브젝트의 이름을 돌려줍니다.

그렇다면 for문에 의해 i값이 계속 증가기 때문에 allNode[i].name는 allNode를 값을 하나씩 돌며 그 값 안에 있는 오브젝트의 이름을 구해 오는 겁니다.

구해온 이름은 append함수를 이용해 nodeNames에 차곡차곡 쌓아 놓는 것입니다.

다시 정리하자면 for문을 이용해 allNode에 저장한 오브젝트를 돌며 이름을 받아 저장한다는 겁니다.

하나하나 설명하면 길지만 정작 하는 일은 단순합니다.

9번 라인의 if문의 조건을 봅시다.

classof allNode[i] ==Helper라는 군요.

classof는 뒤에 오는 오브젝트의 class형을 구하는 명령어입니다.

더미는 Helper, 박스는 Box 등등으로 각각의 오브젝트의 특징에 따라 구해지는 형이 달라집니다.

(직접 확인을 하시면 좋습니다. 오브젝트를 만든 후 하나를 선택하고 'classof $'를 해보세요. 꼭 하나만 선택하세요. $는 현재 선택한 오브젝트를 뜻합니다.)

즉 '클래스형을 확인했는데 Helper와 같다면 다음을 실행하라.'입니다.

그다음은 다시 append가 나왔는데 위와 동일한 형식이기 때문에 긴 설명은 생략하겠습니다.

'클래스형이 Helper라면 helperNodes에 현재 for문의 오브젝트를 추가하라'입니다.

그 밑의 for문들은 각각의 배열 변수를 돌며 배열 변수의 내용을 출력하는 코딩입니다.

 

위의 예문은 사실 초보에게는 어려울 수 있습니다.

그냥 for문과 배열을 이용하여 이런 일을 한다는 정도를 보여 드리기 위해 쓴 내용입니다.

강의는 위에 것보다 짧은 예제를 반복하여 익숙해지면 조금씩 긴 예제를 사용할 테니 천천히 익숙해지셔도 좋습니다.

 

오늘은 반복문의 for문을 이야기해봤습니다.

마지막엔 '그래서 맥스 스크립트로 어떻게 맥스의 오브젝트를 조작하는데?' 하는 답답함을 가지신 분을 위해 맛 베기를 보여드려 조금 길어졌습니다.

다음에는 for문과 비슷한 while이라는 반복문에 대해 이야기해 보겠습니다.

728x90
반응형

'맥스스크립트 기초' 카테고리의 다른 글

오브젝트의 Transform (1)  (2) 2019.07.14
기본 오브젝트 만들기  (1) 2019.07.12
맥스스크립트의 알아두면 좋은 것  (0) 2019.07.12
반복문(while)  (3) 2019.07.10
제어문(case)  (5) 2019.07.07
제어문(if)  (3) 2019.07.07
배열 함수  (3) 2019.07.05
배열  (6) 2019.07.03