자기소개서에 대한 내용만 한번 올려보겠습니다 .. 면접 연락이 한곳도 안와서 참 답답하네요 ...
선배 개발자 분들의 조언 부탁 드립니다 .. 감사합니다.
포트폴리오는 링크로 제출하고 있습니다
URL : https://www.youtube.com/watch?v=-lJ5BOHgaCA
-------
안녕하세요, 유니티 클라이언트를 꿈꾸는 000입니다. 듣기 좋은 미사여구들로 제 자신을 과대 포장하거나, 성장 과정, 성격의 장단점 등 개발자로서의 능력을 판단하는데 도움이 되지 않는 내용들로 글자수를 채우는 행동은 하지 않겠습니다. 지금 이 글을 보고 계시는 면접관님에게 가장 필요한 정보인 ‘개발자로서의 능력’에 대해 거짓없이 솔직하게 기재 하겠습니다.
1인 개발이 아닌 이상 모든 게임 제작은 협업을 통해 진행 됩니다. 때문에 협업에 대해 배우고자 팀 프로젝트를 진행 하였습니다. 유니티 커뮤니티 사이트를 통해 인원을 모집하여 총 5명(개발 2명, 기획 1명, 그래픽 2명)의 소규모 팀이 이루어 졌으며, 첫 번째 프로젝트는 유명 게임인 ‘Fruit Ninja’의 모작을 만들었습니다. 현업에 계신, 경력이 풍부한 개발자분이 계셨기 때문에 그 분이 전체적인 프로그래밍을 담당했으며, 저는 주로 UI를 담당하였습니다. 제가 구현한 기능들 중 몇가지를 기재하겠습니다.
1. 메인 화면 구성
- UGUI의 Canvas Scaler 컴포넌트를 이용하여 다양한 해상도에 대응할 수 있도록 구현
- UI 애니메이션을 사용하여 게임 제목에 효과를 주는 기능 구현
- 사운드를 조작할 수 있는 버튼을 구현하고, PlayerPrefs를 사용하여 설정값이 메인 게임에서의 설정과 연동되도록 구현
2. 스테이지 선택 화면 구성
- 특정 조건이 만족 되었을 때만(이전 스테이지가 클리어 되었을 때만), 다음 스테이지 선택 버튼의 이미지가 변경되고(자물쇠 이미지가 사라지고) 버튼 컴포넌트를 활성화하여 버튼 선택이 가능하게끔 구현
3. 게임 화면 구성
- 일시정지 버튼을 구현하여 일시정지 버튼이 눌린다면 TimeScale 값을 조절하여 시간이 흘러가지 않게 구현
- 일시정지 메뉴에는 메인 화면으로 이동, 다시 하기, BGM과 효과음의 ON/OFF 기능을 구현
- 게임 화면 상단에 흘러가는 시간 표시
- 스크립트의 변수값과 UI 텍스트를 연결하여 각종 정보 표기
- HandHeld.Vibrate() 함수를 사용한 특정 상황에서의 진동 기능 구현
- 안드로이드 플랫폼에서 뒤로가기 버튼 선택 시 게임 종료 여부를 묻는 팝업창 출력 기능 구현
4. UI의 앵커 프리셋을 알맞게 설정하여 다양한 기기에서 개발자가 설정한 UI 배치가 깨지지 않도록 구현
몇몇 기능들은 다른 한명의 개발자가 만들어놓은 코드를 해석하여, 중간중간에 수정을 가하는 형식으로 진행이 되었기 때문에 타인이 작성한 코드를 해석하는 훈련도 되었으며, 코드를 작성할 때 내가 작성한 코드를 해석해야 하는 상대방의 입장도 고려하여 작성해야 한다는 걸 깨닫게 되었습니다. 또한 포트폴리오 개발 시 UI 구현에 큰 밑바탕이 되었습니다. 두 번째 프로젝트는 현재 기획 단계에 있으며, 2D 게임을 만들어볼 예정입니다.
팀 프로젝트를 진행 하면서 제가 구현했던 기능들은 어찌보면 대단치 않은 소소한 기능들입니다. 하지만 팀 프로젝트를 진행하면서 얻은 가장 큰 수확은 ‘커뮤니케이션의 중요성’을 느꼈다는 점입니다. 협업을 진행하다보면 여러 가지 갈등이 생기기 마련입니다. 각자의 업무 능률에 따른 갈등, 서로간의 의사소통 과정에서의 갈등, 상대방의 열정에 대한 갈등 등 .. 팀 프로젝트를 진행하면서 프로그래머에게 필요한 능력 중 하나를 새로 발견 하였습니다. 바로 ‘커뮤니케이션 능력’입니다. 프로그래밍의 기술적인 문제는 결국 해결되기 마련입니다. 하지만 사람과 사람과의 관계는 기술적인 문제보다 훨씬 더 복잡하고 해결하기도 힘들다고 생각합니다. 갈등이 생길 시 역지사지의 자세로 상대방을 이해하려 노력했고, 불평불만을 하기보다 팀원들을 위해, 프로젝트를 위해 내가 조금 더 희생하는 자세를 갖추려고 노력 했습니다. 약 2년간 게임 회사 CS에서 근무 하면서 고객들과 소통했던 경험이 많은 도움이 되었습니다.
유니티는 ‘부딪치면서 배우자’라는 마음 가짐으로 이것저것 최대한 만들어보려 노력 했습니다. 사실 제가 제출한 짧은 포트폴리오 영상만 보시더라도 현업에 계신 개발자 분들이라면 어떠한 기술이 들어갔는지 확인이 가능할 것입니다. 전쟁이라고 불러도 부족하지 않을 요즘 취업 시장에서 ‘어떻게하면 남들보다 뛰어날 수 있을까’라는 고민을 많이 했습니다. 제가 내린 결론은 ‘꾀 부리지 말자’였습니다. 누군가 보기에는 제가 제작한 게임을 보고 특별할 것 없는, 누구나 만들 수 있는 게임이라고 판단할 수 있습니다. 물론 틀린 말은 아닐 수 있습니다. 다만 저의 현재 개발 능력을 최대화해서 많은 기능들을 담아내려 노력 했으며, 꾀 부리지 않고 열심히 만들었습니다.
위에서 설명했던 방식대로 포트폴리오에서 구현한 기능들에 대해 간략히 설명 하겠습니다. UI에 대해서는 팀 프로젝트 개발 시 구현했던 기능들에 기반하여 만들었기 때문에 중복되는 부분에 대한 설명은 제외 하겠습니다. 게임에 대한 전체적인 자세한 설명은 유투브 동영상(URL : https://www.youtube.com/watch?v=y_JqH5oupvg)을 통해서도 확인이 가능한 점 참고 부탁 드립니다.
1. 메인 화면 구성
- ‘처음부터’와 ‘이어하기’ 버튼을 구현하고 각 버튼에게 알맞은 함수 설계 및 연결
(ex:’이어하기‘ 버튼 선택 시 PlayerPrefs에 저장되어 있는 최고 레벨과 HP 정보를 불러옴)
2. LoadLevelAsync 함수를 사용하여 로딩 화면 구성과 로딩 완료 시 FadeIn 기능 구현
3. 유니티의 기본 제공 패키지인 CrossPlatformInPut를 사용한 조이스틱을 통해 캐릭터의 이동을 구현
- Quaternion.LookRotation을 사용하여 자동 타켓팅 기능을 구현(적 캐릭터에도 구현되어 있음)
- Events 기능을 사용하여 발이 지면과 충돌하는 정확한 순간에 발소리가 들리게 구현
- LateUpate와 Lerp를 사용하여 부드러운 카메라의 이동을 구현
4. 공격 및 방어
- 공격 버튼 터치 시 컨트롤러에 미리 설정되어 있는 3개의 공격 애니메이션 중 하나의 애니메이션을 무작위로 실행
[소스 코드]
string attackState=string.Format(“Attack{0}”, Random.Range(1, 4));
animatorCtr.Play(attackState);
- 피격 시 상대방의 애니메이션 상태값을 참조하여 피격 애니메이션 실행
(ex:상대방이 ‘Attack1’ 애니메이션을 통해 공격 시 ‘Damage1’ 피격 애니메이션이 발동)
- 피격 시 위치값을 참조하여 피격 이미지와 글씨 이펙트 생성. 생성 될 때마다 크기와 각도가 달라지게끔 구현
- Events 기능을 사용하여 공격 애니메이션을 실행하는 동안에만 Trail Renderer 컴포넌트를 사용하여 반투명의 궤적을 표현하였고, 타격을 가하는 정확한 순간에만 콜라이더를 활성화하여 불필요한 충돌을 최소화
- 방어 버튼을 누르고 있는 동안에는 방어 애니메이션을 실행하며, 이동이 제한되고 피격 시 받는 데미지가 1/4로 줄어듬
- UGUI에는 NGUI의 OnPress 기능이 존재하지 않기 때문에 Event Trigger의 Pointer Down, Pointer Up의 기능을 사용하여 OnPress 기능을 구현
-플레이어의 HP가 0이 될 시 Hierarchy에 존재하는 모든 적을 검색하여 foreach와 SendMessage를 사용하여 플레이어가 사망했다는걸 알림
[소스 코드]
void PlayerDie()
{
GameObject[] enemys = GameObject.FindGameObjectsWithTag(“ENEMY”);
foreach(GameObject enemy in enemys)
enemy.SeneMessage(“OnPlayerDie”, SendMessageOptions.DontRequireReceiver);
Invoke(“DiePopup”, 1.5f);
}
5. 스태미나 시스템 및 인공지능
- 열거형 변수를 선언하여 적의 상태를 구분하였고, 스테이지 시작 시 Start() 함수에서 두 개의 코루틴 함수(상태에 따라 열거형 변수의 값을 바꿔주는 함수와 열거형 변수의 값에 따라 캐릭터의 움직임을 제어하는 함수)를 실행하여 적의 움직임을 제어. 매프레임마다 체크할 필요는 없기 때문에 자원 관리를 위해 0.2초마다 한번씩 실행(WaitForSeconds 사용)되는 코루틴 함수를 사용
- 스태미나 게이지의 fillAmount 값을 조절하여 시스템 구현. 공격 시 게이지가 차감되며, 매프레임마다 게이지가 회복됨(동일한 값을 주기 위해 deltaTime 역시 사용)
- fillAmount의 값이 0.3이하가 될 시 이미지의 색을 변경하고, 공격력과 방어력이 50%로 차감. 적의 인공 지능은 값이 0.3이하가 되는 순간마다 난수를 생성하여 50% 확률로 열거형의 값을 도망 모드로 변경. 도망 모드 시 적은 공격을 멈추고 플레이어와 일정 거리 이상으로 벗어날 때까지 계속해서 뒤로 이동. 이때 피격 시 100%의 확률로 플레이어의 공격을 가드(평상 시에는 50% 확률). 스태미나가 70% 이상 회복될 시 열거형의 값을 공격 모드로 다시 변경.
저는 학원을 다니지 않았습니다. 제가 지금 보유하고 있는 개발 능력은 모두 독학으로 습득한 것입니다. 학원을 다니지 않고 혼자 공부한 이유는 총 3가지입니다.
첫 번째, 제 자신의 능력을 믿어보고 싶었습니다. 두 번째, 프로그래머에게 필요한 능력 중 하나가 ‘모르는 것을 알아내는 능력’이라고 생각합니다. 모든 것을 알고있는 프로그래머는 없다고 생각합니다. 특히 신입이라면 일을 하다가 막히는 경우가 더 자주 발생할 것입니다. 항상 사수에게 의존할 수는 없으니, 구글링이나 본인이 가지고 있는 코드를 찾아보는 행동 등을 통해서 문제를 해결하려 할텐데, 그런 능력을 사전에 키워서 입사 후 업무 속도가 떨어지는 것을 방지하고 싶었습니다. 세 번째, 정답을 쉽게 얻고 싶지 않았습니다. 공부를 하거나 게임을 만들 때 막히는 부분이 생기면 길게는 며칠씩 진도가 나가지 않는 경우도 있었습니다. 학원에 다녔다면 선생님이나 주변 지인들에게 질문을 하여 쉽게 답을 얻어냈을 것입니다. 하지만 무엇이든 쉽게 얻는 것은 쉽게 잃는다고 생각합니다. 혼자 몇시간씩, 며칠씩 고민하면서 두 번째 이유에서 언급한 ‘모르는 것을 알아내는 능력’을 키웠고, 영어 도큐먼트에 대한 거부감을 줄였습니다. 가장 중요한 것은 얻어낸 답을 쉽게 잃어버리지 않았습니다. 쉽게 얻어낸 지식이 아니기 때문에 투자한 노력에 비례하여 보다 깊숙이 머리에 각인 되었습니다.
습득하고 있는 언어는 C, C++, C#입니다. 저는 절차 지향 언어보다 객체 지향 언어를 선호하는데, 클래스를 설계하고 다른 클래스와의 상호 작용을 프로그래밍 하는 것에 재미를 느끼고, 게임에서 가상 세계를 만드는 것과 유사하다고 생각되어 OOP를 설계하는 것에 가장 흥미를 느낍니다.
사람의 머리가 모두 그렇듯, 되새기지 않는 기억은 점점 흐려지기 마련입니다. 유니티를 매일 다룬다고해서 프로그래밍 언어에 대한 지식이 사라지지 않는다고는 생각하지 않습니다. 때문에 무슨 일이든 기초가 가장 중요하다고 생각하고 있는 저로서는 언어에 대한 공부를 매일 조금씩이라도 복습하고 있습니다. 물론 제가 위의 3가지 언어에 대한 습득 능력이 완벽하다고 생각하지 않는 이유도 있습니다. 언어에 대한 공부 방법으로는 예제 프로그램 만들어보기, 이론적인 내용 복습하기, 인터넷에 올라오는 질문글에 답변해주기 등이 있습니다.
요즘은 자료구조와 알고리즘에 대한 공부를 하고 있습니다. 저는 전공자가 아니기 때문에 전공자들이 이수한 과목들을 모두 공부하려면 시간이 필요한 것은 사실입니다. 하지만 시간의 차이는 노력에 의해 좁혀질 수 있다고 생각합니다. 지금도 계속해서 노력을 더하여 시간의 차이를 좁혀가고 있으며, 공부한 과목들에 있어 차이는 있으나 공부의 깊이에 대해서는 결코 뒤처지지 않는다고 생각합니다. 과제, 시험, 일정 등에 쫓기지 않았기 때문에 ‘시험을 위한 공부’는 하지 않았습니다. 이해가 되지 않는 부분들은 이해가 될 때까지 얼마의 시간이 걸리든 다시 한번 곱씨어 생각 하였습니다.
‘최선을 다하겠습니다’, ‘회사의 큰 도움이 될 것입니다’ 라는 말은 면접관님에게 와닿지 않는다는 것을 알고 있습니다. 또한 지금 당장 제가 회사의 큰 도움 혹은 자산이 될 것이라고 생각하지도 않습니다. 아직 많은 것이 부족하다는 것을 알고 있기 때문입니다. 그럼에도 저에게 기회를 주신다면 한가지는 반드시 약속 드리겠습니다. ‘신입 사원’다운 모습을 보여드리겠습니다. 새로운 것을 배우는 것에 겁내지 않고, 가능성을 키우기 위해 노력하며, 선배님들을 믿고 따르고, 노력하는 모습을 보여드릴 것을 약속 드립니다.
이상으로 저의 소개를 마치겠습니다.
시간내어 읽어 주셔서 감사 드립니다
그럴듯한 개소리내요
나 초보임 하는거 홍보하는느낌이지만
나도 초보라 훈수못두겟다 ㅋㅋㅋ
학원다님?? 학원포폴에서 소개할때 자막나오는거같은느낌인데 이런게 보통포폴양식??같은느낌임? 다들원래이리함? - DCW
아 학원안다니고 독학이라써있네 - DCW
근데 다른사람이 전체적인 프로그래밍을 담당했다하면...거짓말 하란건아니지만 그럼개발로 별거한거없네...라고생각할거같음. 자료구조 알고리즘도 배우고있으면 모르는거고 아직 준비안된사람이라생각할거같은데 - DCW
회사는 배우러가는 학원학교가아니라 이력서에 뽑아주면 많이공부할꺼임 요새공부하고있음 이런거보단 이런거이런거 공부했음 이런거 할줄암 이런게당연하다는데... 나도내앞가림안되지만 걍 내생각임 저 님보다못하는수준이겠지만 걍 자소서보고드는생각 - DCW
일단 첫문단부터가 중2병 미사여구임. 간결하게 내가 뭘할수있고 뭘해봤고 뭐가 하고싶은지를 제일 어필해야되는데 비전공자에 약점만 지나치게 늘어놓고 자격지심에 변명하는글같아보이는데 냉정하게 내가 회사오너나 인사부면 이런사람 뽑고싶은지부터 되물어보세요
그리고 포트폴리오 더 만드세요 하나만 만들어놓고 내면 이걸 베껴서했는지 혼자 만들었는지 알도리가 없음
ㅇㅇ 첫 문단부터 미사여구.
온통 과장된 수식어 뿐.
포폴 이런식으로 쓰면 안되지 무슨 대학생들 과제 레포트 쓰냐?? major, critical한 것만 적어야돼.
위시켓 가서 프리랜서들 포폴 구경 하고 와
회사가 과연 부족한 사람을 뽑으려 할까ㅋㅋ
너도 나도 싫어하는 땔감 UI를 하겠다고 자청하니 일단 합격이네여 축하드립니다
첫번째 문단은 첫번째 문장빼고 다 지워라
세줄요약좀