맥스스크립트 심화

바이패드 Bip파일 불러오거나Bip파일과 XML파일 불러오기(2)

스크립팅하는애님 2021. 3. 10. 23:01
728x90
반응형

안녕하세요.

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

'맥스스크립트 심화' 게시판은 원하는 기능을 맥스 스크립트로 어떻게 구현해 가는가에 대해 설명하려고 만들었습니다.

몇 가지 간단한 것들을 적고 어떤 내용을 채워 넣을까 고민하면서 '맥스 스크립트 기본'을 정리하고 있었는데 때마침 '공부하는 하이'님이 질문을 주셔서 다시 작성하게 되었습니다.

Max의 기능을 스크립트로 구현하는 데 있어서 막힌다면 질문해주시면 감사하겠습니다. (감사하다곤 했지만 다 해결할 수 있다곤 안 했어요. ㅎㅎㅎ)

 

지난번 내용은 아래 스크립트 두 줄 입니다.

 

1
2
biped.loadBipFile $'Bip001'.controller "D:\\Archer_W001_101_MOVE.bip"
LoadSaveAnimation.loadAnimation "D:\\aaa.xaf" (selection as array) insertTime: 20
cs

 

이것을 그럴듯하게 꾸미고, 마우스 클릭보다 더 빠르게 업무가 진행되도록 하야 겠습니다.

 

우선 변수를 이용해서 입력되는 옵션 값을 변경하기 쉽도록 떼어 놓겠습니다.

다음과 같이 바꿔 보겠습니다.

 

1
2
3
4
5
6
7
bipNodeCtrl = $'Bip001'.controller
bipFileName = "D:\\Archer_W001_101_MOVE.bip"
xafFileName = "D:\\aaa.xaf"
insertStartFrame = 20
 
biped.loadBipFile bipNodeCtrl bipFileName
LoadSaveAnimation.loadAnimation xafFileName (selection as array) insertTime: insertStartFrame
cs

 

더 내용도 길어지고 글자도 많아지고 복잡해져 보이네요.

하지만 천천히 들여다보면 변수를 생성하고 변수에 정보를 입력하는 부분이 추가된 것뿐입니다.

이전 명령어의 1번 라인의 '$'Bip001'.controller'는 변수 'bipNodeCtrl'에넣었습니다.

같은 1번 라인의 파일명 '"D:\\Archer_W001_101_MOVE.bip"'는 변수 'bipFileName'에 넣었습니다.

이전 명령어 2번 라인도 파일명 '"D:\\aaa.xaf"'는 변수 xafFileName에, 시작 프레임 '20'은 변수 'insertStartFrame '에 넣었습니다.

그리고 지금의 6번 라인과 7번 라인은 정보 값 대신 변수 명으로 대체되었습니다.

하지만 아직까지 왜 이렇게 길어지게 바꿨는지 이해가 안 가시는 분도 있을 겁니다. (저도 그랬으니까요. ㅎㅎㅎ)

변수 명으로 변경하면 나중에 'UI'같은 것으로 접근하기가 매우 편리해집니다.

그렇다는 것은 우리도 이 스크립트를 UI를 이용할 거란 소리지요.

 

'UI'의 기본인 대화창을 만들어 보겠습니다.

MAXScript Editer에서 'File > New'를 눌러 새 창을 띄워 주시고 다음과 같이 적어 넣습니다.

 

1
2
3
4
5
rollout BipnXafLoad_Roll "Bip&Xaf Load"
(
 
)
createdialog BipnXafLoad_Roll
cs

 

 

 

이렇게 작은 창이 생겼습니다. (대화창의 자세한 내용은 '맥스스크립트 기본'의 'UI'부분을 확인하세요.)

조금 더 꾸며 보겠습니다.

다음과 같이 입력하고 실행해 보겠습니다.

 

1
2
3
4
5
6
7
rollout BipnXafLoad_Roll "Bip&Xaf Load"
(
    radiobuttons choiceTyope_rad labels:#("Bip", "Xaf")
    spinner insertStartFrame_spi "입력 프레임" range:[-9999, 9999, 0] type:#integer
    button load_btn "불러오기"    
)
createdialog BipnXafLoad_Roll
cs

 

'UI' 부분은 이미 설명했기 때문에 따로 설명드리지 않도록 하겠습니다. ('UI'의 자세한 내용은 '맥스스크립트 기본'의 'UI'부분을 확인하세요.)

 

이미지만 봐도 위 스크립트 내용이 대충 이해 되실겁니다.

 

먼저 radiobuttons의 버튼을 클릭하였을 때 어떤 반응을 할지 생각해 보겠습니다.

두 개의 버튼이 겹쳐지지 않기 때문에 'Bip' 또는 'Xaf' 두 가지 경우만 발생할 수 있습니다.

그렇기 때문에 radiobuttons이 'Bip'일 때와 'Xaf'일 때를 if문을 사용하여 값을 비교하는 것이 좋을 것 같습니다.

그렇다면 'radiobuttons'인 'choiceTyope_rad'의 눌리는 버튼에 따라 어떤 값이 넘어오는지 확인해야겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
rollout BipnXafLoad_Roll "Bip&Xaf Load"
(
    radiobuttons choiceTyope_rad labels:#("Bip", "Xaf")
    spinner insertStartFrame_spi "입력 프레임" range:[-9999, 9999, 0] type:#integer
    button load_btn "불러오기"
    
    on choiceTyope_rad changed state do
    (
        format "값은 % 이다.\n" state
    )
)
createdialog BipnXafLoad_Roll
cs

 

7번 라인 : 'radiobuttons'인 'choiceTyope_rad'를 눌러 상태 값(state)이 바뀌었을 때(changed) 괄호 안의 내용을 실행하라입니다.

9번 라인 : MAXScript Listener에 상태 값(state)을 출력하라입니다.

 

 

버튼을 누를 때마다 위와 같이 글자가 출력되면 됩니다.

 

다음으로 '입력 프레임'부분의 설정은 넘어가겠습니다.

'입력 프레임'은 'Xaf'파일에서 애니메이션 키가 어느 프레임부터 들어올지 정하기 위해 사용자가 원하는 프레임의 정보를 입력받아 기억하는 역할을 할 겁니다.

초반에 스크립트 작업에서 만들었던 insertStartFrame 변수를 생성하고 '입력 프레임'이 변경되면 변수에 값을 입력하도록 하겠습니다.

다음과 같이 수정하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
insertStartFrame = 0
 
rollout BipnXafLoad_Roll "Bip&Xaf Load"
(
    radiobuttons choiceTyope_rad labels:#("Bip", "Xaf")
    spinner insertStartFrame_spi "입력 프레임" range:[-9999, 9999, 0] type:#integer
    button load_btn "불러오기"
    
    on choiceTyope_rad changed state do
    (
        format "값은 % 이다.\n" state
    )
    
    on insertStartFrame_spi changed state do
    (
        insertStartFrame = state
    )
)
createdialog BipnXafLoad_Roll
cs

 

새로 추가된 내용은

1번 라인 : 변수를 생성하고 0값을 넣어 줍니다. (이렇게 하면 생성과 동시에 입력된 정보로 인티저형 변수로 정의됩니다.)

14 ~ 17번 라인 : 스피너 UI인 'insertStartFrame_spi'가 변경되면 발동 됩니다.

'insertStartFrame' 변수에 'state'값을 입력합니다.

'on insertStartFrame_spi'이벤트의 'state'와 'on choiceTyope_rad' 이벤트의 'state'는 다른 값입니다.

각각의 내부에서 사용되는 값이기 때문에 만약 다른 이벤트에서 상대방의 'state'값을 쓰고 싶다면 'insertStartFrame_spi.state'와같이 누구의 것인지를 명시해야 합니다.

 

다음으로 'choiceTyope_rad'의 상태값도 변수에 저장하도록 하겠습니다.

다음과 같이 수정하시면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
animType = 1
insertStartFrame = 0
 
rollout BipnXafLoad_Roll "Bip&Xaf Load"
(
    radiobuttons choiceTyope_rad labels:#("Bip", "Xaf")
    spinner insertStartFrame_spi "입력 프레임" range:[-9999, 9999, 0] type:#integer
    button load_btn "불러오기"
    
    on choiceTyope_rad changed state do
    (
        animType = state
    )
    
    on insertStartFrame_spi changed state do
    (
        insertStartFrame = state
    )
)
createdialog BipnXafLoad_Roll
cs

 

수정된 라인은 1, 12 라인이고 변수 'animType'를 생성할때 1값을 넣은 이유는 대화창이 처음 열릴때  'choiceTyope_rad'값이 1이기 때문입니다.

다른 부분은 아까 이야기 한것과 동일 하기 때문에 생략하겠습니다.

 

그다음으로 '불러오기' 버튼인데 가장 중요한 부분이고, 내용도 많기 때문에 여기서 끊고 내일 이야기를 진행하겠습니다.

728x90
반응형