2014년 5월 24일 토요일

게임샐러드 소개


게임샐러드는 쉬운엔진이다.

게임샐러드 홈페이지 'www.gamesalad.com' 에서 엔진을 다운 받을때 보면 '13세 이상...'이라는 부분에 체크를 해야 하는데 이말은 반대로 '13살부터는 이엔진을 이용하여 게임을 만들수 있다'는 얘기다.

제작 방식도 드래그앤 드롭과 셀렉트 방식으로 간단하고 실제로 타이핑과 문법이 필요한 코딩은 없다.

그럼에도 아직 한국에는 변변한 커뮤니티조차 없고 알고있는 사람도 드믄 엔진이다.
이유를 생각해 보자면
1. 우리나라에서는 한물 갔다고 생각되는 2D전용 엔진에다
2. 쉬운엔진이라는 인식때문에 어린 학생들이 공부를 하고 싶지만 언어의 장벽이 있다.
(언어의 장벽을 못느끼는 성인의 경우 더 복잡한 엔진을 선호한다)
3. 코딩이 없다는것 때문에 개발시 확장성부분을 의심받는다.
(이 부분이 전문개발자들에게 외면받는 이유가 크다.)
4.  홈페이지에 나온 선전용이미지가 구리다.
등이 있을것 같다.

아무래도 전문개발자가 봤을때는 코딩을 통한 세세한 셋팅이 불가능해 보여서, 초보자가 봤을때는 언리얼 같은 화려한 그래픽이 없어서 인것 같다.

하지만 '툴은 툴일 뿐' 아무리 좋은 도구를 주더라도 작업자가 능력이 나쁘다면 좋은 결과물을 얻을 수 없는것과 같이 아무리 허접해 보이는 툴이라도 좋은 아이디어와 실력이 있다면 좋은 결과물이 나온다.
최근 스팀의 2D레트로 게임들이 기발한 아이디어로 히트작들을 내고 있다.


게임샐러드는 맥용이 갑이다.

게임샐러드는 특이하게 윈도우용과 맥용이 다른 생김새를 가지고 있다.

맥용으로 있는 기능이 윈도우용에선 없다던가 하는 일은 없지만, 인터넷의 동영상 강의를 찾아보면 대부분(내가 아는한 모두) 맥용으로 진행을 한다.
생김새가 다르다는것은 사소한 버튼의 위치 부터 기능으로 들어가기위한 방법 까지 다른 부분을 가지고 있다.
두가지 버전을 다써본 경험으로 맥용이 더 작업이 편하게 되어있다.

게다가 기본(무료)버전의 경우
맥용은 맥PC, IOS, 웹 으로 퍼블리싱하는게 가능하지만,
윈도우는 웹 만 퍼블리싱이 가능하다.(물론 프로버전을 사용한다면 안드로이등으로 확장이 가능하다)
약간 귀찮지만, PC버전으로 만든것을 압축하여 맥용으로 컨버팅하는것이 가능하기 때문에 중고 맥PC나 맥북을(라이언 버전으로)구매하여 퍼블리싱하는것도 생각해 볼수 있다.
(사실 가벼운 2D엔진이기 때문에 라이언버전이 돌아가는 맥이면 직접 작업하는게 빠를 수도 있다.)
추후의 버전업 때 베이직의 확장성을 기대해본다.


한국에서는 정보를 얻기가 힘들다.



처음 이책이 있다는것을 알고 옳다구나 하고 구매를 했다.

하지만 책내용이 원서가 부실한건지 번역한사람이 개판을 친건지 5장을 넘어서먼서 무슨 이야기인지 알수 가없다.
어떤기능을 추가하여 이러한 효과를 낸다라고 적혀는 있는데 어떤 액터에게 추가하는것인지 주어가 없다.(이모 전대통님의 주어가 없는 얘기를 감명깊게 들은건지 모르겠다.)
원서가 개판이어도 번역한 사람이 의지가 있었다면 충분히 주어를 넣어서 알아 들을수 있게 했을텐데 그런 의지도 않보이고, 번역을 할때도 직접 테스트하며 한게 아닌것 같다는 생각이든다.(직접 해봤다면 이렇게 쓰진 않았을것이다.)

가장 큰 난관은 국내에는 이 책밖에 없다는 것이다. ㅠ,.ㅠ


그럼 커뮤니티는 없는것인가?

아쉽게도 네이버에 카페가 있기는한데 폐점직전이다.
그나마 추천하는곳은 'http://diyga.me/' 이다.
장점은 무려 한국어인 동영상강의가 있다.
단점은 가입을해야 하고, 고급스킬은 유료강의이고, 질문에대해 약간 동문서답이다.
그래도 여기에서 무료동강을 듣고 툴의 사용법을 익히고 해외 동강을 본다면, 큰도움이 될것이다.
약간 부족한점이 있지만 급한 사람에게는 감지덕지한 사이트다.


그래도 뭔가 아쉬운 기능

엔진이라면 왠지 당연히 있을 법한 링크(어테치, 마운트, 그룹)기능이 없다.
아니 없는건지 못찾은건지 몇일간 찾아봤지만 확인하지 못했다.
항간에는 업뎃을 기대하라는 얘기가 있었다.


그럼에도 한번 해보면 좋다.

자신이 만들고 싶은 게임에대한 느낌을 빠르게 확인해 보고 싶다면, 혹은 간단한 2D게임이라면(두들점프, 쿠키런류, 드래곤플라이트류) 훌륭하게 쓸수 있는 엔진이다.
물론 더 복잡한게임도 가능하리라 생각한다.


이런게임이 만들어졌다.


13살짜리도 게임을 만들수 있다는 게임샐럳러드.... 시작한다

6년 전쯤 유니티엔진이 레고를 끼워 맞추듯이 슥슥슥 붙이고 약간의 스크립트 코딩을 하면 캐릭터가 움직이는것을 보고 충격을 받았었다.
'이런 사기같은 엔진이 있다니!!'

하지만 약 1달전쯤 게임샐러드라는 엔진을 보고 또 비슷한 충격을 받았다.
'코드 한줄없이 게임재작'이 모토인 엔진이다.
정말 코드가 한줄도 없는가 한다면 '한줄도 없는것이 맞다.'이지만,
그래도 코드의 개념과 비슷한 '룰'과 '비헤이비어'라는것이 있다.

하지만 이것은 프로그래밍을 모르는 사람도 문법을 배울 필요없이 원리를 따져가면서 바로 캐릭터를 움직이게 할 수 있다는것이 큰 특징이다.

간단한 플로우차트 정도를 구사 할 수 있다면 OK인것이다.

아.. 그러고보니 유니티엔진은 3D, 2D(약함)의 범용 엔진이지만, 개임샐러드는 2D전용 엔진이다.
(요즘 스팀 게임을 즐기고 있는데 3D게임 보다 2D게임을 선호 하게 된다. 화려한 3D보다는 알차고 매력적인 게임 2D게임이 더 좋은것 같다.)


이제 부터 천천히 개임샐러드 엔진에 대해서 공부하겠다.

2014년 3월 24일 월요일

스프링개량 스크립트 Ver0.8

--------------- 스프링 루트 구간 시작---------------------
createRootPoint = point()
createRootPoint.name = "SpringRoot"
createRootPoint.size = 3.0
createRootPoint.box = true
createRootPoint.cross = false
createRootPoint.wirecolor = (color 200 10 10)
addModifier createRootPoint (EmptyModifier ())
--------------- 스프링 루트 구간 끝---------------------

--------------- 스프링 본 구간 시작---------------------
createBone = Bonesys.createBone[0,0,0][1,0,0][0,0,1]
createBone.name = "SpringBone"
createBone.width = 1
createBone.height = 2
createBone.length = 3
--createBone.boxmode = on
createBone.parent = createRootPoint

createEndBone = Bonesys.createBone[3,0,0][4,0,0][0,0,1]
createEndBone.name = "SpringEndBone"
createEndBone.width = 1
createEndBone.height = 1
createEndBone.length = 1
--createBone.boxmode = on
createEndBone.parent = createBone
--------------- 스프링 본 구간 끝---------------------

--------------- 스프링 포인트 구간 시작---------------------
createSpringPoint = point()
createSpringPoint.name = "SpringPoint"
createSpringPoint.size = 2.0
createSpringPoint.box = false
createSpringPoint.cross = true
createSpringPoint.wirecolor = (color 200 10 10)
createSpringPoint.position = [createBone.length, 0, 0]
createSpringPoint.parent = createRootPoint
createSpringPoint.position.controller =  SpringPositionController()
--------------- 스프링 포인트 구간 끝---------------------

--------------- ExposeTm 구간 시작---------------------
createExpTm = ExposeTm ()
createExpTm.name = "SpringExpTm"
createExpTm.size = 2.0
createExpTm.wirecolor = (color 170 170 170)
createExpTm.parent = createRootPoint
createExpTm.exposeNode = createSpringPoint
createExpTm.useParent  = false
createExpTm.localReferenceNode = createRootPoint
--------------- ExposeTm 구간 끝---------------------

--------------- attrivutes 구간 시작---------------------
springCA = attributes springData
(
parameters main rollout:params
(
yAxisMin type:#float ui:yAxisMin_spi default:-45.0
yAxisMax type:#float ui:yAxisMax_spi default:45.0
zAxisMin type:#float ui:zAxisMin_spi default:-45.0
zAxisMax type:#float ui:zAxisMax_spi default:45.0
forceVal type:#float ui:force_spi default:1.0
editBone type:#integer ui:editBone_cb default:0
)


rollout params "Spring Parameters"
(
spinner yAxisMin_spi "Y-AxisMin " type:#float Range:[-90.0,-1.0,-45.0]
spinner yAxisMax_spi "Y-AxisMax " type:#float Range:[0.0,90.0,45.0]
spinner zAxisMin_spi "Z-AxisMin " type:#float Range:[-90.0,-1.0,-45.0]
spinner zAxisMax_spi "Z-AxisMax " type:#float Range:[0.0,90.0,45.0]
spinner force_spi "Force " type:#float Range:[-100.0,100.0,1.0]
checkbutton editBone_cb "EditBone" checked:false

on editBone_cb changed state do
(
createSpringPoint.position = createEndBone.position
createSpringPoint.rotation = createEndBone.Rotation
editBone_cb.checked = false
)
)
)

ah = createRootPoint.modifiers[#'Attribute Holder']
CustAttributes.add  ah  springCA  #Unique BaseObject:false
--------------- attrivutes 구간 끝---------------------

---------------스프링본에 Rotation_Script_Controller추가 구간 시작------------------
createBone.rotation.controller = rotation_script()
createBone.rotation.controller.script = 
"
y = -(createExpTm.'local Position Z')
z = createExpTm.'local Position Y'
forc = createRootPoint.modifiers[#Attribute_Holder].springData.forceVal
yMinNum = createRootPoint.modifiers[#Attribute_Holder].springData.yAxisMin
yMaxNum = createRootPoint.modifiers[#Attribute_Holder].springData.yAxisMax
zMinNum = createRootPoint.modifiers[#Attribute_Holder].springData.zAxisMin
zMaxNum = createRootPoint.modifiers[#Attribute_Holder].springData.zAxisMax

y = y * forc
z = z * forc

if (y > yMaxNum) do y = yMaxNum

if (y < yMinNum) do y = yMinNum

if (z > zMaxNum) do z = zMaxNum

if (z < zMinNum) do z = zMinNum

rot = eulerAngles 0 y z

rot

"
---------------스프링본에 Rotation_Script_Controller추가 구간 끝------------------

=================================================================================

기존의 맥스 스프링의 경우 포스의 형태가 월드 축을 기준으로 적용되기 때문에 스프링 효과의 X, Y, Z 축을 셋팅하다고 해도 부모노드의 축이 변경된다면 셋팅값이 슬모가 없게 된다.

오토데스크사에서는 왜 이것을 그대로 두는지 모르겠다.
딱히 같은 기능을 하는 다른 명령도 없는데 말이다.

평소에도 가슴본 셋팅을 하면서 이것에 대해 뭔가 해결책이 있을것 이라고 생각했는데, 그간 제대로 고민해 본적은 없다. (물론 이것도 아직 완벽한 스크립트는 아니지만 ㅎㅎ)

이것에 대한 아이디어는 간단했다.
1 스프링 컨트롤러가 적용된 포인터의 Y, Z축의 이동값을 본의 회전값으로 전달한다.
2 회전되는 본의 Rotation Controller를 Script Controller로 특정 각도 이상 회전하지 못하게 한다.

글런데 알고 보니 이미 케릭터 페이셜 리깅에 이런 개념이 있었다. (난 페이셜 컨트롤러를 만들어 본적이 없었기 때문에 이런 간단한것도 몰랐다. ㅠ,.ㅠ)

구현을 해보니 큰 문제가 있었다.
1 이동거리가 회전값이다보니 노드의 크기가 차이가 나면 적용이 너무 작아지거나 너무 커진다.(2미터 짜리 캐릭터의 가슴 움직임 위치값과 20M짜리 캐릭터의 가슴 움직임 위치값은 당연히 차이가 있다)
2 한계 각도가 있기 때문에 한계각도를 넘으면 멈추는것이 당연하지만, 한계값을 넘어가면 스무스하게 멈추지를 못하고 딱 멈춰 버린다.

1번은 내가 수학을 잘한다면 자동으로 해결될 수 있게 할 수 있지만 나는 수학을 못한다. 그래서 공부를 할까 했는데 '낫 놓고 ㄱ자를 모른다.'는 속담이 뭔지 느낄수 있는 계기가 됐다.
그래서 받은값을 곱하기로 증폭하는 수치를 넣었다.(싸게 먹히니까!!!)
2번은 해결방법을 모르겠다.
적당한 함수를 찾아 보려했지만 구할 수가 없었다.
이 두개가 해결된다면 'Ver1.0'이 되겠지만 어쩔 수 없이 'Ver0.8'이다.
뭐 그래도 이정도면 훌륭하게 써먹을 수 있는 녀석이다.

생성되는 오브젝트는 다음과 같다.
SpringRoot - 최종부모이기 때문에 가슴에 이용한다면 바이패드의 Spine에 자식으로 링크를 걸면 된다. 셋팅옵션을 넣을 수 있는 'Attrribute Holder'가 포함된다.
SpringBone - 실제 흔들리는 결과 값을 표현하는 본
SpringEndBone - 본툴을 이용해 'SpringBone'본의 길이를 조정할때와 'SpringPoint'의 위치값을 위한 본
SpringPoint - 'SpringBone'의 흔들리는 가이드를 하는 스프링포인트
SpringExpTm - 'SpringPoint'의 위치값을 부모노드와 얼만큼 멀어지는지를 구하는 역활

생성된 모습에서 빨간 박스형 포인트를 선택하면모디파이어에서 다음과 같은 옵션을 볼 수 있다.

Y, Z - 축의 한계값 셋팅
Force - 가중치를 조정(0은 넣지 말자)
EditBone - 본툴로 본 사이즈를 조절한 후 누르면 스프링포인트위치가 정렬됨



사용법은
1 스크립트를 실행한다.
2 적당한 노드에 링크한다.(단독으로 테스트할때는 필요 없음)
3 메쉬나 오브젝트에 맞게 사이즈 조절한다.(스케일로는 하지는 말것)
4 본 길이가 변경되면 'EditBone'를 한번 누른다.
5 흔들릴 각도를 셋팅한다.
6 스프링포인트가 적당한 값을 갖도록 스프링 셋팅을 한다.
7 본이 스프링에 비슷하게 움직이도록 Force값을 적는다.(스프링포인트가 많이 흔들리는 프레임에서 적용하면 쉽다. 단 적용된값은 바로 표시되지 않으므로 이전프레임으로 갔다가 다시 원래 프레임으로 온다._
8 중간에 본길이를 조정한다면 스프링값이 적용되 않는 프레임(대부분 0프레임)에서 조정하자

언제 수정될지는 모르겠지만 큰 버그가 없는 이상 버전업은 없을것 같다.

2014년 3월 8일 토요일

Boy


Boy from Nlbo75 on Vimeo.

2008년에 작업한 타이페로라는 게임의 작업물이다. 캐쥬얼게임의 캐릭터로 이런저런 공부도 많이했고 애니메이션의 반응도 나쁘지 않았는데 결국 사장이 된게임. 회사를 나온 후에 들은 풍문으론 본전은 뽑았다는것 같다. 무료 툴인 버처덥으로 동영상들을 끼워 맞추려니 튀는 부분이 있다.

2014년 3월 3일 월요일

쫀득리깅


쫀득 from Nlbo75 on Vimeo.

예전에 잠시 진행했던 프로젝트의 캐릭터.
쫀득함을 살리고 파츠교환이 되는 캐릭터의 테스트 모션.
모델링은 다른 분이 작업하셨다.

이때부터 천둥벌거숭이가 리깅에대해 생각하게 된것 같다.
그래도 아직까지 미흡한 부분이 많은것 같다.

타란튤라 테스트


Tarantula from Nlbo75 on Vimeo.

모바일게임용 테스트 몹 타란튤라.
소녀와 다르게 상당히 리얼한 느낌이다.
바이패드 두개를 이어붙여서 실제로 필요없는 본이 꽤 들어있다.
작업한 바이패드 흉내내기 스크립트로 필요한 것만 뽑을 수 있도록 수정해야 할것 같다.
모델링은 다른분이 진행하셨다.

이 몹을 작업하면서 '바이패드 흉내내기 본' 작업을 생각했다.
모델링과 원화를 받고 리얼한느낌에 '보스몹이구나!' 하고 작업을 했는데
나중에 구현된것을 보니 쪼랩 몹이었다.ㅋㅋㅋㅋ
덕분에 애니메이션은 어느정도 덩치가 있는 몹으로 상정하고 작업을 했다.

소녀 테스트 모션


Girl from Nlbo75 on Vimeo.

모바일게임용 테스트 캐릭터.
개인적으론 손발이 작아서 수정을 해야 할것 같다.
(손발의 움직임이 잘 않보인다.)
또한 게임 캐릭터로서 개성이 약한 느낌이다.
모델링은 다른분이 작업하셨다.

테스트를 위해 작업된 모델링이기에 면의 수도 적고, 본의 수도 적기 때문에
표현의 한계가 있다.
색상또한 밝은 색이 대부분이고, 손이 작은 상태에서 옷과 색이 겹치며 동작이 확실히 보이지 않는 느낌이다.

개인적으론 '록맨'이나 '덴마'의 캐릭터같이 손발이 크고 선이 더 굵은 것이 모바일 화면에서 더 좋은 퀄리티를 낼수 있을것 같다.

나중에 여건이 된다면 유니티로 작업된 파일도 올리고 싶다.