안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
fileName = ""
maxFiles = #()
rollout Merge_Rollout "Merge"
(
button selectMerge_btn "머지파일선택" pos:[5, 5]
label fileName_lab "FileName" style_sunkenedge:true height:15 width:155 pos:[5, 30]
button run_btn "실행(파일)" pos:[5, 60]
button runFolder_btn "실행(폴더)" pos:[80, 60]
on selectMerge_btn pressed do
(
fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
fileName_lab.caption = fileName
)
on run_btn pressed do
(
mergeMaxFile fileName #select quiet:true
$.parent = $'Bip001 R Hand'
)
on runFolder_btn pressed do
(
getFolder = getSavePath caption:"머지될 폴더 선택"
maxFiles = getFiles (getFolder + "\\*.max")
for i = 1 to maxFiles.count do
(
loadmaxfile maxFiles[i] quiet:on
mergeMaxFile fileName #select quiet:true
$.parent = $'Bip001 R Hand'
saveMaxFile maxFiles[i]
resetMaxFile #noPrompt
)
)
)
createdialog Merge_Rollout
|
cs |
지난 시간까지 이야기한 내용입니다.
오늘은 지난시간에 얘기한 문제에 대해서 설명하겠습니다.
1 머지할 파일과 머지될 파일을 같은 폴더에 두면 문제가 발생합니다.
2 아직 제대로 파일들이 준비되지 않았습니다.
1번 문제는 '머지파일 선택' 버튼에서 파일 이름을 알고 있으니 그것을 이용하면 쉬울 것 같네요.
'if'문을 이용해 '머지파일'과 같은 이름의 파일('fileName'변수에 저장된 값)이라면 머지를 실행하지 않고 넘어가도록 하겠습니다.
파일을 열때마다 같은 이름을 검사해야 하니 'for'문 안에 'if'문을 넣어야 할 것 같습니다.
정확히는 파일을 연 후에 검사하는것 보다는 열기 전에 검사하는 것이 컴퓨터 내부에서 번거로운 과정이 없기 때문에 유리할 것 같습니다.
다음과 같이 입력하여 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
on runFolder_btn pressed do
(
getFolder = getSavePath caption:"머지될 폴더 선택"
maxFiles = getFiles (getFolder + "\\*.max")
for i = 1 to maxFiles.count do
(
if(fileName != maxFiles[i]) do
(
format "Filse = %\n" maxFiles[i]
--loadmaxfile maxFiles[i] quiet:on
--mergeMaxFile fileName #select quiet:true
--$.parent = $'Bip001 R Hand'
--saveMaxFile maxFiles[i]
--resetMaxFile #noPrompt
)
)
)
|
cs |
'if'문을 추가 하여 '머지될'파일과 현제 열려고 하는(아직 열지 않은) '머지할'파일의 이름을 비교하여 동일하지 않으면 실행하라는 내용을 적었습니다.
'format'문을 이용하여 적용되는 파일이름이 출력되도록 하였고 그 밑의 실제 작동하는 명령은 확인이 된 후 작동하도록 임시로 주석 처리했습니다.
이렇게 바꾼 후 결과를 확인하시면 같은 폴더에 '머지될'파일이 있어도 자기 자신을 머지하는 상황은 피할 수 있습니다.
2번 문제는 스크립트로 해결하는 것보다는 작업자가 샘플 파일로 하나 만들어 두는 것이 좋을 것 같습니다.
예를 들어 여기 캐릭터(혹은 몬스터) A가 있다고 생각하겠습니다.
이전에는 칼이 없었지만 기획이나 게임의 기능 문제로 칼이나 본, 혹은 더미라도 추가해야 한다고 합니다.
문제는 A의 동작은 100개 정도가 있고 모두 수작업 하기에는 마감시간이 촉박한 데다가 사람의 작업이어서 중간에 실수도 생길 수 있습니다.
맥스 스크립트로 100개의 파일에서 예외사항을 모두 확인하여 대응하는 것도 시간이 많이 소요됩니다.
가장 쉬운 방법은 '머지될'파일과 '머지할'파일이 머지 하면 끝나게 작업자가 준비하는 것입니다.

여기에 이전 시간에 작업해 완성된 샘플 파일이 있습니다.
같은 캐릭터의 여러 동작이란 것은 바이패드 입장에서는 '동작은 모르겠고 구조는 모두 똑같아'입니다.
피겨 모드가 된다면 모두 동일하다는 거죠.
바이패드를 피겨 모드로 변경합니다.
이 상태에서 칼만 두고 나머지 오브젝트를 삭제합니다.
이 파일을 다른 이름으로 저장하여 '머지될' 파일로 만들어 줍니다.
바이패드들은 모두 칼이 없는 상태이기 때문에 머지되기 전에 피겨 모드로 변경한 후에 머지를 하고 다시 피겨 모드를 해제하면 간단하게 해결이 됩니다.
방금 위에 설명한 내용은 사실 맥스 작업을 어느 정도 해보신 분이라면 이미 알고 있거나 쉽게 이해할 수 있는 내용입니다.
하지만 이것이 스크립트와 결합했을 때 어느 선까지 수작업을 하고 어느 선까지 스크립트 작업을 할지 가늠하지 못해 잘못하면 일이 더 복잡해질 수 있기 때문에 하나의 예시로 적은 것입니다. (저는 완전 자동화를 노리려다가 오히려 일을 더 복잡하게 만든 경험이 있었거든요. ㅎㅎㅎ)
파일은 '머지될'파일 한 개와 '머지할'파일 3개 총 4개의 파일을 준비했습니다.
'머지될'파일은 칼입니다.
이제 실행을 하려고 합니다.
우선 맥스에 열려 있는 씬을 'Reset'으로 닫도록 합니다.
(파일이 열려 있어도 정상 작동은 하겠지만, 만약 열려 있는 파일이 저장되어 있지 않다면 문제가 발생할 수 있습니다. 그렇다고 자동으로 저장을 하도록 스크립트로 만들어도 원치 않는 저장이 될 수 있기 때문에 저장을 하기도 말기도 애매 한 상황이 될 수 있기 때문에 폴더에 적용하는 작업은 기본적으로 씬을 비우고 시작하는 것이 좋습니다.
아예 씬이 열려 있다면 닫아달라는 경고 문구를 넣는 것도 좋을 것 같습니다.
까짓 거 경고 문구를 출력하는 'if'문을 하나 넣도록 하죠.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
on runFolder_btn pressed do
(
if(($* as array).count == 0) then
(
getFolder = getSavePath caption:"머지될 폴더 선택"
maxFiles = getFiles (getFolder + "\\*.max")
for i = 1 to maxFiles.count do
(
if(fileName != maxFiles[i]) do
(
loadmaxfile maxFiles[i] quiet:on
$'bip001'.transform.controller.figureMode = true mergeMaxFile fileName #select quiet:true
$.parent = $'Bip001 R Hand'
$'bip001'.transform.controller.figureMode = false saveMaxFile maxFiles[i]
resetMaxFile #noPrompt
)
)
)
else messagebox "열려 있는 파일을 닫아주세요."
)
|
cs |
3번 라인의 내용은 현재 씬에 오브젝트가 0개(없으면) 실행을 하라입니다.
조건을 조금 더 까다롭게 준다면 'maxFileName == ""'(현재 씬의 파일 이름이 없음)도 동시에 만족한다면 더 좋겠네요.
(저는 건너뛸 테니 여러분은 추가해 주세요. ㅎㅎ)
아까 주석처리한 것은 원래대로 복구했습니다.
그리고 12번 라인은 바이패드를 피겨 모드로 해주고 15번 라인에서 다시 해제합니다.
이제 실행해 볼까요?
만족스러운 결과가 나왔습니다.
이제 쓸만해졌지만 아직 몇 가지 문제가 남아 있습니다.
1 꼭 오른손에만 마운트를 하는가?
2 파일이나 폴더를 선택하지 않고 취소를 하면 에러가 발생한다
3 '머지할' 파일 중 바이패드가 없는 녀석이 끼어 있다면?
다음 시간에는 위 3가지 문제에 대해 이야기하겠습니다.
많이 길어졌네요.
중간에 자르고 싶었지만 자를만한 내용이 아니라서 계속했습니다.
오늘은 여기까지 이야기하겠습니다.
'맥스스크립트 심화' 카테고리의 다른 글
오브젝트의 하이드와 박스모드 쉽게하기(1) (3) | 2021.05.10 |
---|---|
파일머지 편하게하기(8) (0) | 2021.05.03 |
파일머지 편하게하기(7) (0) | 2021.04.30 |
파일머지 편하게하기(6) (0) | 2021.04.29 |
파일머지 편하게하기(4) (0) | 2021.04.27 |
파일머지 편하게하기(3) (0) | 2021.04.26 |
파일머지 편하게하기(2) (0) | 2021.04.23 |
파일머지 편하게하기(1) (0) | 2021.04.22 |