묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨이득우의 꼭 배워야하는 게임 알고리즘
depth 구할 때 floor로 처리하면 -1이 사라지는 과정이 잘 모르겠어요.
결국엔 log(2, x) -1 = floor ( log(2,x) ) 라는 것 같아 보이는데.. 이 수식이 잘 이해가 안 가는 것 같아요....
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
강의는 유니티 버전 몇으로 진행하시나요?
안녕하세요이번에 진행하시는 강의는 유니티 버전 몇으로 진행하시나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
비동기 씬로딩관련해서 질문있습니다.
예제에서는 매니저들을 관리하기위해서 모노비헤비어를 상속하지않은상태에서 매니저들을 받아서 관리하게 돼있는데 씬매니저를 만들면서 비동기 씬이동을 구현해보고 싶어서 해보고있는데 모노비헤비어가 상속되지않은 클래스에서는 코루틴을 사용할수가없다보니까 어떻게 해야할지 막혔습니다...기존의 씬매니저에서 IEnumerator LoadAsynchronouslytime(string name) { AsyncOperation operation = SceneManager.LoadSceneAsync(name); operation.allowSceneActivation = false; float elapsedTime = 0f; while (!operation.isDone) { elapsedTime += Time.deltaTime; Debug.Log(elapsedTime); slider.value = elapsedTime / 10f; if (elapsedTime > 10f) { operation.allowSceneActivation = true; } yield return null; } }이런식으로 비동기 코드를 작성했는데요..코루틴을 사용하면 정상작동을 하긴하는데 모노비헤비어를 상속받지않은 상태에서 어떻게 사용하는지 감이 안잡힙니다.
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
GetQuads가 out of area를 체크 할 수 있는건가요??
_bounds가 노드의 영역일텐데 _bound.center와의 비교는 방향을 구하기는 하지만 영역을 완전히 넘어가는지는 체크 못하지 않나 싶어서 질문드렸습니다...
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티 스레드 환경에서의 캐시 효율
멀티 스레드 환경에서 A,B 2개의 쓰레드가 있다고 가정했을때프로세스에서 어떤 전역 Data number를 +1 해달라는 주문이 들어 왔을때 A쓰레드에서 해당 주문을 받고 동시에 B도 해당 주문을 받는다면 문제가 되기때문에 동기화를 해줘야한다고 말씀 주셨는데요 그렇게 되면 A가 주문을 받고 다시 Ram에 동기화 그다음 B가 주문을 받고 Ram에서 수정된 값을 가져와서 다시 Ram에 동기화 이런식이라면 멀티 쓰레드 환경에서는 캐시의 의미가 없는건가요?캐시라는게 결국엔 프로세서와 Ram간의 거리가 멀기 때문에 이걸 완하해주는게 캐시로 알고 있는데 멀티 환경에서 주문이 들어올때마다 Ram에서 최신화 정보 가져오고 다시 동기화 한다면 캐시의 의미가 없어지는게 아닌가 해서 이렇게 질문 남기게 됩니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
선생님처럼 이동못할때도 정상적으로 애니메이션이 작동을 안합니다
void UpdateIsMoving() { if (State != Define.CreatureState.Moving && Dir != Define.Dir.None) { Vector3Int destPos = CellPos; State = Define.CreatureState.Moving; switch (Dir) { case Define.Dir.Up: destPos += Vector3Int.up; break; case Define.Dir.Down: destPos += Vector3Int.down; break; case Define.Dir.Left: destPos += Vector3Int.left; break; case Define.Dir.Right: destPos += Vector3Int.right; break; } if (Managers.Map.CanGo(destPos)) { if (Managers.Object.Find(destPos) == null) CellPos = destPos; } } } void UpdatePosition() { if (State != Define.CreatureState.Moving) { return; } Vector3 destPos = Managers.Map.currentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f, 0); Vector3 moveDir = destPos - transform.position; float dist = moveDir.magnitude; if (dist < _speed * Time.deltaTime) { transform.position = destPos; State = Define.CreatureState.Idle; } else { transform.position += moveDir.normalized * _speed * Time.deltaTime; State = Define.CreatureState.Moving; } } 이동할 수 없는 구역에 가려고할때 애니메이션이 IDLE과 WALK를 번갈아가면서 부들부들거립니다.UpdateIsMoving에서 State를 Moving으로 바꾸더라도 실제 CellPos에는 적용이 안되어있다 보니 State가 곧 바로 IDLE로 바뀌기 때문인것 같은데 어떻게 해결할 수 있을까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
멘토링 한자리 남겨주실수 있을까요?
혹시 가능하다면 멘토링 한자리 남겨주심 안될까요?회사에서 지원하는 금액이 넘어가서 멘토링은 담달초에 등록할려고 합니다. 2인 개발을 목표로 하고 있는데 한명은 그래픽이고 제가 기획이랑 프로그래밍을 할 예정이라 꼭 듣고 싶습니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
UI_Button 클론이 무한생성
UI_Button 클론이 무한생성됩니다. public class Test : MonoBehaviour { GameObject er; void Update() { if (Input.GetMouseButtonDown(0)) { Managers.UI.ShowPopupUI<UI_Button>(); } } }아래 코드로 문제가 있어서 화면을 클릭했을 때만 팝업이 뜨도록 위의 코드로 Test 스크립트를 일부 바꿔 봤습니다.그러고나서 보니까public static UIManager UI{get{return instance._ui;}} 이 지점에서 계속 다시 Test 파일의if (Input.GetMouseButtonDown(0)) { Managers.UI.ShowPopupUI<UI_Button>(); }이 부분으로 가는 것 같습니다. 늘어나는 갯수로 처음엔 한번 클릭했을 때는 한번으로 잘 늘어나는데 그 다음엔 2개가 생기고 그 다음엔 5개..? 규칙을 알 수 없게 늘어납니다저 요즘 질문 너무 많이하죠..ㅜㅜ 그치만 미워하지 말아주세요 다 기본 3시간은 고민고민하며 노려보다가 보내는거긴해유..하핳..using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { GameObject er ; void Start() { Managers.UI.ShowPopupUI<UI_Button>(); } void Update() { } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResourceManager { public T Load<T>(string path) where T:Object { return Resources.Load<T>(path); } public GameObject Instantiate(string path, Transform parent = null) { GameObject prefab = Load<GameObject>($"Prefabs/{path}"); if (prefab == null) { Debug.Log($"Failed to load prefab : {path}"); return null; } return Object.Instantiate(prefab, parent);//Object붙이는 이유는 리소스메니저에 있는 Instantiate를 또 호출하려고 할까봐. } public void Destroy(GameObject go) { if(go == null) return; Object.Destroy(go); } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Managers : MonoBehaviour { static Managers s_Instance; //유일성이 보장된다 static Managers instance { get { Init(); return s_Instance; } } // 유일한 매니저를 갖고온다 ResourceManager _resource = new ResourceManager(); UIManager _ui = new UIManager(); public static UIManager UI{get{return instance._ui;}} public static ResourceManager Resource{get{return instance._resource;}} // Start is called before the first frame update void Start() { Init(); } // 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>(); } } }using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIManager { int _order = 0; //팝업 목록을 들고있어야함. 스택 구조으로 관리하기 가장 마지막에 띄운 팝업이 가장 먼저 삭제돼야하니까. Stack<UI_Popup> _popupStack = new Stack<UI_Popup>(); public T ShowPopupUI<T>(string name = null) where T : UI_Popup//T에는 UI버튼이라는 스크립트를 건네고 name에는 팝업프리펩을 건네줄거임. { if(string.IsNullOrEmpty(name))//이름이 비어있으면 T타입의 이름과 똑같은걸로 넣겠다. name = typeof(T).Name; GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}"); T popup = Util.GetOrAddComponent<T>(go); _popupStack.Push(popup); return popup; } public void ClosePopupUI() { if (_popupStack.Count == 0) //stack을 건드릴 떈 항상 카운트를 체크하는걸 습관화하기 return; UI_Popup popup = _popupStack.Pop(); Managers.Resource.Destroy(popup.gameObject); popup = null; _order--; } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Util { public static T GetOrAddComponent<T>(GameObject go) where T : UnityEngine.Component { T component = go.GetComponent<T>(); if (component == null) component = go.AddComponent<T>(); return component; } public static GameObject FindChild(GameObject go, string name = null, bool recursive = false) { Transform transform = FindChild<Transform>(go, name, recursive);//<Transform>을 사용하면 FindChild 메서드가 호출될 때 해당 메서드는 Transform 타입의 자식을 찾도록 약속됩니다. 이는 제네릭을 사용하여 메서드를 특정 타입에 제한하는 방법 중 하나입니다. if (transform == null) return null; return transform.gameObject; } public static T FindChild<T>(GameObject go, string name = null, bool recursive = false) where T : UnityEngine.Object { if (go == null) return null; if (recursive == false) { for (int i = 0; i < go.transform.childCount; i++) { Transform childTransform = go.transform.GetChild(i); if (string.IsNullOrEmpty(name) || childTransform.name == name) { T component = childTransform.GetComponent<T>(); if (component != null) return component; } } } else { foreach (T component in go.GetComponentsInChildren<T>(true)) { if (string.IsNullOrEmpty(name) || component.name == name) return component; } } return null; } }
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
return Object.Instantiate(prefab, parent); 여기서 값이 Null로 바뀌어요
ResourceManager 스크립트 코드 중 일부입니다. public GameObject Instantiate(string path, Transform parent = null){GameObject prefab = Load<GameObject>($"Prefabs/{path}");if (prefab = null){Debug.Log($"Failed to load prefab : {path}");return null;}return Object.Instantiate(prefab, parent);} 여기서 prefab에 로드로 경로 잘 찾아서 오브젝트가 잘 들어가는데요return Object.Instantiate(prefab, parent);이 부분에서 아래의 오류가 뜹니다 ㅠㅠ 어딜 다시 봐야할까요?? System.ArgumentException: The Object you want to instantiate is null.at UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) [0x00009] in <30adf90198bc4c4b83910c6fb1877998>:0
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
드래그가 안되는데 어디서 잘못된건지 도저히 모르겠습니다
EventHandler를 자동으로 만드는 과정에서 여러 스크립트가 관여하다보니 헷갈립니다. 드래그하려는 이미지들을 포함한 캔버스에 스크립트 파일을 넣어야하는거 맞나요?스크립트 파일은 MonoBehavior을 상속받는 애들이라면 다 넣어야하는건지..? 넣는 기준이 헷갈려요. 그리고 뭔가 잘못했는지 한 이미지는 드래그 하면 움직이고 다른 이미지는 안움직였는데, 뭐가 다른지 확인해보려고 움직이는 이미지를 복붙해서 확인해보니 갑자기 다 안 움직입니다..ㅇㅁㅇ ㅎㅎ.....너무 모르겠어서 이메일 보내보겠습니다 ㅠㅠ 감사합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SocketAsyncEventArgs 가 연속된 패킷을 모으는 역할을 하나요?
[테스트1]아래 처럼 클라이언트에서 Send를 5번 하는데for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"Hello World! {i} "); int sendByte = socket.Send(sendBuffer); } 강의 결과 화면처럼 서버에서는 5번의 Send 패킷을 모았다가 출력하는 모습을 볼 수 있습니다. [테스트2]아래에서도 마찬가지로 Send를 5번 하는데,1초 딜레이를 주고 실행했습니다.for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"{i} "); int sendByte = socket.Send(sendBuffer); Thread.Sleep(1000); } 이때는 서버에서 패킷을 모을 시간이 없었던건지,Send 패킷을 안모으고 출력하는 모습을 볼 수 있습니다. [질문]서버에서 패킷을 모으는 역할을 하는 것이 무엇인가요?SocketAsyncEventArgs 인가요?그리고 패킷을 모으는 기준이 무엇인지 궁금합니다.시간인가요? 아니면 끊임 없이 연속적으로 보내지는 패킷인가요? 아니면 다른 무엇인가요?SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); recvArgs.SetBuffer(new byte[1024], 0, 1024);
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
not exist in the namespace 에러가 납니다
error CS0234: The type or namespace name 'AddressableAssets' does not exist in the namespace 'UnityEngine' (are you missing an assembly reference?) error CS0234: The type or namespace name 'ResourceManagement' does not exist in the namespace 'UnityEngine' (are you missing an assembly reference?) 이 두 부분에서 에러가 뜨는데 어떻게 해결해야 하나요?
-
해결됨무작정 따라하기! TPS 게임 만들기.
27:46 4강) 콘솔 에러가 발생했습니다
NullReferenceException: Object reference not set to an instance of an objectGameManager.Update () (at Assets/_My/Scripts/GameManager.cs:50) 콘솔에 출력된 에러 내용입니다.cs:50 은 bulletText.text = currentBullet + " / " + maxBullet; 부분입니다. 오브젝트를 못찾는거같은데 어떻게 해결할 수 있을까요
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
강의 내용에 대해서 궁금한점이 있습니다.
안녕하세요. 질문이 있어서 글을 남기게 되었습니다.루키스님의 지난 강의 유니티로 MMORPG만들기에서 데이터베이스를 mssql, entity framework로 만드셨는데 이번에도 같은 것으로 진행 하는것인지 궁금합니다.인디, 또는 개인개발자를 대상으로 진행하는 교육인 만큼 리눅스 서버에서 돌아가는 mysql, 또는 mariaDB와 같은 비용이 최소화되는 환경으로 진행되었으면 하는데 여기에 대해서 답변 주실 수 있을까요?이미 강의를 구입하였는데 저 또 한 개인개발을 목표로 하고 있어서 강의내용에 대해서 궁금합니다.!!
-
해결됨무작정 따라하기! TPS 게임 만들기.
3강 31:42 private Rig 를 사용하기 위해서 using 구문을 추가해야 합니다
영상에 using 구문이 적용되는 장면은 나오지 않았지만using UnityEngine.Animations.Rigging;을 추가해주셔야 private Rig handRig;가 에러없이 작동합니다. 5분동안 헤매다가 해결법을 찾아서 올립니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
onAcceptHandle 추가 위치 질문 드립니다.
_listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _onAcceptHandler += onAcceptHandler; _listenSocket.Bind(endPoint); _listenSocket.Listen(10)위 코드에서 new Socket() 한 뒤에_onAcceptHandler += onAcceptHandler; 로 핸들러를 추가 했는데,아래 코드처럼 Listen() 뒤에 추가 해도 문제 없을까요?_listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _listenSocket.Bind(endPoint); _listenSocket.Listen(10); _onAcceptHandler += onAcceptHandler;
-
해결됨무작정 따라하기! TPS 게임 만들기.
2강 주의)2:49 에셋과 3:36 에셋이 다릅니다
반드시 3:36 에셋으로 다운로드/임포트 해야합니다2:49에 나오는 에셋은 잘못된 에셋이에요. 그리고 2022.3.15 유니티로 하면 에셋 몇가지가 누락되어 다운로드되니 2022.3.12로 무조건 하셔야합니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
byte[] -> ArraySegment 변환 중 생략 된 부분
더미클라와 서버의 Program.cs에서byte가 arraysegment 부분으로 변환되는게 생략되었습니다.어려운 작업은 아니지만, 뒤에 듣는사람 참고하라고 올립니다. 아닌가.. 내가 잘못한 부분이 있었네 public override void OnConnected(EndPoint endPoint){Console.WriteLine($"OnConnected bytes : {endPoint}");byte[] tempBuff = Encoding.UTF8.GetBytes("Welcome to MMORPG Server!");ArraySegment<byte> sendBuff = new ArraySegment<byte>(tempBuff);Send(sendBuff);Thread.Sleep(1000);Disconnect();} public override void OnConnected(EndPoint endPoint){Console.WriteLine($"OnConnected bytes : {endPoint}");//데이터를 보낸다for (int i = 0; i < 5; i++){byte[] tempBuff = Encoding.UTF8.GetBytes($"Hello World {i}");ArraySegment<byte> sendBuff = new ArraySegment<byte>(tempBuff);Send(sendBuff);}}
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
상업적출시를 위한 에셋 사용범위 문의
우선 좋은 강의 감사합니다.강의해주신 내용 토대로, 좀 더 디벨럽한뒤에 마켓에 출시하고자 합니다. 커뮤니티 게시판에 일부 에셋은 사용해도된다고 하였는데, 확인 차 문의드립니다.캐릭터와 UI/ UX 수정은 하지만, 몬스터 디자인이 맘에 들어 그대로 사용하려고 합니다. 사용해도 되는지 여부와, 몬스터 이미지 에셋 판매 계획이 있으신지 문의드립니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
싱글톤 및 인스턴스, C#파일간의 호출관계 질문
static Managers s_Instance; //유일성이 보장된다 public static Managers instance { get { Init(); return s_Instance; } } // 유일한 매니저를 갖고온다 InputManager _input = new InputManager(); ResourceManager _resource = new ResourceManager(); public static InputManager input { get { return instance._input; } } public static ResourceManager resource { get { return instance._resource; } } c#파일간에 어떤식으로 호출되고 연관되는지 이해가 어렵습니다 질문이 모호해서 죄송합니다. 순서가 어떻게 되는지 잘모르겠습니다. 제일처음 start로 시작하는게 playerController.cs에서 시작해서 void start()안에 Managers.input.KeyAction += OnKeyboard; 로 inputManager.cs에 public Action KeyAction = null; 널로 되어있는 이 값에 OnKeyboard 가 저장되게하고 이 뒤부터 순서를 잘모르겠습니다. Managers.cs InputManager _input = new InputManager();public static InputManager input { get { return instance._input; } } _input 생성자 input메서드 이거 두개가 어떻게 사용되는지 모르겠습니다.