맥스스크립트 심화

RolloutCreator Functions(1)

스크립팅하는애님 2021. 4. 5. 20:31
728x90
반응형

안녕하세요.

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

오늘은 이전에 배운 UI의 발전형을 설명하려고 합니다.

지금까지는 기능에 대한 설명은 '맥스스크립트 기본'에서 설명을 드렸는데, 이번은 '맥스 스크립트 심화'에서 설명을 드리려고 합니다.

기능 설명에 더불어 간단하게 생각하면서 스크립트를 짜는 방법도 보여 드리기 때문입니다.

 

만약 여러분이 맥스에 만든 박스의 수에 맞춰 버튼이 동적으로 생성되는 UI를 가진 스크립트를 짠다고 생각하면 어떻게 작성을 하실 건가요?

맥스에 만들어진 박스의 수를 세어 수만큼 for문을 돌리면 간단할 것 같습니다.

우선 뷰포트에서 박스를 3개 정도 만들겠습니다.

 

빨녹파 세개의 박스입니다.

 

위와 같이 만들고 MAXScript editor에서 다음과 같이 입력하겠습니다.

 

1
2
3
4
rollout boxButton_Rollout " Box Button"
(
)
createdialog boxButton_Rollout
cs

 

 

UI를 사용할 것이니 간단한 아무 내용도 없는 대화창을 만들었습니다.

그리고 안에 내용을 넣을 것입니다.

1 모든 오브젝트를 모은다.

2 for문을 이용해 모든 오브젝트를 돌며 박스를 찾는다.

3 박스를 찾으면 버튼을 만든다.

이렇게 하면 간단히 해결할 것 같습니다.

그럼 실제로 해보죠.

다음과 같이 입력해 보겠습니다.

아직 실행은 하지 마세요.

 

1
2
3
4
5
6
7
8
9
10
rollout boxButton_Rollout " Box Button"
(
    totalObj = $* as array
    
    for i = 1 to totalObj.count do
    (
       if(classof totalObj[i] == Box) do button boxButton_btn "박스"
    )
)
createdialog boxButton_Rollout
cs

 

실행하기 전에 설명을 먼저 하겠습니다.

3 ~ 8번 라인의 내용이 추가됐습니다.

3번 라인은 totalObj 변수에 모든 오브젝트를 배열 형태로 저장한다는 내용입니다.

5번 라인은 totalObj에 저장된 변수의 수만큼 for문을 돌리겠다는 의미입니다.

7번 라인은 이렇게 for문을 돌면서 totalObj의 i번째 오브젝트의 형태가 Box이면 버튼 UI를 만든다는 의미입니다.

겉 보기에는 별다른 문제가 없는데 실행해 보겠습니다.

 

에러가 똭!

 

네 에러가 발생했습니다.

3번째 줄에서 에러가 발생했습니다.

지금까지 3번째 줄과 같이 적어도 에러가 난적이 없어 당황스럽습니다.

이유는 롤아웃 'rollout boxButton_Rollout " Box Button" ( )'에서 괄호 안에는 변수를 생성하거나 for문을 생성하는 명령을 직접 내릴 수가 없기 때문입니다.

이런 명령을 롤아웃에서도 사용이 가능한 경우가 있는데 이는 이벤트 함수 안에서만 가능합니다.

즉 버튼과 같은 UI를 클릭하거나 내용을 변경하는 부분에서만 사용이 가능합니다.

그런데 이 이벤트가 만들어지려면 먼저 UI가 생성이 되어야 한다는 겁니다.

골치가 아프기 시작합니다.

결국 '맥스의 UI는 상황에 맞춰 유동적으로 변경할 수 없는가?'라는 생각이 듭니다. (저는 그랬어요. ㅎㅎㅎ)

다행히 저보다 훨씬 맥스 스크립트를 잘하시는 분에게 조언을 구하여 방법을 찾았습니다.

 

이렇게 틀이 정해져 있지 않고 유동적인 UI를 생성할 수 있는 함수가 'RolloutCreator Functions'입니다.

오늘은 여기까지 하고 다음 시간에는 'RolloutCreator Functions'의 문법에 대해 이야기를 하겠습니다.

문법을 마치면 다시 이문제에 대해 풀어가겠습니다.

다음에 봬요.

728x90
반응형