묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
Single View Engine은 뭘까요?
Razor는 ASP.NET Core가 기본적으로 사용하는 Single View Engine이다라고 하셨는데요. View Engine이 뭔지는 검색으로 알았는데 single view engine은 어떤 의미로 말씀하신걸까요?
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
Results API가 뭔가요?
1강 1분 35초에 ASP.NET Core를 사용하면 웹, RESTful API, Results API 개발이 가능합니다.라고 하셨는데요. Results API가 뭔가요? 검색해도 따로 나오는게 없어서요...
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
M1에서 못한 강의 내용이 T2에 반영이 되나요?
안녕하세요 이 강의의 특징은 다른 여타 강의와 달리 컨텐츠 폴리싱, BM, 출시 운영 준비가 특징이라 여타 강의보다 강의료가 비싸도 인정한 커리큘럼이었습니다만 처음에는 7월까지 마무리해서 자료을 올려주신다고 하셨다가이제는 UI 문제가 생겨 중단이 되고 T2 를 이어 하신다 하셨습니다. 문제는 생길 수 있고 계획은 변경이 될 수 있습니다. 궁금한건 T2에서 m1 때 못한 컨텐츠 폴리싱, BM, 출시 운영에 관한 강의가 포함이 되나요? 답변이 필요합니다.
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
QueryString 대소문자 구분
안녕하세요.현재 `Controller:query string을 통해 데이터 조회` 파트를 시청하고 있습니다. controller에서 userid라고 명시했을 때클라이언트는 userid 또는 userId라고 해도 QueryString이 전달됩니다. 서버에서 queryString의 대소문자를 강제하고 싶을 때는 어떻게 해야하나요?따로 controller에서 하나하나 체크해서 예외처리를 해줘야 하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
게임 실행하자마자 애니메이션 실행되지 않게 만들기
애니메이터에서 Entry와 처음으로 이어지는 애니메이션이게임 실행을 하면 바로 실행이 되는데 그것이 아니고 제가 원하는 때에 애니메이션을 실행하고 싶다면 먼저 Entry에서 바로 이어지는 애니메이션의 Motion 부분을 비워두고(None) 트랜지션으로 이어지는 다음 애니메이션부터 제가 원하는 애니메이션을 넣으면 될까요?(예를 들어 영상에서 예시로 박스가 움직이는 애니메이션을 만드신 것처럼 게임을 시작하자마자 바로 애니메이션이 재생되는 것이 아니라 재생되지 않게 만드는 방법 중 어느 방법이 제일 좋은 방법인지 궁금합니다)
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRecvCompleted 내 RegisterRecv를 다시하는 이유가 먼가요?
좋은 강의 우선 너무 감사드립니다. ㅜㅜ 23:34 이후 부터 Recv 관련 내용을 듣다가 궁금한 부분이 있어서 질문드립니다. (1)OnAcceptHandler의 전체 코드를 살펴보면 클라이언트와 접속이 된 이후 수신 / 송신 이후 클라와의 연결을 끊어버리는데 (session.Disconnect() -> Shutdown, Close), OnRecvCompleted 내 RegisterRecv를 다시하더라도 클라쪽에서 보내는 데이터를 미처 다 수신받기 전에 끊겨질수 있지 않나요? 서버가 클라와의 연결을 끊을려고 할때 (Shutdown, Close) 클라쪽에서 보낸 데이터가 남아 있을 경우 바로 끊지 않고 비동기 수신 함수로 등록된 결과를 모두 처리하고 끊는걸로 이해하면 될까요? (2) 다시 낚시대를 던지는 행위 ? 가 결국은 클라와 연결이 된 이후클라쪽에서 한번에 여러개의 패킷을 send를 하기 때문으로 이해가 되는데, 만약 클라가 연결이 된 이후 한 개의 패킷만 전달한다는 정책이라면 따로 OnRecvCompleted 내 RegisterRecv를 하지 않아도 될까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
몇 가지 질문이 있습니다!
안녕하세요, 루키스님.좋은 강의를 제공해주신 것에 대해 항상 감사드립니다.기존에는 서버의 코어 부분은 건드리지 않고 컨텐츠 부분만 직접 수정 및 추가하며 클라이언트와 연동해보는 사이드 프로젝트만 진행해보았고,서버 코어 부분에 대하여 좀 더 깊게 이해를 해보기 위해 다시 정주행을 하는 중 입니다.이유는 모르겠지만, 같은 내용의 강의를 계속해서 볼 때마다 점점 이해되는 범위가 달라지는 것이 느껴지는 것 같긴 하네요..이번에는 최대한 운영체제 같은 윗 분들의 사정(?)을 고려해보며 이해를 해보며 접근을 해보려고 하는데요.그러다 보니 몇 가지 의문점이 생겨 질문 드립니다. 1. 세션코드에서 Send부분에 lock안에서 enqueue를 하는 이유는 TCP 통신의 순서를 보장하기 위해서 인가요? 2. Recv부분은 왜 lock이 안걸려있는지 이해가 되지 않습니다.검색해보거나 다른 분들 질문을 참고해보면, ReceiveAsync 부분이 1개의 스레드만 접근하는 것을 보장하기 때문이라고 하시는 것 같은데요.이 부분은 소켓API 부분에서 보장해주는 건가요?그렇다면 다른 SendAsync와 같은 부분과 다르게 버퍼를 읽던 중 다른 수신을 받게 되어도, 수신을 처리하는 스레드가 스레드풀에서 제공되는 것이 아닌, 현재 수신을 처리 중인 스레드가 완료 될 때 까지 어딘가에서 대기하고 있다가 한 번에 처리되는 건가요? 3. PacketSession의 OnRecv 부분에서 BitConverter.ToUInt16 메서드가 메서드 자체적으로 바이트 배열의 시작하는 인덱스에서 '2바이트'만큼을 부호없는 정수로 바꾸는 메서드라고 알아보았는데요.메서드 자체에서 '2바이트'라고 지정해둔 것은 보편적으로 패킷의 크기를 나타내는 헤더를 2바이트로 정하기 때문인가요? 4. 위처럼 OnRecv에서 패킷이 온전하게 도착하지 않았을 때, 단순히 writePos만 옮겨진 상태로 다음 패킷을 받을 때까지 기다리기만 해도 되는 것은, TCP 통신 자체가 '순서를 보장하기 때문에 앞에서 온전하게 받지 못한 패킷에 대해서 다른 패킷보다 먼저 다시 보내주고', '온전하게 도착하지 않은 부분에 대해서만 보내주기 때문'일까요?그리고 그렇다면 위처럼 순서를 보장해주고, 상대가 어디까지 받았는지, 어디를 못 받았는지 판단하는 것은 운영체제에서 알아서 처리되는 건가요?만약 상대가 못 받았을 경우 다시 보내줘야 한다면, 커널에서 패킷을 송신한 뒤에도 상대가 온전하게 받았다고 신호하기 전까지는 커널 상의 버퍼에 해당 패킷을 계속 저장해두고 있으려나요? 5. ArraySegment를 사용할 때, Array를 통해 배열의 시작 위치를 넘기고 어떤 위치부터 조회할 지(?) 조회할 위치를 넘기는 부분이 Offset인 것 같은데요.Offset을 0으로 두고 readPos및 writePos나 DataSize, FreeSize 등을 통해 패킷 시작 위치나 범위를 지정해주는 것은 Offset 값을 변경하며 이를 컨트롤 하는 것이 복잡하기 때문인가요? 처음 강의를 수강할 때에 비하면 강의 내용이 점점 머릿속에 그려지고 구조와 흐름이 얼추 잡혀가는 느낌이지만,누군가가 "너 한 번 혼자서 서버 만들어봐!!"라고 한다면 강의를 참고하거나 구글링 없이 혼자 서버 코어 단을 만들 수 있을 거라는 엄두가 나질 않는데요.6. 4년제 학부 졸업생의 수준에서 서버 코드를 보고 이 부분은 왜 이렇게 작성된 것인지, 어떤 흐름으로 코드가 실행되는지 정도만 이해하면 게임 서버 프로그래머로 취업하기엔 충분할까요...?아니면 정말 혼자 서버 코어 부분을 작성할 수 있을 정도가 되어야 하는건가요? 강의 들으며 궁금했던 부분을 싹 모아서 정리해보니 장문의 질문이 되어버렸네요 죄송합니다 ㅠㅠ다시 한 번 좋은 강의 제공해주셔서 정말 감사합니다.
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
animator안의 animatorcontroller를 불러올수없어요
상황은 이렇습니다.어떤 캐릭터 프립펩이 있고그 프리펩안에 animator 컴포넌트를 넣어두었습니다.그리고 그 animator컴포넌트안에 animatorcontroller를 만들어서 넣어놓은 상황입니다. animatorcontroller안에는 여러가지 애니메이션을 넣어둔상태입니다. 이상태에서 캐릭터 프리펩을 addressable에 할당했습니다.animatorcontroller파일도 addressable에 할당했습니다.두개를 같은 어드레서블 그룹에 넣은후에어드레서블을 빌드한후에 서버에 올렸고using System.Collections;using System.Collections.Generic;using System.Linq;using UnityEngine;using UnityEngine.AddressableAssets;using UnityEngine.UI;public class DownManager : MonoBehaviour{ [Header("UI")] public GameObject waitMessage; public GameObject downMessage; public Slider downSlider; public Text sizeInfoText; public Text downValText; [Header("Label")] public AssetLabelReference prefabLabel; public AssetLabelReference materialLabel; public AssetLabelReference animationLabel; public AssetLabelReference textureLabel; private long patchSize; private Dictionary<string, long> patchMap = new Dictionary<string, long>(); void Start() { waitMessage.SetActive(true); downMessage.SetActive(false); StartCoroutine(InitAddressable()); StartCoroutine(CheckUpdateFiles()); } IEnumerator InitAddressable() { var init = Addressables.InitializeAsync(); yield return init; } #region Chek Down IEnumerator CheckUpdateFiles() { var labels = new List<string>() { prefabLabel.labelString, materialLabel.labelString, animationLabel.labelString, textureLabel.labelString}; patchSize = default; foreach (var label in labels) { var handle = Addressables.GetDownloadSizeAsync(label); yield return handle; patchSize += handle.Result; } if (patchSize > decimal.Zero) { //Down waitMessage.SetActive(false); downMessage.SetActive(true); sizeInfoText.text = GetFileSize(patchSize); } else { downValText.text = " 100 % "; downSlider.value = 1f; yield return new WaitForSeconds(2f); LoadingManager.LoadScene("MainLobby"); } } private string GetFileSize(long byteCnt) { string size = "0 Bytes"; if (byteCnt >= 1073741824.0) { size = string.Format("{0:##.##}", byteCnt / 1073741824.0) + " GB"; } else if (byteCnt >= 1048576.0) { size = string.Format("{0:##.##}", byteCnt / 1048576.0) + " MB"; } else if (byteCnt >= 1024.0) { size = string.Format("{0:##.##}", byteCnt / 1024.0) + " KB"; } else if (byteCnt > 0 && byteCnt < 1024.0) { size = byteCnt.ToString() + " Bytes"; } return size; } #endregion #region DownLoad public void Button_DownLoad() { StartCoroutine(PatchFiles()); } IEnumerator PatchFiles() { var labels = new List<string>() { prefabLabel.labelString, materialLabel.labelString, animationLabel.labelString, textureLabel.labelString}; foreach (var label in labels) { var handle = Addressables.GetDownloadSizeAsync(label); yield return handle; if (handle.Result != decimal.Zero) { StartCoroutine(DownLoadLabel(label)); } } yield return CheckDownLoad(); } IEnumerator DownLoadLabel(string label) { patchMap.Add(label, 0); var handle = Addressables.DownloadDependenciesAsync(label, false); while (!handle.IsDone) { patchMap[label] = handle.GetDownloadStatus().DownloadedBytes; yield return new WaitForEndOfFrame(); } patchMap[label] = handle.GetDownloadStatus().TotalBytes; Addressables.Release(handle); } IEnumerator CheckDownLoad() { var total = 0f; downValText.text = "0 %"; while (true) { total += patchMap.Sum(tmp => tmp.Value); downSlider.value = total / patchSize; downValText.text = (int)(downSlider.value * 100) + " %"; if (total == patchSize) { yield return new WaitForSeconds(1f); // 지연 시간 추가 LoadingManager.LoadScene("MainLobby"); break; } total = 0f; yield return new WaitForEndOfFrame(); } } #endregion}이렇게 다운로드를 받았습니다. 그리고나서 using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine;using UnityEngine.AddressableAssets;using UnityEngine.ResourceManagement.AsyncOperations;public class GameManager : MonoBehaviour{ public GameObject _player; public Dictionary<string, string> stateNameMap = new Dictionary<string, string>(); private IEnumerator CreateCharacter() { var initializeOperation = Addressables.InitializeAsync(); yield return initializeOperation; if (initializeOperation.Status == AsyncOperationStatus.Succeeded) { Debug.Log("Addressables initialized successfully"); LocalPlayerLoad(); } } private void Start() { StartCoroutine(CreateCharacter()); } public void LocalPlayerLoad() { Addressables.InstantiateAsync("Assets/Project/Asset/Prefab/Human.prefab", new Vector3(0, 0, 0), Quaternion.identity).Completed += callback => { if (callback.Status == AsyncOperationStatus.Succeeded) { _player = callback.Result; } }; }}이렇게 Human이라는 프리펩을 불러왔는데 animator창을 열고 불러와진 Human캐릭터를 하이어라키에서 선택을하면 현재 애니메이션의 상태가 보여야하는데 이런식으로 나오는겁니다.. 이건 animatorcontroller를못불러온건가요? 아니면 addressable로 지정하면 원래 볼수없는건가요? 근데 이렇게 나오면 애니메이션 상태를 볼수없기때문에 디버깅이 너무 어려워지는데.. 제가 뭔가 잘못한게 맞겠죠?
-
해결됨[C#/.NET 8.0]어서와, Blazor Server는 처음이지?
PostgreSQL 설치
안녕하세요. 강의를 보던 도중 PostgreSQL을 설치하라고 하셔서, 수업 노트에 남겨두신 다운로드 url 링크를 타고 들어갔습니다.해당 사이트에서 가장 최신 버전부터 하나씩 다 다운로드 해서 exe 파일을 모두 실행 시켜봤지만,,, Setup 설치 창 자체가 display되지 않습니다..
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
혹시 문제해결을 파일올리면 봐주실수있나요?
혹시 제가 아무리해도 문제가 해결이 안되서 그런데 따로 프로젝트를 구글드라이브 링크로 올리면 봐주실수있나요?..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 OnAcceptCompleted, 클라이언트 OnConnectCompleted 함수의 Start()
Lister 클래스Session session = sessionFactory.Invoke(); session.Start(args.AcceptSocket); // ★ Connector 클래스Session session = _sessionFactory.Invoke(); session.Start(args.ConnectSocket); // ★ 1)args.AcceptSocket args.ConnectSocketStart 함수의 매개변수 둘 다 클라이언트 소켓이 맞나요??
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
사용하시는 테마가 궁금합니다
vs code에서 사용하시는 테마가 궁금합니다.저는 코드위에 마우스를 얹어놓아도 해당 코드에 대한 설명(어떻게 작성해야하는지, 인수들이 뭐가 있는지)가 안뜨는데 어떤 테마로 설정해야 나올수 있나요? 참고로 파일 - hover(?)값에서 사용으로 변경해놓았는데도 코드에 대한 설명이 안나옵니다..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Unity FBX Import Warning
에셋 임포트시 경고 메시지가 뜨는 데 무엇을 의미하는 것일까요?
-
미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
Part4 유니티로 세가지의 게임만들기 강의
Part4 유니티로 세가지의 게임만들기 강의 위 강의 보고 싶은데..인프런에는 없는데 어디서 볼 수 있나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
에셋 구름 아이콘이 없어요
어디서 받을 수 있나요?다운로드 버튼이 아무리 찾아도 없습니다.
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
폴더 이름 제일 앞에 @를 붙이는 이유가 궁굼해요
보통 회사들이 폴더 이름 앞에 @붙여 사용하는지 궁굼하고 왜 붙이는지도 궁굼합니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
9주차 소스코드 관련
안녕하세요맥북으로 강의를 수강하면서 따라하고 있는데,section 3 - 신규 BaseMap 강의의 TileMaps 폴더를 전부 날리고 M1에서 가져오는 과정에서한글이 들어간 파일명들 때문에 CustomTile을 제대로 불러오지 못하고, 이로 인해 NPC, 몬스터 등이 맵에 뜨지 않습니다.macOS의 경우 한글이 파일명에 들어간 경우 압축 해제할때 파일명이 깨지는 오류가 있습니다. 그래서 파일명이 깨지지 않게 하는 Keka 등의 macOS용 파일 압축 및 해제 도구를 사용해봤지만 타일맵들을 여전히 제대로 불러오지 못합니다.그래서 부탁드리고 싶은데, 혹시 @Resources/Tilemaps 폴더 내 한글로 된 파일들은 전부 영어로 바꾼 버전의 M1도 올려주실 수 있나요?강의를 수강하는데 오브젝트들이 안 뜨다보니 많이 불편하네요..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
유니티 싱글톤 패턴 질문있습니다
강의 내용에 따르면 GameObject go = GameObject.Find("@Managers");Managers mg = go.GetComponent<Managers>(); 이 부분이 부하가 많이가는 부분이라 싱글톤기법을 이용한다고 하셨는데요 싱글톤을 구현하는 도중에 GameObject go = GameObject.Find("@Managers");Managers mg = go.GetComponent<Managers>();이 부분을 다시 쓰던데 위의 코드를 안쓰기 위해서 싱글톤패턴을 배우는건데 저 코드를 또 쓴다는게 인과관계가 좀 안맞는거 같아서 질문올립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강의 4분 디버깅기능 이용하는데 질문있습니다
강의대로 똑같이 따라했는데 중단점을 사용할수 없다고 뜨네요 인터넷 검색해서 나온것들을 따라해봤는데 여전히 작동하질 않습니다 여기에라도 올려봐요
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
앞으로 진행 궁금합니다
안녕하세요 바닥부터 출시후 운영까지 배우는 강의라 구입했습니다이번주도 안나오면 앞으로 강의 6개 남았나요??아니면 어떻게 진행되나요 뭔가 진행 할수록 스킵되는 기분이라 과연 앞으로 6월까지 강의로 결제 시스템 와 운영까지 할 수 있게 끔 강의가마무리가 어떻게 될지 불안하고 궁금합니다