안녕하세요, 게임을 사랑하고 개발을 사랑하는 게임 프로그래머 Developer G입니다.
저는 어떻게하면 깔끔하고 체계적인 코드를 작성할 수 있을지 항상 고민하는데요,
제 고민의 결과물들을 여러분들에게 아낌없이 가르쳐드리겠습니다!
강의
수강평
- [유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
- [유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
- [유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
게시글
질문&답변
올해에 예정된 새로운 강의가 있으신지요?
수강해주셔서 감사합니다.봄 중으로 아이템 시스템 강의 출시가 예정되어 있습니다.감사합니다.
- 0
- 2
- 19
질문&답변
스킬트리 질문입니다
(사진)Output Attribute에서 직접 설정하시거나Editor Code에서 Port를 만들 때 Multiple로 설정하시면 됩니다.
- 0
- 3
- 46
질문&답변
스킬트리 질문입니다
수강해주셔서 감사합니다.Output Attribute의 connectionType을 ConnectionType.Multiple로 설정하면 됩니다.감사합니다.
- 0
- 3
- 46
질문&답변
만약 초록슬라임 10마리 킹슬라임3개 같은 여러조건 경우는
수강해주셔서 감사합니다. (사진) 관리를 편하게 하기 위해서는 이런 식의 툴 개발을 필요하구요, (사진)보기 힘든 부분은 inlineEditor Attribute를 적용해서 ScriptableObject를 참조하고 있는 Inspector에서 바로 다른 ScriptableObject를 수정하거나 볼 수 있게 만들어주시면 한결 편할겁니다. Odin Inspector Asset이나 Github Toolbox 같은 Attribute Package를 보시면 이런 Attribute가 있으니 확인해보시면 될 것 같습니다.강의에서는 Action까지 전부 ScriptableObject로 만들지만 부분적으로 SerializeReference 형태로 바꿔주시면 관리가 좀 더 편해지실 겁니다.감사합니다.
- 0
- 2
- 14
질문&답변
TaskGroupState에 대하여 질문이 있습니다
수강해주셔서 감사합니다.IsAllTaskComplete는 TaskGroup에 속해 있는 모든 Task가 완료되었는지 여부이구요, IsComplete는 TaskGroup 자제가 완료되었는지 여부입니다. WatingForComplete 상태라면, IsAllTaskComplete는 true라도 IsComplete는 false가 될 수 있겠죠.(모든 작업을 완료한 상태지만 아직 완벽히 끝내진 않은 상태. Task들의 상태가 언제든 변할 수 있음.)감사합니다.
- 0
- 2
- 27
질문&답변
카테고리의 응용에 대하여 여쭤보고싶습니다.
수강해주셔서 감사합니다.툴 제작이 이게 맞다, 저게 맞다 말씀드릴 수 있는 부분은 아니구요, 툴은 개발자 본인이 '편하게' 사용할 목적으로 만드는 것이기 때문에 본인이 쓰기 편한대로 수정을 하고, 문제가 생기면 고치고 그걸 반복해야 할 뿐입니다. 누구도 툴 구현에 대해 맞다, 틀리다 답을 내줄 순 없습니다. 안정성이 낮아지는지는 툴을 제작한 본인이 스스로 검토해보고 판단을 내려야 합니다. 중요한건 내가 이걸 왜 만들었고, 이로 인해 어떤 문제가 생길 수 있는지를 명확히 파악하는 것입니다. "이렇게 만들면 문제가 생길 수 있나?"라는 의문이 생긴다면 그 기능은 안만드는게 맞구요, 면밀히 검토해본 후에 만들어야 합니다.감사합니다.
- 0
- 1
- 45
질문&답변
패링형 스킬에 대해 여쭤보고싶습니다
수강해주셔서 감사합니다.개인적으로 봤을 때 InGuardingState을 만드는건 그다지 좋은 생각 같진 않습니다.피오라의 W는 공격을 막을 뿐만 아니라 마지막에 찌르기로 공격도 하죠?니키도 마찬가지구요.상태의 이름이 Guarding인데 여기에 공격에 대한 처리까지 들어간다는건 맞지 않을거구요, 공격에 대한 부분을 다른 State로 뺀다고하면, 앞으로 만들 다양한 효과를 가진 Skill들도 다 이런 식으로 State를 만들어줄거란 얘기인데 StateMachine이 불필요하게 커지겠죠.예시의 두 캐릭터 정도의 Skill은 Skill System을 크게 확장안해도 쉽게 만들 수 있습니다.[피오라 응수](PrecedingAction, 자신한테 Buff Effect를 걸고 0.75초 대기)피오라가 0.75초 동안 받는 모든 공격과 이동 불가 효과, 해로운 효과를 막아낸 다음,(Action, 공격이 적중한 적에게 Effect 적용)검을 찌릅니다. 검은 처음 적중한 챔피언에게 마법 피해를 입히고, 2초간 이동 속도와 공격 속도를 25%씩 둔화시킵니다.(Action 강화)피오라가 이동 불가 효과를 막아낼 경우, 찔린 적은 둔화하는 대신 기절시킵니다.마지막에 특정 조건 하에 Skill의 효과가 강화되는 부분만 기능 확장을 해주시면 됩니다. 살짝 편법으로 CC를 막아내면 순간적으로 Skill의 레벨을 올렸다가 Skill의 발동이 끝나면 다시 원래 레벨로 돌리는 식으로도 구현할 수 있을겁니다.[니키 가드&카운터](Skill1)가드:(PrecedingAction, 자신한테 Buff Effect를 걸고 0.75초 대기)마우스 커서가 위치한 방향으로 가드 자세를 취하여 0.75초 동안 모든 받는 피해가 감소하고, 모든 방해 효과를 무효화합니다.(Effect가 다른 Skill을 활성화 시킴)피해 효과 혹은 이동 불가 효과의 가드에 성공한 경우, 7초 동안 분노의 펀치!(E2)를 사용할 수 있게 되며,(Action, Skill2를 발동)지속 시간이 끝나면 카운터를 발동합니다.(Skill2)카운터: 짧은 거리를 돌진하면서 주변의 적들에게 스킬 피해를 입히고 1.5초 동안 이동 속도가 65% 느려지며, 지속 시간에 걸쳐 천천히 회복됩니다. 이동 불가 상태에서는 카운터가 발동하지 않습니다.니키의 W는 리신의 음파와 비슷하게 사실 Skill이 두 개입니다. 자기한테 0.75초 동안 공격 피해를 감소하는 Buff를 걸고, 이 Buff의 특수 효과로 공격 피해를 감소시킬 때 같은 Button에 할당되어 있는 분노의 펀치 Skill을 활성화시키는거죠(UseCondition 이용). 이 Skill을 사용하게되면 사용하고 있던 가드 Skill이 Cancel되면서 발동하는 겁니다.감사합니다.
- 1
- 2
- 67
질문&답변
Elite와 Normal Germ의 IsTarget()질문입니다.
수강해주셔서 감사합니다.GameObjectTarget Script의 IsEqual 함수의 내용을 보시면,return targetAsGameObject.name.Contains(value.name);라고 되어있습니다.그럼 결론적으로 코드는 아래와 같이 됩니다.EliteGermSlimeTarget.Contains(GermSlimeTarget)EliteGermSlimeTarget이라는 문장에 GermSlimeTarget이 포함되어있으므로 true를 return하는거죠.GermSlimeTarget의 이름을 NormalGermSlimeTarget으로 바꾸시면 문제가 해결될겁니다.강의에서도 말씀드렸지만, 이름으로 객체를 비교하는건 이러한 문제가 생길 수 있으므로 본격적으로 자신의 게임에 QuestSystem을 적용하실 때는 좀 더 확실히 GameObject들을 비교할 방법을 만들어주시는게 좋습니다.감사합니다.
- 0
- 2
- 33
질문&답변
MMORPG라면 서버가 어떤 기능들을 가져가야 할까요?
수강해주셔서 감사합니다.이건 뭐가 답이 있는건 아니구요,클라에서 로직을 실행하고, 판정만 서버쪽에 넘기면 서버 부담은 적어지겠지만 보안이 취약해질거고,서버에서 로직을 실행하고, 클라는 상태에 대한 동기화만 한다면 서버 부담은 커지겠지만 보안은 강해질겁니다.풀 서버 방식으로 만든다고하면, 말씀하신 것들을 전부 서버에서 처리하고 클라는 Skill과 Entity의 상태에 대한 동기화만 해주는게 맞을 것 같습니다.다만, TargetSearcher의 경우에는 클라의 입력을 서버로 보내서 서버가 클라의 입력이 올바른지 검증할 필요가 있습니다.감사합니다.
- 0
- 2
- 49
질문&답변
공격할 때마다 일정 확률로 추가 투사체 발사
수강해주셔서 감사합니다.공격할 때마다 일정 확률로 추가 투사체 발사라는게, 3발 쏘던 원거리 공격이 확률적으로 4발이 나갈 수 있다는 얘기신지, 아니면 그냥 근접 공격처럼 아무 공격이나 하다보면 발사체가 나갈 수가 있다는 얘기신지 애매하네요.어쨌거나, '일정 확률로 추가 투사체 발사'는 Buff 효과로 적용할 수 있을 것 같습니다. 전에 Effect를 event와 연결해서 Apply 시키는 법을 설명드렸었는데, 그 내용을 똑같이 적용하면 됩니다.Skill의 발동 단계마다 event를 만들고(onStart, onPrecedingActionStart, onApply 등등) , 원하는 event에 Effect를 연결해서 랜덤으로 투사체를 발사해주면 되겠죠.예를 들어, 투사체를 3발 발사하는 Skill이라면 Skill의 onApply event에 Effect의 Callback 함수를 연결해서 Skill의 발동을 감지하여 랜덤으로 추가 발사체를 발사하면 될겁니다.그런데 평소에는 3발로 나가다가, 4발로 나갈 때 원뿔형으로 예쁘게 쏘게 만들고 싶을 수 있습니다. 단순히 이후에 발사체 하나를 추가로 더 쏘는 경우에는 4개가 예쁘게 정렬된 형태로 쏠 수가 없죠? 이 경우에는 SpawnProejectileAction에 발사체 수를 계산하는 action을 만들어서 Effect가 SpawnProejectileAction에 직접 접근하여 이 action에 callback 함수를 연결해주면 됩니다.이게 글로 설명드리자니 잘 이해가 안되실거 같은데,foreach (var calc in CalcDamage.GetInvocationList().Cast()) damage = calc.Invoke(this, damage);Invocation을 통해서 연결된 Action들을 순회하면서 최종 값을 구할 수 있습니다.(복잡한 RPG 게임에서 매우 많이 사용되는 방법입니다.)예를 들어, 초기 Damage가 10이고CalcDamage Action에 (damage) => damage - 2; // 10 - 2(damage) => damage - 2; // 8 -2(damage) => damage - 1; // 6 - 1이렇게 세 개의 Callback 함수가 연결되어 있으면foreach문을 돌았을 때 최종 Damage가 5가 되는거죠.이걸 이용해서 다음처럼 발사체 수를 그때그때 바꿔주면 되는겁니다.(projectileCount) => projectileCount + Random.Range(0, 2);말씀하신 Condition을 계속 확인하는 것도 나쁘지 않습니다. 성능이 걱정되시는 것 같은데, 성능 문제는 실제로 그 문제가 터지고나서 생각해봐야 합니다. 매 Frame 조건 검사 좀 한다고 큰 문제가 생길거라 생각이 들 것 같지도 않구요. 섣부른 최적화는 하지 말라는 말이 있으며, 당장 다른 해결책이 안떠오른다면 최선을 방법을 선택하는게 맞다고 생각이 듭니다.감사합니다.
- 0
- 2
- 80