소개
안녕하세요, 게임을 사랑하고 개발을 사랑하는 게임 프로그래머 Developer G입니다.
저는 어떻게하면 깔끔하고 체계적인 코드를 작성할 수 있을지 항상 고민하는데요,
제 고민의 결과물들을 여러분들에게 아낌없이 가르쳐드리겠습니다!
강의
전체2수강평
게시글
질문&답변
2024.10.12
스킬 사용에 관한 질문이 있습니다.
수강해주셔서 감사합니다. Skill은 SkillSlot class에서 할당된 Button(1~9)를 누르면 // SkillSlot.cs 75번 줄 private void UpdateInput() { if (skill.IsUseable && Input.GetKeyDown(useKeyCode)) { skill.Owner.SkillSystem.CancelTargetSearching(); skill.Use(); } } 위 함수가 실행되어 SkillSlot이 가지고 있는 Skill을 사용하게 됩니다. SkillSlot이 가지고 있는 Skill은 SkillSystem에 등록된 Skill이기 때문에 따로 찾을 필요가 없어서 SkillSystem을 거치지 않고 가지고 있는 Skill의 Use 함수를 직접 호출합니다. 감사합니다.
- 0
- 2
- 7
질문&답변
2024.10.08
스킬 구현 질문입니다
수강해주셔서 감사합니다. 너무 어렵게 생각하실 필요 없습니다. 현재 SkillSystem의 UpdateSkills 함수에서 ownSkills를 for문으로 돌며 Skill들을 Update하고 있죠? List skillsInStorage와 List activatedSkills 두 목록을 만드셔서 UpdateSkills 함수에서 activatedSkills가 ownSkills 대신에 for문을 돌게 만드시고, Skill이 Register될 때 skillsInStorage 목록에도 넣어주시고, Skill을 보관함에서 Skill 창으로 옮기면 해당 Skill을 activatedSkills 목록으로 옮겨주시면 됩니다. 기존에 ownSkills가 하던 동작들은 activatedSkills가 하고 ownSkills는 내가 소유한 Skill이 무엇인지 확인하는 용도로만 사용하는겁니다. 반대로 Skill 창에서 보관함에 넣을 때는 해당 Skill을 Cancel 시키고 activatedSkills에서 skillsInStorage 목록에 넣어주시면 되겠죠. 감사합니다.
- 0
- 1
- 34
질문&답변
2024.10.05
object 형의 박싱 언박싱에 관련해서 궁금합니다.
수강해주셔서 감사합니다. object 부분은 강의용이 아닌 실제 개발에서 사용하는 내용이구요, 같은 질문이 있었던지라 답변을 똑같이 드리겠습니다. ( https://www.inflearn.com/community/questions/450293/tasktarget%EC%9D%84-%ED%95%A0%EB%96%84) C# 문법서나 강의에서 제대로 설명하지 않아서 가장 많은 오해를 많이 받는게 object형의 퍼포먼스인데요, object형이 퍼포먼스에 안좋다는 이유는 value 타입의 변수를 박싱할 때 heap에 값의 재할당이 일어나고 언박싱을 할 때 캐스팅한 타입으로 박싱한 것인지 확인 후 다시 value 타입으로 값의 재할당이 일어나기 때문입니다. (마이크로스프트 공식 문 서 https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxi ng) 하지만 애초에 heap에 할당된 reference 타입의 변수들은 재할당(박싱/언박싱)이 일어나지 않기 때문에 퍼포먼스에 문제가 없습니다. 이는 char형을 랩핑한 class인 string형도 포함되는 사항입니다. (마이크로소프트에서 제공하는 Type 정보를 보면 string형은 reference 타입으로 되어있습니다. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types ) 그러니 int, float, struct 같은 Value Type의 변수들을 Key 값으로 쓰는 것이 아니라면 퍼포먼스에 대해서는 걱정하지 않으셔도 되구요, 보통 Key 값으로는 string이나 class 객체를 많이 쓰므로 Value Type을 넣을 일은 거의 없습니다. 설사 Value Type을 박싱/언박싱하더라도 박싱/언박싱이 매 프레임마다 일어나는 것이 아닌 특정 상황에서만 일어나는 것이기 때문에 퍼포먼스 이슈가 생길 가능성은 극히 적습니다. 감사합니다.
- 0
- 2
- 19
질문&답변
2024.10.03
Getcomponent 호출 빈도에 관하여 질문이 있습니다.
수강해주셔서 감사합니다. GetComponent 함수를 for문 호출로 한번에 10만번씩 사용하는게 아니라면 함수 하나 때문에 프레임 드랍이 생길 걱정은 안하셔도 됩니다. 최적화라는건 AI, 아트, 물리, 코드, 사운드 모든 것들이 복합적으로 작용해서 이루어지는 것이지 단순히 코드를 잘 짜거나 못 짰다고 어떻게 되는 것은 아닙니다. 감사합니다.
- 0
- 1
- 21
질문&답변
2024.10.01
TargetSearcher없이 어떻게 해야하는지 질문이 있습니다.
프로그래밍은 시험 문제가 아니기 때문에 기능 구현에 맞고 틀리고는 없으므로 제가 맞다 틀리다 함부로 말씀 드릴 수 없습니다. 특히나 상대방이 왜 이렇게 설계 했는지 설계의 의도를 자세히 모르는 상태에서는 더더욱 그렇구요. 굳이 얘기드리자면 구현한 코드가 생각하신 결과를 낸다면 맞는거고 아니라면 틀렸다고 볼 수 있겠죠. 강의에서도 말씀드렸듯 이 강의의 스킬 시스템 역시 하나의 가이드일뿐 정답이 아니며, 수강생분들이 어떻게 강의의 시스템을 수정하시든 본인이 의도한대로 동작한다면 그게 맞는 겁니다. TargetSearcher를 뺀다는건 강의에서 학습한 스킬 시스템 구조 자체를 바꾸는 것이기 때문에 구조를 바꾼 독자적인 시스템에 추가적인 기능을 어떻게 만드냐고 물어보시면 대답드리기가 좀 곤란합니다. 저에게 만드신 독자적인 시스템을 이해하고 해당 기능까지 추가해달라는 얘기와 마찬가지니까요. TargetSearcher를 제거하시겠다면 원래 TargetSearcher가 하던 기능들을 어떻게 구현할 것인가를 먼저 생각해야하구요, 일단 제거해버리고 그 다음은 어떻게 해야하지 고민하는 것은 매우 안좋은 코딩 습관입니다. 하드 코딩을 하게 만드니까요. 현재 상태에서 어떻게 기능을 구현해야할지 모르시겠다면 TargetSearcher를 제거하기 보다는 무기에 // WeaponCollider.cs List objects = new(); List Objects => objects; void OnCollisionEnter(Collision col) => objects.Add(col.transform.gameObject); void OnCollisionExit(Collision col) => objects.Remove(col.transform.gameObject); 이런 Script를 달아두고, TargetSearchAction으로 // SearchWeaponTargetAction.cs TargetSearchResult Search(...) => new (requesterEntity.Weapon.GetComponent ().Objects.ToArray()); 이런 식으로 WeaponCollider가 보관하고 있는 Object들을 return하는 Action을 만드는 것도 한 방법입니다. 한 가지 조언을 더 드리자면, 만들려고 하는 시스템이 만들기 버겁거나 복잡하다면 무작정 만들기 보다는 이전에 말씀드렸듯 관련 튜토리얼을 보거나 다른 에셋을 분석 하는 과정이 필요합니다. 저도 지금도 뭔가를 만들 때 무작정 만들고 보는 경우는 거의 없구요, 거의 항상 다른 게임, 다른 시스템, 다른 에셋, 오픈 소스들을 분석하고 진행합니다. 현업에서 활동하시는 다른 개발자분들도 다 마찬가지구요. 몇 줄 코딩하고 막히고, 몇 줄 코딩하고 문제 생기고를 개발 내내 반복하실게 아니라면 좀 천천히 돌아가시는걸 추천드리겠습니다.
- 0
- 2
- 30