안녕하세요, 이재현입니다.
1인 게임 개발자를 꿈꾸며 유니티를 독학으로 시작했고, 개발 도중 우연한 기회에 유니티 서적 집필과 강의를 맡게 되었습니다. 강의를 진행하면서, 잘 아는 것과 잘 가르치는 것은 다르다는 사실을 매번 깨닫고 있습니다. 이러한 경험을 바탕으로, 제가 가진 지식을 여러분들께 더 효과적으로 전달하기 위해 늘 노력하고 있습니다.
이번 강의가 여러분께 좋은 출발점이 되어, 즐거운 게임 개발자의 세계로 나아가는 데 작은 보탬이 되기를 기원합니다. ~
강의
수강평
- 절대강좌! 유니티 6 - TPS 게임으로 배우는 유니티 마스터클래스
게시글
질문&답변
오디오 관련해서 질문 있습니다.
안녕하세요. 소리가 나는 것으로 보아서 AudioSource에 총소리 오디오 파일은 연결하신것으로 생각됩니다.처음 쏘는 총알은 아마도 씬에 아직 남겨둔 총알 일텐데요. 벽에 너무 가까이 붙여둔 상태로 실행해서바로 삭제되면서 소리가 끊어지는 상황이 아닐지 추측해봅니다.어느 강좌를 보고 계신지 특히 실습이 안되는 부분의 분:초 를 알려주시면 좀 더 자세하고 확실한 답변드릴수 있습니다. 그리고 콘솔 뷰에 오류(Error) 메시지가 있다면 그것도 캡쳐해서 올려봐 주세요.
- 0
- 2
- 29
질문&답변
[질문] ID 와 Password 방식으로 가입하는 방식 관련 질문이 있습니다.
안녕하세요,우선 zack 이라고 입력한 것은 닉네임입니다. 내부적으로는 PlayerID 로만 식별합니다. 따로 설정한 닉네임을 조회하는 기능은 없는것으로 알고 있습니다. 지금 PC 를 사용할수없는 상황이라서 내일 저녁에 다시 한번 확인한 후 답변드리겠습니다. ~
- 0
- 2
- 41
질문&답변
[질문] ScriptableObject 를 활용한 이벤트 버스 관련 질문이 있습니다.
안녕하세요. 말씀하신 두 가지 구현방식에는 분명히 장단점이 있습니다. 먼저 ScriptableObject 기반의 이벤트 버스의 장점은 다음과 같습니다.첫번째는, ScriptableObject는 유니티 에셋으로 저장되기에 여러 씬에서 동인한 인스턴스를 갖고 공유할 수 있습니다. 반대로 싱글턴의 경우 씬이 변경될 때 유지하기 위해 DontDestroyOnLoad 처리를 해야합니다.두번째는, 디커플링 입니다. 싱글톤의 경우는 접근하려는 클래스에서 해당 싱글톤을 참조해야 하기때문에 의존관계가 형성됩니다. 반면 SO를 사용한 이벤트 버스의 경우 이벤트 Publisher와 Subscriber 간의 의존관계 없이 구동하게 됩니다. 이점이 SO를 활용한 이벤트 버스의 가장 큰 장점입니다. 말씀하신데로 장점만 있는것은 아닙니다. 단점으로는 paehwang 님께서 지적하신데로 SO의 파일 갯수가 늘어날 수록 관리해야하는 에셋이 늘어나는 점입니다. 또한, 런타임에서 동적으로 이벤트를 추가하는 기능을 구현하기 어렵습니다. 반면에 싱글턴 기반으로 이벤트를 관리하면 Dictionary를 활용해 동적 이벤트를 추가하기 편리합니다. 결론적으로 SO를 사용한다고 무조건 좋은 것은 아니며 프로젝트의 개발 스타일에 따라서 선택하셔야 하는 부분이라고 말씀드리고 싶습니다.
- 0
- 1
- 67
질문&답변
[질문] Component 이름 관련해서 질문이 있습니다.
안녕하세요. 처음 하시는 분들을 위해 오탈자에 대한 주의사항을 말씀드렸습니다. 조금 과했나봅니다.ㅎ말씀하신데로 C#도 당연히 상수가 존재합니다. 변경되지않는 문자열을 다음과 같이 선언하고 사용하셔도 좋습니다. const string SPAWN_POINT_GROUP = "SpawnPointGroup"; readonly string SPAWN_POINT_GROUP = "SpawnPointGroup";문자열을 여러곳에서 접근한다면 아래와 같이 상수로 선언하고 접근하시는것이 바람직합니다.
- 0
- 1
- 55
질문&답변
[질문] Custom NavMesh Link 관련해서 궁금한게 있습니다.
안녕하세요. 우선 소중한 후기 감사합니다.우선 두 캐릭터를 Agent Type을 다르게 설정한 후 NavMeshLink 를 2개를 생성하셔야 합니다. 그 후 NavMeshLink 컴포넌트에서 AgentType을 설정하시면 가능할것으로 생각합니다.(사진) Start와 End위치에 Collider 컴포넌트를 배치하고 충돌여부로 판단하는 방법을 사용하실 수도 있구요. 다른 방법으로는 아래와 같이 NavMeshLink에 진입여부를 판단한 후 StartPos와 EndPos 위치를 가져올 수 있습니다. 따라서 현재 위치와의 거리를 판단해서 시작지점에 진입했는지 여부를 확인해서 적절한 애니메이션을 동작시킬 수 있습니다. // 현재 OffMeshLink에 진입했을 경우 if (agent.isOnOffMeshLink) { var linkData = agent.currentOffMeshLinkData; Vector3 startPos = linkData.startPos; Vector3 endPos = linkData.endPos; // 현위치와 startPos와 endPos 간의 거리를 계산해 진입여부 판단 }하지만 매 프레임마다 이렇게 확인하는 코드보다는 조금은 원시적일 수도 있지만 Collider를 배치하고 충돌 콜백을 받아서 처리하는 것이 좀더 바람직하지 않을까 생각합니다.도움이 되셨으면 좋겠습니다.~감사합니다.
- 0
- 2
- 32
질문&답변
[질문] Scriptable Object르 이용한 메모리 최적화 관련 질문이 있습니다.
안녕하세요. 좋은 질문주셨습니다. ScriptableObject를 활용한 메모리 최적화는 단순히 메모리 사용량만을 고려하는 것은 아니구요. 메모리 배치, 캐시 효율성, 데이터 공유 등의 요소를 종합적으로 고려하는 기법입니다. 우선, int bulletSpeed;는 일반적으로 4바이트(32비트)입니다. 반면, ScriptableObject는 참조형이므로 64비트 시스템에서는 8바이트 포인터로 저장됩니다. 따라서 표면적으로 보면, int 하나만 있을 때는 ScriptableObject를 사용하는 것이 메모리적으로 불리해 보일 수 있습니다.하지만 확장성을 고려했을 때, 또 다른 변수가 추가된다면 오히려 적은 메모리로 관리할 수 있겠죠. 강의에서는 이러한 개념을 활용하는 예시를 보여드렸다고 생각해주세요. 예를 들어 Bullet의 Damage 변수만 하나 더 추가한다고 가정하면, ScriptableObject를 사용했을 때 훨씬 메모리가 절약되겠죠. 또, Bullet이 충돌한 물체의 재질(시멘트, 철판, 나무)에 따라 발생하는 탄흔 효화(강의에서는 스파크)를 교체하려면 최소 3개의 프리팹이 필요하겠지요. 이때 ScriptableObject를 사용한다면 공유된 데이터 구조 덕분에 메모리를 훨씬 효율적으로 사용할 수 있겠습니다. (물론 구현방법에 따라서 다를수 있습니다. ~) 또한, ScriptableObject를 사용했을 때의 장점은 저장 데이터를 한 곳에 모아두어 캐시 히트율을 높일수 있습니다. 반면, 개별적으로 int를 가지면 각 객체가 메모리 여기저기에 흩어지면서 CPU 캐시 미스가 증가할 가능성이 있습니다. 특히 대규모 오브젝트를 처리할 때는 메모리 연속성이 중요한 최적화 요소가 됩니다. 추가적으로, 게임 중에 특정 아이템을 취득했을 때 bullet의 Speed나 데미지를 변경(증가)시키는 로직도 개별 변숫값을 일일히 설정하는 것이 아니라 ScriptableObject의 변수 하나만 변경하시면 편리하실 겁니다. 수강중 또다른 질문이 있으시다면 언제든지 글 남겨주세요. 꼭 완강하시길 기원합니다.감사합니다.
- 0
- 2
- 65
질문&답변
강사님~ 오디오 파일 관련해서 질문있습니다!
안녕하세요.동영상에서 Audio 파일 임포트하는 부분이 편집때 누락된것 같습니다. 불편을 끼쳐 죄송합니다. ㅠㅠ미리 받으셨던 강의자료에 Packages/WeaponSFX.unitypackabe 를 설치하시면 프로젝트 뷰에 WeaponSFX라는 폴더가 생성되실 겁니다. 그 폴더를 07_Sounds로 변경하시고 수업을 진행하시면 되세요.(사진)혹시 몰라서 해당 강좌에 WeaponSFX 패키지 파일도 업로드 해두겠습니다.알려주셔서 감사드리구요. 꼭 완강하시길 기원합니다. ~
- 0
- 2
- 68
질문&답변
IDamagable 활용
안녕하세요. 우선 Raycast를 사용해 충돌을 검출하는 방법은 Rigidbody + Collider 조합에 비해서 충돌 검출에 훨씬 적은 리소스를 사용하기 때문에 빠른 연산처리가 가능합니다.그리고 단순 충돌 뿐만 아니라 적캐릭터가 시야에 들어왔는지 여부도 응용할 수 있고 정확한 거리를 기반으로 하는 로직에도 응용할 수 있습니다. 또한, 캐릭터 이동시 바닥 또는 장애물간의 충돌여부와 같은 로직에도 활용할 수 있습니다. 굉장히 많은 부분에 활용되는 기능이기에 충실히 익혀두시면 도움이 되실겁니다.
- 0
- 1
- 81