묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다
이제는 제가 루키즈 님하고 똑같은 생각을 가지고 무언가 만든다는걸 느꼈어요.실력이 그만큼 상승했다는걸 체감했습니다. 정말 감사합니다. 꼭 rpg 게임을 하나 만들어서 저도 진정한 개발자가 되고 싶네요 사운드 매니져 만들때 딕셔너리로 캐싱을 하는 부분에서 정말 놀랐습니다. 전 그냥 2편까지만 보고 캐싱하는 부분에서 딕셔너리로 캐싱하면 좋겠다 라고 생각해서 만들었는데 루키즈 님도 동일하게 만들고 계시더라구요. 사실 딕셔너리 말고 이걸 pool작업이 이미 되어 있는 부분으로 처리할까도 고민했는데 이부분은 어차피 유니티에서 미리 작업 할수 있는 부분이라 클립으로 그냥 캐싱하는게 좋을듯 하여 딕셔너리로 처리 했는데 저랑 동일하게 생각하는 부분이 있어서 놀랐습니다. 항상 몸 건강하시고 감사드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C++ 전혀 모르는데 C# 서버
C++ 전혀 모르는데 C#서버 만드는데전혀 지장 없을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의에 질문이 있습니다
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ServerParctice { internal class Connector { Func<Session> _sessionFactory; public void Connect(IPEndPoint endPoint, Func<Session> sessionFactory) // 커넥트할건데 비동기로 할거 { // 일단 연결할 상대방의 주소를 알아야겟지? Socket socket = new Socket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp); SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs(); _sessionFactory = sessionFactory; connectArgs.Completed += OnConnectCompleted; connectArgs.RemoteEndPoint = endPoint; connectArgs.UserToken = socket; RegisterConnect(connectArgs); } void RegisterConnect(SocketAsyncEventArgs args) { Socket socket = args.UserToken as Socket; bool pending = socket.ConnectAsync(args); if(pending == false) { OnConnectCompleted(null,args); } } void OnConnectCompleted(object sender, SocketAsyncEventArgs args) { if(args.SocketError == SocketError.Success) { Session session = _sessionFactory.Invoke(); session.Start(args.ConnectSocket); session.OnConnect(args.RemoteEndPoint); } else { Console.WriteLine($"OnConnectCompleted Failed : {args.SocketError} "); } } } }강의 코드인데요, Connector객체는 하나만 만들고 그 Connector가 Connect()를 호출하면서 연결할 서버들의 소켓을 만들고 세션을 만드는데요. Func<Session> sessionFactory; 이 부분이 왜 전역변수로 관리되는지가 궁금해요. Connect()를 호출할때마다 _sessionFactory에 할당되는게 달라지는데 만약 멀티쓰레드 환경에서 동시다발적으로 Connect()를 호출하게 된다고하면 경쟁이 일어날거 같아서요. 만약 Connector객체 하나가 하나의 연결만 관여를 한다면 socket은 왜 전역으로 안 빠져있는지도 궁금하네요
-
해결됨[Unity6] 나만의 서바이벌 게임 만들기
AddMarker를 했는데 east와 west는 잘되는데, north/south가 거꾸로 인식되는데 어떻게 해야할까요?
AddMarker를 했는데 east와 west는 잘되는데, north/south가 거꾸로 인식되는데 어떻게 해야할까요?public void UpdateMarkers(){ for (int i = ActiveMarkers.Count - 1; i >= 0; i--) { MarkerInfo markerInfo = ActiveMarkers[i]; if (markerInfo.TargetTransform == null) { Destroy(markerInfo.MarkerUI.gameObject); ActiveMarkers.RemoveAt(i); continue; } float heading = PlayerTransform.eulerAngles.y; Vector3 directionToTarget = markerInfo.TargetTransform.position - PlayerTransform.position; float distance = Vector3.Distance(markerInfo.TargetTransform.position, PlayerTransform.position); float targetAngle = Mathf.Atan2(-directionToTarget.x, directionToTarget.z) * Mathf.Rad2Deg; // 각도 생성 float relativeAngle = (heading - targetAngle + 360.0f) % 360.0f; float normalizedAngle = relativeAngle / 360.0f; // float xPosition = Mathf.Lerp(-CompassWidth, CompassWidth, normalizedAngle); markerInfo.MarkerUI.anchoredPosition = new Vector2(xPosition, markerInfo.MarkerUI.anchoredPosition.y); markerInfo.MarkerText.text = string.Format("{0:0.0} m", distance); }}
-
미해결[Unity6] 나만의 서바이벌 게임 만들기
3강의 내용이 1강과 동일합니다
3강의 내용이 1강과 동일합니다 영상이슈일까요? 멈출때 미끄러지듯 멈추는 문제 해결하겠다고 하고선 영상이 갑자기 끝납니다.
-
해결됨AI 시대의 혁신적인 게임 개발 입문 with Unity6
코딩 계란레벨이라 자질구리한 질문? 입니다.
순서대로 따라하면서 이해하려고 하고 있습니다.해당 강의 포인트씬1은 엔터로 결과출력씬2는 버튼으로 결과출력씬3은 엔터 및 버튼으로 결과출력으로 설명이 된거 같은데,,2랑 3이랑 같지 않나요?2에서도 버튼 및 엔터로 출력이 되는거 맞죠?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티스레드 이해도 질문
안녕하세요 강사님멀티쓰레드 부분을 봤는데여기서 개념적인 부분만 이해했고 코드도 이게 뭐하는건지만 이해 했는데 요정도만 알고 다음 스탭으로 넘어가도 될까요? 아니면 좀 깊게 이해 한 후에 다음 장을 넘어가는게 좋을까요?
-
해결됨[Unity6] 나만의 서바이벌 게임 만들기
Text Object 애니메이션 이슈
Text Object 를 만들고 애니메이션으로 좌표 를 정하고 prefab에 등록해서 사용하려는데 자꾸 첫 위치에만 TextObject들이 생성 됩니다 애니메이션에 Destory만 넣으면 정상적으로 캐릭터 주변에 TextObject가 생성되는데 어느 곳을 봐야 할까요?
-
해결됨[Unity6] 나만의 서바이벌 게임 만들기
Material 방식 수정 후 처음 포탈 할때만 아래 오류가 발생합니다
Material 'Opaque_M' has a missing parent with GUID: ffa1ddcbeccdb954fa4dd4547bab8262.UnityEngine.Renderer:get_material ()Building_OBJ/<CompletedCoroutine>d__20:MoveNext () (at Assets/00_Scripts/Building/Building_OBJ.cs:92)UnityEngine.MonoBehaviour:StartCoroutine (System.Collections.IEnumerator)Building_OBJ:BuildCompleted () (at Assets/00_Scripts/Building/Building_OBJ.cs:74)Building_OBJ/<SliderFillCoroutine>d__22:MoveNext () (at Assets/00_Scripts/Building/Building_OBJ.cs:141)UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr)코드는 아래와 같습니다private IEnumerator CompletedCoroutine(){ float current = 0.0f; float percent = 0.0f; float emissionStart = 1.0f; float emissionEnd = 20.0f; Color startColor = Color.white; Color endColor = Color.black; while (percent < 1.0f) { current += Time.deltaTime; percent += current / 1.0f; float lerpEmission = Mathf.Lerp(emissionStart, emissionEnd, percent); renderer.material.SetColor("_EmissionColor", startColor * lerpEmission); yield return null; }에서 float lerpEmission = Mathf.Lerp(emissionStart, emissionEnd, percent);이 부분에서 오래가 발생합니다 chat gpt에 물어보니 Opaque_M(또는 Transparent_M)이 Material Variant인데 부모 GUID가 유실됨.부모 GUID가 유실되었다고 하네요
-
미해결[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
소스코드 문의드립니다.
안녕하세요 강사님.매번 좋은 강의 감사합니다.프로젝트강의를 진행하면서 도움을 받고자 전체 프로젝트 소스를 받을 수 있을까요??이메일 dandy83ten@gmail.com
-
미해결[유니티 실전 프로젝트] Burger Please 모작
3D인데 직교투영?
안녕하세요~ 언제나 고급진 강의 감사합니다.3D오랜만에 해서 헷갈리는데요.Perspective를 주로 사용했던것 같은데여기서는 직교투영으로 세팅이 되어 있는데왜 그런걸까요?2D 할때 직교투영으로 많이 했었는데3D에서 직교투영으로 하는 이유가 궁금합니다~
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
500 vs 500
500 vs 500을 본적이 없다고 하셨는데최대 몇명까지 다수 PK가 되는 걸 보셨나요?인원수는 2D와 3D 게임이냐에 따라 달라지기도하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
지난 강의와 이어지는게 맞을까요?
18. Skill AI 보고 이어서 19. Protobuf 이식 (코드 리뷰)강의를 보는데, "지난 시간에 이러이러한 강의를 했다"라는 말씀을 하시는데 지난 시간에 서버 관련 강의가 아예 없었어서.. 이어지지가 않네요.. 어떻게 된 것인지 모르겠어서 혼란 스럽네요 ㅠㅠ 중간에 이어지는것이 없고 19번째 강의를 보려니 무슨 말씀이신지 잘 따라가지를 못하겠어요.. 갑자기 저 파일은 왜 지우시며,, 저게 뭐지 싶어서.. 혹시 제가 뭔가 못찾고있으려나요..?ㅠ
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
18 유저 데이터 온라인DB 로드 및 저장 PT4의 UserInventoryData 클래스에 대하여
private void ConvertFirestoreDictToData(Dictionary<string, object> dict) { EquippedWeaponData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedWeaponData"]); EquippedShieldData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedShieldData"]); EquippedChestArmourData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedChestArmourData"]); EquippedBootsData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedBootsData"]); EquippedGlovesData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedGlovesData"]); EquippedAccessoryData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedAccessoryData"]); InventoryItemDataList = ConvertDictToInventoryList((List<object>)dict["InventoryItemDataList"]); if(dict.TryGetValue("EquippedWeaponData", out var equippedWeaponDataValue) && equippedWeaponDataValue is Dictionary<string, object> equippedWeaponDataDict) EquippedWeaponData = ConvertDictToUserItemData(equippedWeaponDataDict); if (dict.TryGetValue("EquippedShieldData", out var equippedShieldDataValue) && equippedShieldDataValue is Dictionary<string, object> equippedShieldDataDict) EquippedShieldData = ConvertDictToUserItemData(equippedShieldDataDict); if (dict.TryGetValue("EquippedChestArmourData", out var equippedChestArmorDataValue) && equippedChestArmorDataValue is Dictionary<string, object> equippedChestArmorDataDict) EquippedChestArmourData = ConvertDictToUserItemData(equippedChestArmorDataDict); if (dict.TryGetValue("EquippedBootsData", out var equippedBootsDataValue) && equippedBootsDataValue is Dictionary<string, object> equippedBootsDataDict) EquippedBootsData = ConvertDictToUserItemData(equippedBootsDataDict); if (dict.TryGetValue("EquippedGlovesData", out var equippedGlovesDataValue) && equippedGlovesDataValue is Dictionary<string, object> equippedGlovesDataDict) EquippedGlovesData = ConvertDictToUserItemData(equippedGlovesDataDict); if (dict.TryGetValue("EquippedAccessoryData", out var equippedAccessoryDataValue) && equippedAccessoryDataValue is Dictionary<string, object> equippedAccessoryDataDict) EquippedAccessoryData = ConvertDictToUserItemData(equippedAccessoryDataDict); if (dict.TryGetValue("InventoryItemDataList", out var inventoryItemDataListValue) && inventoryItemDataListValue is List<object> inventoryItemDataList) InventoryItemDataList = ConvertDictToInventoryList(inventoryItemDataList); }위와 같이 수정하셨는데, trygetvalue로 체크하는것으로 바꾸었으니 아래와 같은 부분을 지워주는게 맞지 않나요? 안그러면 중복 처리 되는게 아닌가요? EquippedWeaponData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedWeaponData"]); EquippedShieldData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedShieldData"]); EquippedChestArmourData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedChestArmourData"]); EquippedBootsData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedBootsData"]); EquippedGlovesData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedGlovesData"]); EquippedAccessoryData = ConvertDictToUserItemData((Dictionary<string, object>)dict["EquippedAccessoryData"]); InventoryItemDataList = ConvertDictToInventoryList((List<object>)dict["InventoryItemDataList"]);
-
해결됨AI 시대의 혁신적인 게임 개발 입문 with Unity6
질문이 하나 있습니다.
기존에 VISUAL STUDIO 2022 를 사용중인데VISUAL STUDIO CODE를 써야 더 좋을까요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnAcceptHandler 액션 함수
강의 코드에서 _onAcceptHandler에 +=로 onAcceptHandler를 등록해주고 있는데,어차피 액션 함수는 한 번만 변수에 할당해두고 이후 통신할 때마다 재사용되는 구조잖아요?그렇다면 =로 해도 될 것 같은데, +=를 사용한 특별한 이유가 있을까요?
-
해결됨[Unity6] 나만의 서바이벌 게임 만들기
Inventory #1 강의 31분 28초경 오류 납니다
Inventory #1강의 31분 28초경 오류 납니다Assets\00_Scripts\UI\PART\INVENTORY.cs(27,23): error CS1503: Argument 1: cannot convert from 'UnityEngine.GameObject' to 'Item_Panel'go가 gameObject가 아니라는 오류 같은데 어떻게 해야할까?
-
미해결2. 유니티가 어려운 입문자를 위한 입문용 게임 제작
오류 질문입니다
문제 1.기즈모 라인이 scene 화면에서 안보이고 game 화면에서만 보입니다 문제 2 - 해결완료 ! - 문제 3. 스크립트 작성후 저장하니 CommandBuffer: built-in render texture type 3 not found while executing (SetRenderTarget depth buffer)UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)이 오류가 생기기 시작했습니다 game창에서 기즈모를 끄고 하니 오류가사라지는데 계속 기즈모를 끈 상태에서 작업해야 할까요 ?
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
16번 강의에서 ShowUI 함수부분 오타가 있는거 같습니다.
public virtual void ShowUI() { if (!m_UIOpenAnim) { m_UIOpenAnim.Play(); } m_OnShow?.Invoke(); m_OnShow = null; }위 함수에서 선생님 말씀으로는 m_UIOpenAnim이 있다면 플레이라고 하시는데 적는 코드는 위 처럼 m_UIOpenAnim가 널일 때 플레이라고 적혀있습니다
-
미해결[Unity6] 함께 만들어가는 서바이벌 게임 개발 - 스팀 출시 도전기
21강 화염구 23분 51초 StarCheck 메소드는 어디에 있나요?
현재 21강 화염구 강의를 시청하고 있습니다.23분 51초에 가면 CardSelector.cs 의 SelectCard 메소드를 보는 장면이 있는데, 이 부분에서if(i == value) { cards[i].SetAnimation("Card_Select"); MANAGER.SESSION.SelectedCard(cards[i].card); cards[i].StarCheck(); }이렇게 코드가 있습니다.그런데 cards[i].StarCheck() 이 메소드는 제가 이전 강의를 둘러봐도 안보이더라구요.18강 카드 DataBase 강의의 SelectCard 메소드 수정하는 부분에서는 전혀 StarCheck 메소드가 나타나지않았는데, 위에 말한 23분 51초 장면에서는 저 코드가 떡하니 존재하네요.혹시 이 코드는 중요한 부분이 아닌가요?아니면 코드가 어떻게 되는지 알려주실 수 있나요?/// 09-16 추가혹시 제가 잘못봤나싶어서 다시 강의를 보았지만 확실히 18강에서 card.cs 의 초기화 메소드 부분에 코드를 작성할 때 StarCheck 메소드는 없었습니다.19강에서는 SkillFrame 스크립트만 소개하는 부분이였고, 20강의 10분 39초쯤에 가보면 card.cs에 갑자기 StarCheck 메소드가 이미 들어있습니다.원래 19강에 있어야했던 것인지 모르겠지만, 현재 31강을 들은 시점에서, 31강의 10분 57초쯤으로 가시면 StarCheck 메소드 코드 전체가 나옵니다. 이 부분을 보고 직접 수정해야할 듯 합니다.