카툰쉐이더의 마지막 부분인 스펙큘러를 다루게 되었다. 그중 블린 퐁 개념을 짚고 넘어갔다. 이번엔 PPT없이 칠판에 그려가면서 했는데 역시 아직은 동적으로 그려가면서 설명하는건 안익숙해... 진짜 확실하게 알고있는 내용 아니면 알려주면서 뇌정지가 온다...
새삼스레 또 나의 부족한점을 느끼는 순간이였는데 그래도 잘 넘어...간거같...다.. 일단 이건 나중에 다시 PPT만들어둬야 나중에 후배들이 복습할떄 이해할수있을거같고 과외 하면서 어차피 이거 또 다루기 때문에 종강이후에 PPT만들어 놔야겠다.
스펙큘러 연산 다 한거 그대로 넣으니 스펙큘러 크기가 너무 넓어서 쩅한 느낌이 강해서 제곱을 해주는 이유를 짚어준다든가 그런식으로 작업 하나씩 할떄마다 그게 어떻게 표현되는지 보여주고 알려주면서 진행했다. 그렇게 진행하면서 버그 터지는것도 봐주면서 천천히 진행하니 시간은 금방 갔다.
그리고 마지막으로 저 블로그에서는 스펙큘러 크기와 단계별음영은 프로퍼티로 안만들어놨었다. 그래서 단계별음영이랑 스펠큘러 조절하는 프로퍼티를 만들어 보라고 했다. 곧잘 잘하는 친구들도 있고 못하는 친구도 있었는데 시키길 잘 한거같다.
이렇게 하니까 코드 어느 부분에서 단계별음영 처리를 하고있는지 스펙큘러 연산처리를 하고있는지 파악을 해야되는데 그것을 할 수 있다는 거 자체가 이제 쉐이더 코드를 읽을 수 있다는 거잖아! 와!!! 그럼 내가 4주동안 고생하면서 수업 준비한 보람이 있지!!
사실 어려워 하는 친구들이 많았고 별 이상한 버그가 터질때마다 옆에 붙어서 1:1로 짚어주는데 기억에 남는 친구가 하나 있다. 안되면 " 어헝ㅇ헝 이거 안대요 ㅠㅠㅠㅠ " 하면서 부르는데 약한 소리 하면서 모르는건 모른다고 이야기 해주고 그럼 내가 그부분을 다시 설명해주고 그래도 모른다고 하면 비교,비유 하면서 알 때 까지 설명해줬다. 이런식으로 그 친구는 질문하고 이해는 꼭 하고 넘어갔다. 좋은 태도이고 덕분에 내 실력도 늘었다. 그리고 유니티 C#코드에서 쉐이더 코드에 접근하는 방법이 궁굼하다고 해서 아까 프로퍼티로 만들었던 단계별음영의 갯수 변수에 접근해 시간이 지날수록 음영의 객수가 늘어나는 기능을 만들어봤다. 이렇게 해서 쉐이더는 끝!!!
다음주 화요일 11일차를 마지막으로 튜터링 종강!@!@!#@$!@~!~ㅇ이야호우!!!!!!!!!! 마지막이니까 뭔가를 알아보기보다 내가 팀빌딩하면서 삽질했던 부분 , 앞으로 뭘 공부하는게 좋을지 , 우리가 배운걸로 뭘 할 수 있을지 , 이런것들을 정리해서 이야기 해볼 생각이다.
내가 몇년전에 쉐이더 언어를 처음 봤었을떄 항상 보던 (유니티 C#) 코드들의 형태와는 전혀 다른 쉐이더언어를 보면 낯설었고 그게 매우 부담스러웠다. 그렇다면 다른 사람들도 마찬가지일것이다. 그래서 처음에 시작한건 낯선것을 익숙하게 만들기였다.
기본으로 제공하는 standardShader를 열고 그 요소 하나하나씩 분석해나갔다. 그러면서 어? 뭐야 별거 아니네 하는 생각이 들게 끔 유도했다. 대충 익숙해졌다면 그때부터 카툰쉐이더코드를 분석해나갔다.
일단 카툰쉐이더 핵심은
1. 외곽선
2. 단계별음영
3. 끊어진 스펙큘러 라고 생각했다. 그래서 블로그글을 참고로 그 단계들별로 어떤 작업이 이뤄지는지 개념적으로 훑고 지나갔다. 그리고 이미 이것을 위해 삼각함수와 벡터의 내적 개념도 알려줬었고 게임에서 활용까지 해봐서 막히는건 없었다.
단계별 음영이 이제 이런저런 이야기가 많이 나오는 부분인데 코드를 본격적으로 쓰기 전에 코드들 하나하나가 무엇을 의미하는지 하나씩 살펴보며 해당 블로그 글에서 언급이 안된 부분들을 먼저 알려주고 시작했다.
이런식으로 하나하나씩 끝까지 다 짚어주면서 넘어갔다. 이러면 하나도 모를게 없어!! 내가 100퍼센트 다 알려줬거든!
그리고 내적을 통해 빛 계산하는 부분도 이런식으로진짜 하나하나 봐주면서 왜 이런 계산을 했는지 짚어줬다.
그리고 내가 굳이??? 왜??? 이렇게??? 하는 부분들은 다시 생각해보고 결론을 얻어내는데 값을 굳이 늘렸다가 줄이는 이유가 뭘까? 생각을 해보니 Ceil 함수를 쓰기 위해서 였다. 그래서 내가 했든 고민을 먼저 제시해주고 총 정리를 하면서 이렇게 계산한 이유를 정리해줬다.
아무튼 9일차는 단계별 음영까지 4주 동안 만든게 3시간만에 뚝딱!! 쉐이더는 완전 모르는 분야였지만 생각보다 제작한 시간이 너무 많이 걸린거같다. 뭐 물론 이것 저것 시행착오와 모르는 것을 내것으로 만들고 남들에게 알려주기 위해 지식을 재가공 하는거 자체가 오래 걸리긴 하지..
아 생각해보니 그 전에 수학개념도 다루긴 했으니까 그거 포함하면 5시간만에 뚝딱 당한거네 아무튼 투자대비 아웃풋이 그렇게 좋은편은 아닌거같다. 좀 더 빨리 만들 요령을 익혀야겠다. 아 그리고 당연 저 이미지는 매우 일부이고 더 많은 PPT가 있습니다. 하지만 다 올릴수가 없어 ㅠㅠ
원래 오늘 벡터의 내적외적만 다루려고 했는데 세상에 단 50분 만에 격파!!!! 이럴수가... 그래서 렌더링파이프라인까지 하고 쉐이더 surface 기본형 코드 보면서 일단 쉐이더랩에 익숙해지는 과정 초반 부분까지만 하고 끝냈음.
그래서 렌더링파이프라인까지 하고 쉐이더 surface 기본형 코드 보면서 일단 쉐이더랩에 익숙해지는 과정 초반 부분까지만 하고 끝냈음.
음...쉐이더 이건 키보드 치는것보다 설명하는게 굉~~~~~~~~~~장히 많아서 아 그때 저녁 안먹고 과제 제출한거 체크하고 바로 튜터링 들어갔었는데 진짜 힘들어 뒤지는줄알았다... 다음부턴 저녁 든든하게 먹고 수업해야겠네 쉽지않아..
벡터 내적 공식을 유도? 하지는 않고 왜 이렇게해서 값이 도출 될 수 있는지를 설명해주는 방향으로 갔다. 그리고 개인적으로 식을 전개해나갈때 어디 부분을 하고 있는지 놓쳐서 멘붕오는 경우가 많았는데 그걸 방지하기 위해서 지금 어디 부분을 하고 있는지 항상 체크해줬다.
그리고 내적을 통해 각도를 얻어내는 방법을 알려줬다.
그리고 쏼라쏼라 알려준 다음 최종 정리로 아무튼 역삼각함수와 삼각함수를 어떨때 사용해야 하는지 정리해줬다. 이런 개념들을 알려줄때는 마지막으로 정리해서 뇟속에 때려박아주는게 중요한거 같다. 그 과정들은 잘 이해 못하더라도 결과만 외우고 있어도 평타는 치는거니까
그리고 쉐이더 작업할때 작업하기 수월한 인프라를 구축하고 쉐이더가 뭔데 부터 시작을 해서 렌더링 파이프라인을 쭉 설명해줬다.
이것도 단 30분만에 격파당했음 허....이거 생각보다 만드는데 오래 걸렸는데... 예전에는 생각보다 시간이 부족했던 경험이 많았는데 이번엔 시간이 남는 경험이 더 많네... 그렇다면 좀 더 여유를 가지고 계속 애들이 이해했는지 질문으로 확인하고 넘어가는걸 자주 해줘야겠다.
7주차 이전 까지는 버그에 익숙해지기 위한 그리고 나름의 개발 노하우들 이였다면 7일차 이후부터는 진짜 새로운 것들을 위주로 다루게 되었다. 어쩌다 보니 1부와 2부 형식으로 되었는데 이렇게 된 이유는 튜터링을 진행하면서 서로 실력차이가 나서 잘 하는 애들이 조금 지루해 하는 모습들이 보여서 실력차를 줄이기 위해 그냥 애들이 전부 모르는 분야를 알려주기로 했음. 나도 몇개월 전 까지만 해도 모르는 분야고 지금도 책 10번씩 다시 보면서 PPT 만들어 가는 중임. 하지만 멍청한 나도 이해 했다면 다른 애들도 충분히 이해 할 수 있을꺼임 그래서 7일차 이후부터는 쉐이더를 쓰기 위한 기본적인 게임수학들을 다루면서 쉐이더를 가르칠 생각이다.
일단 게임수학중 삼각함수 벡터의 곱셈 요 2가지의 개념을 쉽게 풀어서 설명하고 게임에서 어떻게 써먹을 수 있는지 프로젝트로 만들어 보고 이런 과정들로 개념들을
더 잘 이해하고 확립한 이후 쉐이더에 들어가면 바로바로 이해가 가능하도록 커리큘럼을 짰다. 그래서 7일차. 삼각함수를 다뤘다. 삼각함수의 개념을 설명했다. 삼각함수를 대충 알지만 이걸 어떻게 써먹게 될지 중점으로 알려줬다.
그리고 게임에 어떻게 적용 시킬지 활용은 OZ아조씨의 수포겜수를 활용했다. 사실 이거 보고 광명 얻었었음 ㅋㅋㅋㅋㅋ
그래서 일단 대충 프로젝트까지 만들어보고 끝냈음 !
[ 문제점 발견 ]
세상에... 과제를 하나 내줬었는데 코드들이 다... 생각보다 기괴하네... 버그 음청 내보고 고쳐보고 하라는 취지로 과제를 내줬었는데 버그 이외의 코드들을 보니 생각보다 심각해서 과제 내주길 정말 잘했다는 생각이 듬
생각 해보니까 과외 했을 때는 기능 구현 해오라고 시키면 바로 거기에서 프로젝트 열어서 깠기 때문에 저절로 안좋은 습관이나 비효율적인것들 지적해줬는데 이번에는 1:다수라서 그런 부분들을 지적해 주지 못했네...
그래서 첫번째로 본 과제는 대충 텍스트로 지적해 줬는데 솔직히 텍스트로 지적하니까 아무말 대잔치같아 보임 그래서 두번째로 본 과제는 깔곳이 많아서 그냥 PPT만들어서 지적해주기러 함. 효율적으로 까는 방법을 고안해야겠다.
아 근데 이렇게 하니까 8명 애들 하나씩 다 봐주려니까 들어가는 시간이... 이게뭐야 살려줘요
[튜터링 6일차] 추가로 새로운 것들을 가르키기 위해서 오늘 몰아서 전부 다 했다. Static, 싱글턴 , 코루틴 , FSM 다 했음 개념설명이 많아서 다 되긴 되더라 와오... FSM은 구현이 제일 힘들긴 한데 그거 하면 이틀정도 필요할 거 같아서 구현은 안했음.
일단 Static !
1. 자연스럽게 쓰고 있던 함수들중 Static이였던 함수들을 소개해주면서 Static의 유용함을 알려줬다.
2. 그러면 유용하니까 다 쓰면 되지않을까???? 하는 의문도 남겨줬다.
3.하지만 어림도 없지! 크게 2가지 이유로 안되는 이유를 들어줬다.
그리고 Static의 활용 방법들을 가르쳐 주고 이걸로 최종 마무리 지었다. 블로그 출처를 남겨놓을껄 그랬네 이거 정리한거 너무 깔끔해
그리고 싱글턴은 기본 개념하고, 기본적인 틀하고 기본 사용 방법만 알려주고 빨리 넘어갔음 그리고 코루틴!! 코"루틴"을 이해시키기 위해서 서브"루틴"과 같은 다 비슷비슷한 아무튼 함수인 애들을 알려줬다. 아무튼 "루틴"은 함수이다. 그렇다면 코루틴은?? 하면서 자연스레 이해가 되게 해줬다
요거를 더 쉽게 이해시키고 싶어서 원펀맨에서 음속의 소닉이라는 친구가 있는데 이녀석은 엄청 빠르게 움직일 수 있는데 분신술 또한 엄청 빠르게 움직여서 원래는 하나지만 여러명 인것처럼 보이게 한다. 이 녀석들 예로 들어주면서 코루틴이 어찌 돌아가는지 대충 상상시켜줬다.
그리고 일반함수와 코루틴과 큰 차이점 블록킹 현상의 유무를 언급했고 코루틴 함수의 특징을 설명하기 위해 자원을 넘긴다를 표현 해주고 싶어서 맥크리가 궁 쓰다가 아나한테 수면총 맞아서 잠자는 짤을 예로 들면서 코루틴의 Yield Return을 설명 시켜줬다.
그리고 코루틴 잘 멈추는 방법도 알려줌... 코루틴 이 씨 멈추는게 까다롭고 버그도 안알려주고 그래서 내가 예전에 2주동안 개 삽질해서 개빡쳤었음 그래서 내가 개짓거리 한거 겪게 하고 싶지않아서 아주그냥 강조 많이 했다.
FSM은 개념만 간단하게 설명했다. 그냥 조건에 따라서 상태가 전이된다. 그정도만 빠르게 설명했음. 코드까지 해주고 싶었고 이 코드 구현이 중요하지만 시간이 읍서 ㅠㅠㅠ 대충 원래 하려던 것 다 끝냈다!!!
이제 새로운거 배울 차례야.... 쉐이더를 가르치기 위한 삼각함수부터 내적 외적 그리고 이것들을 게임에서 어떻게 활용 가능한지 그리고 셀 쉐이더까지! 과제 땜에 음청 바쁠거같은데 몰겠네 일단 해봐야지
[ 4일차는 건너 뛰고 5일차 ] 저번에 뭐 어떻게 했는지 하나도 기억 안남ㅋㅋㅋㅋ 그래서 5일차부터 ㅋㅋㅋ 일단 대충 4일차 때 핵심 이야기가 자료구조 배열과 리스트 장단점을 이야기 했었음. 그래서 그 자료구조를 이용해서 오브젝트 풀링 구현 했음.
그리고 이번에 수업계획을 바꿨다. 원래 지향하는게 버그 잘 나는거 짚어주고 애매한 부분 짚어주는거였는데 실력차가 좀 나서 잘 하는 애들이 지루해 하는 느낌을 받았고 나같아도 그럴거 같았음 그래서 학생들 전부 다 모르는 수학개념하고 쉐이더를 다뤄주기로 했다
그럼 실력차 없이 공평하게 다 못하거든!! 그래서 학교에서 일단 배울수 있는 것들은 수업계획에서 다 뺐음. 학교에서 안가르치고 독학으로 해야 하는 것들을 가르쳐주는게 나중에 더 큰 도움이 될거라 생각되기도 하고. 그래서 지금 PPT 만들어야 할 게 음청 생김 젠장...
쨌든 그렇게 하고 오늘 시간이 많이 없어서 호다닥 충돌체크랑 레이어 나눠서 충돌처리 안되게 하는거 해줬고 옵젝풀 코드 원래 하나씩 쳐가면서 해야되는데 그러기엔 시간 없어서 내가 미리 써둔 코드 복붙해가면서 하나씩 설명해줬음.
확실히 시간은 많이 절약되는데 한번 쳐보는게 기억에 남을텐데...쩝.. 암튼 그리고 오늘의 초급자 삽질 뽀인트! 다른 스크립트에 접근 할 때 스크립트의 인스턴스를 생성하면 아예 새로운 객체가 생성되니 이렇게 하면 안돼!! 유니티에서 스크립트는 모노비헤이비어를 상속받고있고 이녀석들은 컴포넌트를 상속받고있다. 즉 스크립트 = 컴포넌트! 컴포넌트늘 항상 오브젝트에 붙어서 존재하고 있고 그래서 그 컴포넌트에 접근하기위해선 오브젝트에 먼저 접근해서 컴포넌트에 접근 해야한다. 그리고 스크립트는 컴포넌트니까 스크립트에 접근하는 방식도 컴포넌트와 마찬가지!
내가 첨에 이걸 모르고 다른 언어처럼 그냥 인스턴스를 만들고 접근했었는데 거기엔 오직 공허(NULL) 뿐이였어..
매번 장막을 들추는 제라툴좌..
그래서 담주에는 싱글턴 기법을 사용해보도록 해야겠고 세상에 과제 내줘야 되는데 그걸 까먹었네!!! 이런......
아 글구 요즘 애들 하나하나 보면서 수업하고 있는데 1일차에 쫓기면서 수업하는건 많이 나아졌다 내자신 성장하고 있다구!!!!