* 문자 집합(Charset)이란 컴퓨터에서 사용하는 문자들의 집합입니다. 그 집합들을 어떻게 모아두었느냐에 따라 이름을 정해주어야 구분해서 쓸 수 있겠지요. 문자집합의 이름으로는 유명한 ASCII, ISO8859, 유니코드 등이 있습니다.
* 인코딩은 해당 문자를 어떻게 코드화하겠느냐는 방식을 나타내며, 디코딩은 반대로 어떤 코드를 어떻게 문자화하겠느냐는 방식을 나타냅니다. 마찬가지로 방식에 대한 이름이 있어야 구분해서 사용할 수 있겠지요. 유니코드 인코딩, UTF, Base64, EUC-KR, CP949 등의 이름이 있습니다. 예상할 수 있듯이 문자 집합과 인코딩은 서로 뗄 수 없는 관계이기에 같은 이름이 많네요.
<아스키(ASCII)> - 최초의 문자집합이며 7bit를 사용합니다. ASCII라는 문자 집합을 구성하지 않고 컴퓨터를 개발했다면.. 정말 상상하기도 싫군요..
UTF-16의 BE(Big Endian), LE(Little Endian)의 바이트 순서에 따라 바이트를 읽는 순서를 다르게 처리해주어야 합니다.
UTF-8은 Byte Order와 무관하여 "EF BB BF"를 저장하며 처리하는 프로그램도 있고(메모장같은), 처리하지 않는 프로그램도 있습니다. 그래서 Visual Studio나 웹페이지 개발시에 문서의 인코딩 에러가 가끔 나타나는 문제가 있지요. 각각의 프로그램에 맞게 BOM을 삭제하거나 추가하여 사용하면 문제를 해결할 수 있습니다.
예전부터 유니티에 관심도 있었고, 관련 업무에서 Unity를 활용하는 일이 생겨 겸사겸사 수강을 하게되었습니다.
매일 연속 50일 작성.. 사실 못할줄 알고 시작한건데 끝을 보게 되네요 ^^; 블로그도 열심히 해보려했지만 업무등에 치이게 되면 멈춰버리는 경우가 많아, 내 자신에 대한 도전이라는 마음으로 진행을 했는데 마음은 뿌듯합니다. ㅎㅎ
특히 Unity 업무를 진행하고 있었기 때문에 하나라도 더 듣고 내것으로 만들자는 마음으로 더 열심히 했던 것 같습니다. 사실 시작한 김에 꾸준히 더 작성을 하려는 욕심은 있었는데 연말이라 ㅠ.,ㅜ; 쉽지 않네요..
자~ 유니티 게임 포트폴리오 완성 강의에 대한 전반적인 내용을 작성해 봅니다.
제가 수강한 강좌입니다.
"올인원 패키지 : 유니티 포트폴리오 완성 올인원 패키지 Online."은 기초 과정이 아닙니다. 기초 과정은 "C#과 유니티로 배우는 게임 개발 올인원 패키지 Online"라는 과정이 따로 있습니다. 저는 C#은 오랜 기간 사용을 해왔었고, Unity는 책을 보고 따라해본 경험이 있어서 초급 과정은 건너 뛰었습니다. 초급에서 중급을 넘어가시려는 분들이나 중급인데 디아블로나 배틀로얄과 같은 게임을 실무적으로 구현하는 방법을 알고 싶다하시는 분들에게 추천드립니다.
게임 포트폴리오라는 제목으로도 유추할 수 있듯이 "취업준비생"분들을 위해 실무에서 게임 개발시 필요한 지식들을 많이 알려줍니다. 사실 저는 취업준비생도 아니고 포트폴리오를 구성할 것은 아니었지만, "포트폴리오"라는 말처럼 Unity의 다양한 부분들을 접할 수 있을 것이라고 생각하고 접근을 하였습니다.
처음에 목차를 볼 때에는 여러 가지 게임을 만드는 포트폴리오 구성을 생각했었는데.. 실제로는 "디아블로"와 "배틀로얄" 2가지 게임을 집중적으로 구현해 보게 됩니다.
디아블로 구현 모습입니다.
한 단계씩 정리가 잘 되어 있습니다. Rigidbody를 시작으로 해서 Character Controller, NavMeshAgent를 활용하여 AI 이동 등을 구현해보게 됩니다. Animation에 대해서도 설명이 이어지지만 Unity 설정에 대해서는 자세하게 진행하지는 않습니다. 기초강좌가 아니기 때문입니다. Animation의 Transition에 대해서 자세한 설명이 이어집니다. TopDown Camera를 구현하여 어떻게 화면을 구성하는지를 구현해봅니다. 이 외에도 Light, FSM, AI, 시야, 전투시스템, 원거리공격, 인벤토리 구현, 문/함정 구현 등을 진행하게 됩니다.
이것이 끝이 아니라 위와 같이 Firebase를 활용하여 LeaderBoard를 구현하고 서버를 통해 연동해보는 실습도 포함되어 있습니다. 사실 디아블로에서는 그렇게 중요한 비중을 차지하는 부분은 아니지만 간단한 캐쥬얼 게임을 만들때는 많이 사용하게 되지 유용하다고 볼 수 있습니다.
이어서 배틀로얄(=배틀그라운드) 구현 모습입니다.
배틀로얄은 따라가기 조금 버거울 수 있습니다. 다만 인내심을 가지고 꾸준히 따라하시는 분은 굉장히 유용한 실무에서도 많이 사용될 Tool등을 만들어 볼 수 있습니다.
강의 시작에서는 취업준비생분들을 타겟으로 하여 실무 관련 많은 이야기를 합니다. 저는 지금은 다른 필드에서 먹고살고 있는 프로그래머이지만, 소프트웨어 업계의 공통적인 어려움과 문제점들은 비슷하다고 봐야겠지요. 그렇기 때문에 꼭 게임의 구현에 집중된 것이 아니라, 게임 개발에 플러스적으로 필요한 요소들 즉 관리 툴 같은 것들이 필요하게 됩니다. 저 또한 어떤 소프트웨어 업종에서 일하건간에 간단하게 구현하여 도움을 주는 툴들은 많이 개발을 해왔습니다. 실무에서 귀찮다고 안 하시는 분들이 대다수라고 봐야겠지요.. 너무 잘하셔서 안하시는 분들은 예외겠지만.. 여튼..
EffectTool, SoundTool에 이어 Behaviour 구현, Weapon 구현, Health, Alert, Shoot, Health 등 배틀로얄 게임을 구동하기 위한 다양한 클래스와 함수들을 구현해볼 수 있습니다.
조금 아쉬웠던 부분은 너무 많은 기능, 옵션을 설명해주시려고 하다보니 변수 선언, 초기화, 사용 등 따라해야할 코딩량이 너무 많았다는 느낌입니다. 최종적으로 배틀로얄 구현을 위해서 다 알아야 하는 부분도 맞고, 직접 코딩을 계속 여러번 해보면서 자신만의 코드가 되는 것이 맞습니다.. 하지만 온라인 강의이므로 최소 옵션으로 해서 코딩을 진행하고 다른 부분은 완성된 코드를 가지고 설명에 집중해주셨더라면 더 좋지 않았을까 싶은 개인적인 아쉬움을 남겨봅니다. 그래도 적은 강의 시간에 담기에 쉽지 않은 내용이라 충분히 감안하고 시청하였습니다. 특히 실무에서 사용되는 알찬 정보들을 원하신다면 강력 추천드립니다.
현재 Unity 업무를 진행함에 많은 도움을 받았습니다. 특히 NavMesh 개념과 Transition 처리 등은 참 멋진 개념이며 멋진 설명이었습니다.
패스트캠퍼스의 "업무자동화 MAX 올인원 패키지 Online" 강의 내용을 공부하며 정리할 예정입니다.
01. 엑셀 필수 기초 (Basic) I 데이터 축적 02. 엑셀 필수 기초 (Basic) II 데이터 생산 03. 엑셀 피수 기초 (Basic) III 데이터 분석 04. 엑셀 프로젝트(Project) 05. 엑셀 VBA 필수 기초 06. 엑셀 VBA 실전 프로젝트 07. 오토핫키 필수 기초(Basic) 08. 오토핫키 실전 프로젝트(Project) 09. 구글 스프레드시트 필수 기초 10. 구글 앱스스크립트 기본 및 실전 프로젝트 11. 파이썬 업무자동화 (Basic) 12. 파이썬 업무자동화 (Intermediate) 13. 파이썬 업무자동화 (Advanced)
구글 스프레드 시트는 좋기는 한데 너무 느려서 애매하고, 엑셀은 정말 많이 사용하고, 툴은 좋긴 하지만 지속 누군가가 수정을 해줘야 하는데 그렇게 여유로는 모바일 게임 개발사는 없을 것이기에.. 결국 Table of Data를 처리하기 위한 방법들이 필요합니다.
GeneralStats 스크립트를 해당 위치에 생성하고 작성을 시작합니다.
[CreateAssetMenu(menuName="PluggableAI/GeneralStats")] public class GeneralStats : ScriptableObject { [Header("General")] [Tooltip("npc 정찰 속도 clear state")] public float patrolSpeed = 2f; [Tooltip("npc 따라오는 속도 warning state")] public float chaseSpeed = 5f; [Tooltip("npc 회피하는 속도 engage state")] // 교전시 public float evadeSpeed = 15; [Tooltip("웨이포인트에서 대기하는 시간")] public float patrolWaitTime = 2f; [Header("Animation")] public LayerMask obstacleMask; // 장애물 레이어 마스크 public float angleDeadZone = 5f; // 조준시 깜빡임을 피하기 위한 최소 확정 앵글 public float speedDampTime = 0.4f; // 속도 댐핑 시간 public float angularSpeedDampTime = 0.2f; // 각속도 댐핑 시간 public float angleResponseTime = 0.2f; // 각속도 안에서 각도 회전에 따른 반응 시간 [Header("Cover")] public float aboveCoverHeight = 1.5f; // 장애물에 숨었을 때 고려해야할 최소높이값 public LayerMask coverMask; // 장애물 레이어마스크 public LayerMask shotMask; // 사격 레이어마스크. public LayerMask targetMask; // 타겟 레이어마스크. }
위의 CreateAssetMenu 함수를 통해 생성된 메뉴를 볼 수 있으며, 이를 클릭합니다.
생성된 파일 이름을 EnemyCommonStats라고 지정하고, 우측의 Inspector에 설정값들을 적용해 줍니다.
EntityTable을 클릭해보면 엑셀 파일이 열리는데 무기에 대한 설정값들이 적용되어 있는 것을 볼 수 있습니다.
EntityTable에서 우클릭하여 "XLS Import Settings..."를 클릭합니다. 그러면 엑셀 파일을 읽어서 보여주는 ExcelImporterMaker 창이 나타납니다.
AimOffset 값을 Float으로 설정하고 불필요한 것의 [ ]enable을 꺼주는 등의 설정을 해주고, [create] 버튼을 클릭합니다.
EntityTable에서 다시 우클릭하여 Reimport를 클릭하여 줍니다.
그러면 위와 같이 EntityTable 데이터 셋이 생성된 것을 확인할 수 있습니다.
복잡한 듯 하지만 엑셀을 잘 활용하여 다양한 데이터들을 처리하는 것이 여러가지 확장성에서 좋다라고 보면 됩니다.
사실 엑셀은 이제 실무에서 어떠한 형태로는 사용안되는 경우가 없는 듯해요 ^^. 데이터 관리, 로그, 레포팅, 분석 등 정말 다양한 형태로 활용되죠.. ㅎㅎ
Enemy AI 기본 클래스들 생성입니다.
StateMachine 폴더를 만들고, 하위 폴더로 Action, Decision, State, Transition 폴더를 만듭니다. 그리고 각각의 폴더 안애 위와 같이 스크립트들을 미리 생성해 둡니다. 이렇게 한 이유는 어떤 스크립트들이 만들어지고 어떻게 사용될지를 미리 보기 위함입니다.
우선 StateController를 더블클릭하여 코딩을 시작합니다 ^^~ (Enemy AI 기본 클래스 생성을 마치기 위하여 하나 더 진행..)
/// <summary> /// state -> actions update -> transition (decision) check.. /// state에 필요한 기능들. 애니메이션 콜백들.. // 시야 체크, 찾아놓은 엄폐물 장소중 가장 가까운 위치를 찾는 기능. /// </summary> public class StateController : MonoBehaviour { public GeneralStats generalStats; public ClassStats statData; public string classID; // PISTAL, RIFLE, AK
public ClassStats.Param classStats { get { foreach (ClassStats.Sheet sheet in statData.sheets) foreach (ClassStats.Param parm in sheet.list) if (parm.ID.Equals(classID)) return parm; return null; } }
public State currentState; public State remainState; public Transition aimTarget; public List<Transition> patrolWaypoints; public int bullets; [Range(0,50)] public float viewRadius; [Range(0,360)] public float viewAngle; [Range(0,25)] public float perceptionRadius;
[HideInInspector] public float nearRadious; [HideInInspector] public NavMeshAgent nav; [HideInInspector] public int wayPointIndex; [HideInInspector] public maximumBurst = 7; [HideInInspector] public float blindEngageTime = 30f; [HideInInspector] public bool targetInSight; [HideInInspector] public bool focusSight; [HideInInspector] public bool reloading; [HideInInspector] public bool hadClearShot; // before [HideInInspector] public bool haveClearShot; // now [HideInInspector] public int coverHash = -1; // 장애물마다 고유코드가 있어서 캐릭터들이 몰리지 않고 적당한 장애물을 찾도록 하기 위해.. [HideInInspector] public EnemyVariables variables; [HideInInspector] public Vector3 personalTarget = Vector3.zero;