이야기를 나눠요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
자동화에서 클라의 뽕맛을 제대로 느꼈습니다.
이렇게 한눈에 코드가 읽히고 효율좋게 재사용, 유지보수가 되는 코드를 본게 처음이라 그런지와... 이게 진짜 클라에 할일이구나 싶었습니다정말 유익했습니다 꼭 제껄로 만들꺼에요 ㅎㅎ
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강의 파트 순서에 대해 질문드립니다.
안녕하세요 파트 3,4,7,8,9 순서로만 들어도 mmorpg제작에는 문제가 없는걸까요? 파트 5,6은 3,4,7,8,9를 수강한 이후에 괜찮을까요?
-
유니티 2D 로그라이크 게임 만들기 [한글자막]
지금 유니티 배운지 한반년되어가는데
제가 배운지 반년이 되어가는데 현재 코드 나와았는거 왜 필요한지 분석을 못하면;; 코딩을 접어야 되나 싶은 생각이 드는데 이게 맞나요?;;
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 루키스님
삭제된 글입니다
-
[Rookiss 켠김에 출시까지] MMO Lab 1기 <유니티 방치형 키우기 게임>
Simplify Add name 설정
조이스틱 프리팹을 단순명으로 바꾸려 하면 이미지에 보이는 에러문이 나오면서 적용되지 않는데 무슨 문제일까요?
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의와는 무관한 질문입니다.
안녕하세요! 강의 열심히 듣고있는 클라이언트 개발자를 꿈꾸는 한 수강생입니다. 수강전 문의에 글을 남겼었는데 답장이 오지 않아 이렇게 글 남깁니다.저번 루키스님께서 포폴을 제작할 때 조그만한 서버라도 포함해 온라인으로 제작하라고 조언을 해주셔서 이 시리즈를 듣고 있습니다. 1. 포폴을 제작하는데 (강의를 듣는데) 있어서 4강 이후 5,6강이 필수적인가요?? 바로 7강으로 넘어가도 문제 없을지가 궁금합니다!(만약 클라이언트 개발자여도 알아둬야 하는 지식이라면 듣겠습니다!) 2. 이 시리즈는 2D로 제작 한 것으로 알고 있습니다. 만약 3D로 제작할 경우 코드나 스킬등이 많이 바뀌는지 궁금합니다!(강의 따라서 한번 만들어보고 3D rpg로 적용해 포폴을 제작 하려고 합니다.) 항상 감사드립니다!! 언리얼도 빨리 나왔으면 좋겠네요!!
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임서버 업계에서는 ide 보통 어떤거 쓰나요?
젯브레인사의 ide를 선호하여서 vs가 아닌 rider를 사용하고 익숙해져 있는 상태인데, 클라이언트가 아닌 게임서버 쪽에서도 현업에서 rider 사용들 하나요?? 그냥 제가 익숙한 ide사용해도 상관없나요? (게임서버 취준중입니다)
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
갑자기 난이도가 지옥이 돼버렸어/..............
ㅠ_ㅠ 갑자기 너무 어려워졌어요
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Button onClick 이벤트 설정 위치
안녕하세요, Unity UI Button onClick 이벤트 설정 위치에 대한 고민이 있어서 질문 글을 남깁니다. Button의 onClick 이벤트에 호출할 함수를 등록하는 방법에는 아래와 같이 두 가지 방법이 있다고 알고 있습니다.1. 인스펙터 창에서 Button 게임오브젝트의 onClick 이벤트에 호출할 함수를 등록코드 상에서 등록Button sampleBtn; void Start() { sampleBtn.onClick.AddListener( () => { Debug.Log("Hello World"); }); } 첫 번째 방법으로 구현을 하면 프로젝트를 처음 열어본 사람의 입장에서 보았을 때 특정 버튼을 누른 경우 어떤 동작이 이어질지 전체적인 흐름을 파악하기 쉽다는 장점이 있습니다. 그리고 연결된 함수를 타고 가서 관련 스크립트를 열어볼 수도 있고요.하지만 매번 인스펙터 창에서 하나씩 넣어주어야 해서 귀찮(?)을 수 있다는 단점이 있습니다. 두 번째 방법으로 구현을 하면 게임오브젝트를 하나 하나 눌러가면서 인스펙터 창에서 onClick 이벤트에 등록된 함수를 확인할 필요 없이, 코드만 보면 되기 때문에 편할 수도 있다는 장점이 있습니다.하지만 처음 프로젝트를 열어본 사람은 어디에 뭐가 있는지 어떻게 연결되어있는지 초반에 조금 헤멜 수 있다는 단점이 있습니다. (뭔가 컨벤션이 정해져 있지 않고 아무런 정보 없이 프로젝트를 처음 열어본 사람)둘 중 어느 방법을 추천하시는지 궁금해서 질문 남깁니다!!!
-
[유니티 3D] 실전! 생존게임 만들기 - Advanced
퀵슬롯 영역 밖
DragSlot.instance.transform.localPosition.y < quickSlotBaseRect.transform.localPosition.y - quickSlotBaseRect.rect.yMin - baseRect.localPosition.y && DragSlot.instance.transform.localPosition.y < quickSlotBaseRect.transform.localPosition.y - quickSlotBaseRect.rect.yMax - baseRect.localPosition.y드래그슬롯의 위치가 퀵슬롯의 y 영역 밖으로 벗어나면 아이템을 버리도록 코드를 짰는데 작동을 안하네요디버그로 수치를 확인하면 수치는 맞게 나오는데 왜 영역 밖이라고 인식할까요?
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
프로토콜 버퍼 자동 변환기 툴 배포합니다!
수업시간에 구글 프로토콜 버퍼를 이용하여 프로토콜 패킷을 생성하는데, 클라이언트와 서버단에서 PacketHandler에는 함수를 직접 정의해서 생성해야합니다. 이 과정이 꽤 번거롭고 이름도 정확하게 맞춰야합니다. 그래서 자동 툴을 이용하여 작성해야 할 코드를 자동으로 정확하게 생성해주는 툴을 제작하여 배포합니다. 이 기능의 배포는 여기에서만 합니다. 이 기능은 UnityEditor Tools를 구현하여 이용하는 방식입니다. [여기를 클릭하여 다운로드] 스크립트를 다운로드합니다. (또는 아래 스크립트를 복사하여 작성) 유니티 에디터 Assets 폴더 안에 넣습니다. 위치는 상관 없습니다.유니티 에디터 상단 바에서 Tools/Bonnate/Socket/Generate Protocol Code From Enum을 선택합니다. 프로토콜 버퍼 에디터에서 MsgId에 프로토콜 이름을 복사합니다.주석을 지원합니다./* 주석은 구분 없이 모든곳에 동일하게 생성됩니다.// 주석은 프로토콜의 주석으로 생성됩니다.본 글에서는 아래 이미지와 같이 복사하였습니다. 복사한 값 Enum 스니펫을 Tools 윈도우 창에 붙여넣기합니다.우측의 변환 버튼을 클릭합니다.생성된 값을 각 스크립트에 붙여넣기합니다.변환된 프로토콜 코드는 프로토콜버퍼 에디터 구현부에 붙여넣으세요.서버가 보내는 프로토콜은 클라이언트단(유니티)에서 사용합니다.클라이언트에서 보내는 프로토콜은 서버단에서 사용합니다. 전체 코드입니다. 위에서 다운로드 받은 파일과 동일합니다./* * GenerateProtocolCodeFromEnum - Enum을 이용한 프로토콜 코드 생성을 위한 유니티 에디터 창 * 작성자: [Bonnate] https://bonnate.tistory.com/ * 라이선스: 없음 (명시적인 라이선스 없이 제공됨) * * 설명: * 이 스크립트는 Enum 스니펫에서 프로토콜 코드, 클라이언트 핸들러 코드, 서버 핸들러 코드를 생성하기 위한 유니티 에디터 창을 정의합니다. * 입력한 Enum 스니펫을 자동으로 프로토콜 코드로 변환하고, 해당하는 클라이언트와 서버 핸들러 함수를 생성합니다. * 생성된 코드는 클립보드에 복사하여 추가적인 사용이 가능합니다. * * 주의 사항: * 이 스크립트는 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] https://www.inflearn.com/roadmaps/355 * 의 기능을 이용하기 위해 작성된 스크립트입니다. * * 사용 방법: * 1. 이 스크립트를 유니티 프로젝트의 Editor 폴더에 첨부합니다. * 2. GenerateProtocolCodeFromEnum 창을 열기 위해 Tools -> Bonnate -> Socket -> Generate Protocol Code From Enum을 선택합니다. * 3. 입력 텍스트 영역에 Enum 코드 스니펫을 입력합니다. * 4. "변환" 버튼을 클릭하여 프로토콜 코드, 클라이언트 핸들러 코드, 서버 핸들러 코드를 생성합니다. * 5. 생성된 코드는 각각의 텍스트 영역에 표시됩니다. * 6. 해당 영역의 텍스트를 클립보드에 복사하려면 옆에 있는 버튼을 클릭합니다. * 7. 생성된 코드를 복사하여 각 코드에 붙여넣기하여 편리하게 프로토콜을 디자인합니다. * * 참고: 이 스크립트는 현재 상태로 제공되며 일부 제한 사항과 문제가 있을 수 있습니다. * 개인적으로 업데이트 되나, 온라인(깃허브 리포지트리 등)에 배포하지는 않을 예정입니다. */ #if UNITY_EDITOR using UnityEngine; using UnityEditor; using System.Text; using System.Text.RegularExpressions; public class GenerateProtocolCodeFromEnum : EditorWindow { private string mInputText = ""; private string mProtocolText = ""; private string mClientHandlerText = ""; private string mServerHandlerText = ""; private Vector2 mScrollPosition; [MenuItem("Tools/Bonnate/Socket/Generate Protocol Code From Enum")] public static void ShowWindow() { GetWindow<GenerateProtocolCodeFromEnum>("Generate Protocol Code From Enum"); } private void OnGUI() { mScrollPosition = EditorGUILayout.BeginScrollView(mScrollPosition, GUILayout.ExpandHeight(true)); // 입력 텍스트 영역 EditorGUILayout.BeginHorizontal(); GUILayout.Label("Enum 코드 스니펫 입력"); // 변환 버튼 if (GUILayout.Button("변환", GUILayout.Width(80))) { mInputText = RemoveCommonIndentation(mInputText); GenerateProtocol(); EditorGUIUtility.systemCopyBuffer = mProtocolText; // 변환된 텍스트를 클립보드에 복사 } EditorGUILayout.EndHorizontal(); mInputText = EditorGUILayout.TextArea(mInputText, GUILayout.ExpandHeight(true)); GUILayout.Space(30); // 프로토콜 코드 영역 EditorGUILayout.BeginHorizontal(); GUILayout.Label("변환된 프로토콜 코드"); // 복사 버튼 if (GUILayout.Button("복사", GUILayout.Width(80))) { EditorGUIUtility.systemCopyBuffer = mProtocolText; // 프로토콜 코드를 클립보드에 복사 } EditorGUILayout.EndHorizontal(); mProtocolText = EditorGUILayout.TextArea(mProtocolText, GUILayout.ExpandHeight(true)); GUILayout.Space(10); // 서버 핸들러 영역 EditorGUILayout.BeginHorizontal(); GUILayout.Label("서버가 보내는 프로토콜 (클라이언트단에서 구현)"); // 버튼 if (GUILayout.Button("복사", GUILayout.Width(80))) { EditorGUIUtility.systemCopyBuffer = mServerHandlerText; // 서버 핸들러 코드를 클립보드에 복사 } EditorGUILayout.EndHorizontal(); mServerHandlerText = EditorGUILayout.TextArea(mServerHandlerText, GUILayout.ExpandHeight(true)); GUILayout.Space(10); // 클라이언트 핸들러 영역 EditorGUILayout.BeginHorizontal(); GUILayout.Label("클라이언트가 보내는 프로토콜 (서버단에서 구현)"); // 버튼 if (GUILayout.Button("복사", GUILayout.Width(80))) { EditorGUIUtility.systemCopyBuffer = mClientHandlerText; // 클라이언트 핸들러 코드를 클립보드에 복사 } EditorGUILayout.EndHorizontal(); mClientHandlerText = EditorGUILayout.TextArea(mClientHandlerText, GUILayout.ExpandHeight(true)); EditorGUILayout.EndScrollView(); GUILayout.Space(20); GUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Powered by: Bonnate"); if (GUILayout.Button("Github", GetHyperlinkLabelStyle())) { OpenURL("https://github.com/bonnate"); } if (GUILayout.Button("Blog", GetHyperlinkLabelStyle())) { OpenURL("https://bonnate.tistory.com/"); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); EditorGUILayout.LabelField("이 기능은 인프런 강의의 기능을 편리하게 사용하기 위해 구현되었습니다."); if (GUILayout.Button("[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈]", GetHyperlinkLabelStyle())) { OpenURL("https://www.inflearn.com/roadmaps/355"); } GUILayout.EndHorizontal(); } private GUIStyle GetHyperlinkLabelStyle() { GUIStyle style = new GUIStyle(GUI.skin.label); style.normal.textColor = new Color(0f, 0.5f, 1f); style.stretchWidth = false; style.wordWrap = false; return style; } private void OpenURL(string url) { EditorUtility.OpenWithDefaultApp(url); } private string RemoveCommonIndentation(string input) { string[] lines = input.Split('\n'); // 찾아낼 공백 패턴 Regex indentRegex = new Regex(@"^\s+"); // 최소 공통 공백 찾기 int maxIndentLength = 0; foreach (string line in lines) { if (!string.IsNullOrWhiteSpace(line)) { Match match = indentRegex.Match(line); if (match.Success) { int indentLength = match.Length; if (indentLength > maxIndentLength) maxIndentLength = indentLength; } } } // 최소 공통 공백 제거 string output = ""; foreach (string line in lines) { if (line.Trim() == "") continue; if (!string.IsNullOrWhiteSpace(line)) { string trimmedLine = line.Substring(maxIndentLength); output += trimmedLine + "\n"; } } return output; } private void GenerateProtocol() { // 입력 텍스트를 줄 단위로 분할 string[] lines = mInputText.Split('\n'); // 생성된 코드 문자열 초기화 string generatedProtocolCode = ""; string generatedClientHandlerCode = ""; string generatedServerHandlerCode = ""; bool isMultiLineComment = false; bool isClientHandlerComment = false; bool isServerHandlerComment = false; for (int i = 0; i < lines.Length; ++i) { string line = lines[i]; // 다중 줄 주석 처리 if (line.Trim().StartsWith("/*")) { isMultiLineComment = true; } if (isMultiLineComment) { generatedProtocolCode += line + "\n"; generatedClientHandlerCode += line + "\n"; generatedServerHandlerCode += line + "\n"; // 다중 줄 주석 종료 if (line.Trim().EndsWith("*/")) { isMultiLineComment = false; } continue; } if (line == "\n") { generatedProtocolCode += "\n"; generatedClientHandlerCode += "\n"; generatedServerHandlerCode += "\n"; continue; } // 주석인 경우 처리하여 유지 if (line.Trim().StartsWith("//")) { StringBuilder funcComment = new StringBuilder(); for (; i < lines.Length; ++i) { line = lines[i]; if (!line.Trim().StartsWith("//")) { funcComment.Remove(funcComment.Length - 2, 2); --i; break; } funcComment.Append($"{line}\n"); } // 클라이언트 핸들러 주석 확인 if (i + 1 < lines.Length && lines[i + 1].Trim().StartsWith("C_")) { isClientHandlerComment = true; isServerHandlerComment = false; } // 서버 핸들러 주석 확인 else if (i + 1 < lines.Length && lines[i + 1].Trim().StartsWith("S_")) { isClientHandlerComment = false; isServerHandlerComment = true; } if (isClientHandlerComment) { generatedClientHandlerCode += funcComment + "\n"; } if (isServerHandlerComment) { generatedServerHandlerCode += funcComment + "\n"; } generatedProtocolCode += funcComment + "\n"; continue; } // 빈 줄이거나 등호 (=)가 없는 줄은 건너뜀 if (string.IsNullOrEmpty(line) || !line.Contains("=")) continue; // 줄에서 변수 이름과 값 추출 string[] parts = line.Split('='); string variableName = parts[0].Trim(); string variableValue = parts[1].Trim(); // 접두사 추출 및 나머지 이름을 카멜 표기법으로 변환 string[] nameParts = variableName.Split('_'); string prefix = nameParts[0]; string camelCaseName = ""; for (int j = 1; j < nameParts.Length; ++j) { camelCaseName += char.ToUpper(nameParts[j][0]) + nameParts[j].Substring(1).ToLower(); } // 새 프로토콜 메시지 생성 string protocolMessage = $"message {prefix}_{camelCaseName} {{\n}}"; // 생성된 프로토콜 메시지를 코드에 추가 generatedProtocolCode += protocolMessage + "\n"; // 클라이언트 핸들러 코드 생성 if (prefix.StartsWith('C')) { string clientHandlerCode = $"public static void {prefix}_{camelCaseName}Handler(PacketSession session, IMessage packet)\n{{\n {prefix}_{camelCaseName} {prefix.ToLower()}_{camelCaseName.ToLower()} = packet as {prefix}_{camelCaseName};\n // TODO\n}}\n"; generatedClientHandlerCode += clientHandlerCode + "\n"; } // 서버 핸들러 코드 생성 if (prefix.StartsWith('S')) { string serverHandlerCode = $"public static void {prefix}_{camelCaseName}Handler(PacketSession session, IMessage packet)\n{{\n {prefix}_{camelCaseName} {prefix.ToLower()}_{camelCaseName.ToLower()} = packet as {prefix}_{camelCaseName};\n // TODO\n}}\n"; generatedServerHandlerCode += serverHandlerCode + "\n"; } } // 생성된 코드를 입력 필드에 할당 mProtocolText = generatedProtocolCode; mClientHandlerText = generatedClientHandlerCode; mServerHandlerText = generatedServerHandlerCode; } } #endif
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
정리/복습 vs 강의 여러번 보기
클리커 게임 강의의 코드를 보다가 프레임 워크 부분 코드가 기억이 안나고 이해가 힘들어 다시 강의를 보고 있습니다. 서버 같은 경우는 한강한강 이해 자체가 힘들어서 정리를 하면서 봤는데 완강까지 시간이 오래 걸렸어요. 유니티 강의 같은 경우는 볼 때는 나름 이해가 되어서 정리를 안하고 빨리 보는 것에 집중을 했는데그래도 강의의 내용을 노트나 블로그에 정리를 하는게 나을까요? 아니면 생각 안나면 그냥 강의를 여러번 보는게 나을까요?
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강의를 수강하는 순서
강의 파트를 1부터 7까지의 순서중 어떤 순서대로 수강을 하는게 수월한가요? 1-2-3-4의 순서로 강의를 들어보려했더니 1은 이해가 잘되었으나 2부터 갑자기 난이도가 엄청나게 올라가고 3은 다시 좀 쉬워졌다가 4는 아직 보지는 못했는데 난이도가 또 올라가더군요 5나 6은 좀 더 수월한 강의인것같구요. 뱀서강의를 보다가 좀 이해가 안되서 다시 이쪽 강의로 내려와서 3번부터 보고있습니다. 파트 1부터 7까지 차례로 공부하는것이 나을까요? 개발 흐름에 따라서라면 1부터 7이 근본인것같은데... 난이도로 따지면 파트순서가 아니니..고민입니다. 추천하는 순서가있으신가요?
-
[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
강좌를 어떤식으로 봐야하는지 모르겠습니다. 복붙관련
강의를 정독해서 보고있는데 복붙부분이 많아서 이 부분을 직접 타이핑 해야하는지 아니면 복붙부분은 그냥 눈으로 읽고 이해하고 강의가 끝난후에 수강자료를 다운로드 받아서 복붙을 한다음에 분석을 하는 방식인지 어느쪽이 좋은지 모르겠습니다. 두가지 방식을 다 하다가 마지막에 강의 코드를 복붙하려고 했는데 어드레스블 강의코드부분만 복붙하려했는데 그 안에 오브젝트 풀링과 기타 배우지않은 부분까지 섞여서 이거 정리하는게 더 시간이 걸립니다. 어떻게 강의를 봐야 할까요? 해당강의에 해당 코드만 있으면 좋겠는데 멘토링을 참가하지 않은 저 같은 사람들은 따라가기가 좀 어려운것 같습니다.
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이번에 처음 듣고 있는데, 완벽히 이해못하더라도 넘어가는게 좋을까요??
서버 쪽 오니까, 정말 난이도가 이전 강의들에 비해서 체감 난이도가 엄청 확 뛰네요 ㅠㅠ특히 지금 Session 쪽 SendBuffer 강의 듣고 있는 중인데, 서버, 클라이언트 흐름 쪽으로 들어오니,멀티쓰레드나 락 개념보다도 어려운 거같네요 ㅠㅠ정말 빡 집중해서 보면, 강사님께서 작성하시는 코드가 아~ 이런 흐름이구나, 이래서 이 부분에 이런 코드를 작성하시는구나 정도가 이해가 될려고 하는 수준이고막상 제가 처음부터 혼자 구현하라고 하면 절대 못 할 거같은 느낌이 드는데.. 이럴땐 그냥 대충 이해만 하고 한번 크게 훑은 다음에, 다시 여러번 들어보는게 좋을까요?아니면 처음 들을 때, 완벽하게 이해하고 넘어가는게 좋을까요?혹시 이런 상황에 추천하시는 공부 법 알려주심 감사하겠습니다!
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
정말 어렵네요 ㅠㅠ
C# 기초 공부할때는 코드가 이해가 안되도그림으로 실행흐름을 그려보면서 이해해볼수있었는데 이거는 코드들이 비동기실행되니까 정확한 순서로 그림을 그려보는게 힘들어서 이해가 정말 힘드네요;
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
cs0122, cs0120 계속 두개가 괴롭힙니다..
player.csusing System.Collections;using System.Collections.Generic;using UnityEngine;public class Player : MonoBehaviour{ // Start is called before the first frame update void Start() { Managers mg = Managers.instance; } // Update is called once per frame void Update() { }}'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' managers.cs using System.Collections;using System.Collections.Generic;using UnityEngine;public class Managers : MonoBehaviour{ static Managers s_Instance; //유일성이 보장된다 public Managers instance { get { Init(); return s_Instance; } } // 유일한 매니저를 갖고온다 // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } static void Init() { if (s_Instance == null) { GameObject go = GameObject.Find("@Managers"); if (go == null) { go = new GameObject { name = "@Managers" }; go.AddComponent<Managers>(); } DontDestroyOnLoad(go); s_Instance = go.GetComponent<Managers>(); } }} 도대체 어디가 문제인지 모르겠습니다 보호 수준가지고 왜 자꾸 오류가나는지
-
[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
슬프네요..
유니티 강좌는 마지막이라니... 슬픕니다. 강좌가 아니더라도 완성된 프로젝트를 판매할 생각은 없으신가요? 입문 단계에서 중급 단계로 넘어가면서 현업에 계신 분들은 어떤 식으로 코드를 작성하는지 궁금합니다. 어드레서블, 전투 등 다 할 줄은 알지만 코드 최적화가 문제가 많아서 고수들의 프로젝트를 열어보고 싶은데 에셋스토어에서 구매하는 완성된 프로젝트는 수준이 왔다갔다 해서..
-
[유니티 3D] 실전! 생존게임 만들기 - Advanced
퀵슬롯 구현 20:30 부터 설명
OnEndDrag 의if 첫 조건문 설명을 너무 난해하게 하셨는데요약하면드래그가 끝난곳이 인벤토리or퀵슬롯 영역이 아닐때 버리기 함수를 실행한다입니다. 조건문에 따른false / true 결과를 말씀해 주시는데 오히려 더 헷갈리네요
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
디버깅 시, '출력 형식이 클래스 라이브러리인' 에러가 날 경우
에러 구문: 출력 형식이 클래스 라이브러리인 프로젝트는 직접 시작할 수 없습니다. 해결방법: Visual Studio 를 삭제하고 Unity Hub 로 재설치하는 게 제일 깔끔합니다.