묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
캐릭터 마우스 클릭 이동시 질문입니다.
검색해보니 후반에 추가 수정하셨다는 답변글이 있는거 같은데... 아직 거기까지 진도는 못빼서요. 키보드 입력받고 캐릭터를 돌릴땐 아무 문제가 없습니다. freeze Rotation을하니 회전이 안먹더라구요. 근데 마우스 입력 부분 집어 넣으니 땅을 찍고 이동하면 꼭 도착할때쯤 마지막에 가서 x축이나 z축의 회전이 먹네요. freeze Rotation을 했음에도 불구하고... 후반부에 이 내용에 대한 수정 부분이 나온다면 계속 보면 되겠지만 현재로선 궁금해서 질문 올려봅니다. 제 생각에는 마지막 도착할 즈음에 bool 변수를 false로 바꿔서 더 움직임을 갖고 가지 않도록 막는거 같던데 거기에서 로테이션 값을 리셋시켜주는 방법으로 풀어나가야하나 생각하고 있었습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디버깅 시작 시 오류가 뜹니다
처음부터 안된게 아니라 잘 되다가 vs를 껐다 킨 후 부터 계속 디버그 자체가 실행이 안됩니다. 코드상 문제는 아닌거같은데.. 이유를 잘 모르겠습니다 ㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
anchor 질문이요
anchor가 안보이는데 다른걸 클릭해야 보이는 건가요? 간단한거 같은데 아무리 찾아봐도 안보여서 질문 드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
마우스 클릭 후 물리현상
마우스 클릭해서 캐릭터가 이동하는거까지 잘되는데요. 이동한 후 캐릭터가 조금씩 뜨면서 천천히 날아갑니다. Use Gravity켜면 날아가지는 않는데 어떤 힘을 받는지 천천히 앞으로 쓰러져요. Is Kinematic켜면 물리현상이 없어져서 이런게 다 괜찮아지기는하는데, 강사님 영상에서는 UnityChan이 Use Gravity랑 Is Kinematic이 체크가 안되어 있더라고요. 영상이랑 똑같이 gravity랑 kinematic 체크푼 상태에서 잘 잘작동했으면 좋겠는데. 마우스 이동 후 공중으로 천천히 올라가는걸 고치고 싶은데 어떻게 해야하나요? 코드는 다 살펴봤는데 다른 점은 없었던 것 같아요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
static 키워드에 대한 의문
안녕하세요 강의를 들으며 많은 것을 배워가고 있습니다. static 키워드에 관해 두가지 질문을 드리고 싶습니다. 1. static 변수는 프로그램의 시작과 함께 데이터 영역에 할당이 된다고 배웠습니다. 의문점은 문득 코드를 살펴보다 static으로 선언된 Input이라는 변수는 인스턴스화 하기 전에 할당되는 변수인데 get으로 _input을 반환한다는게 조금 어색하게 다가왔습니다. 혹시나 하는 마음에 s_instance를 반환하는 Instance 프로퍼티를 가지고 유사하게 실험을 했습니다. static Managers s_instance;에서 static을 없애니 Instance로 선언된 프로퍼티의 get부분에서 s_instance를 static으로 선언하라는 에러가 났습니다. 위의 두 줄과 아래 두 줄이 동일한 매커니즘을 거치는 것 같은데 한쪽은 static이 없고 한쪽은 static이 있어야 하는 상황에 대해서 알고싶습니다. 2. 두번째 질문은 static 메서드와 static 변수는 정확히 어느 시점에서 할당이 되는지 궁금합니다. 구글링을 해보니 "클래스가 메모리에 올라갈때" 라는 다소 추상적인 글을 확인할 수 있었습니다. 이 말이 로딩과정에 일어나는 일이라고 이해해도 되는걸까요? 이에 대해 조금 자세히 설명을 부탁드려도 될까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Singleton 패턴 관련 문의
안녕하세요. 강의 잘 듣고 있습니다. 제가 Singleton 패턴을 잘 이해한 것인지 헷갈려서.. 아래와 같이 메모해 두었는데 제대로 이해한 것일까요? //그러니까 // Manager s_instance = new Manager(); 이게 안되니까 // go라는 GameObject를 만들어 @Managers 라는 GameObject를 생성해 집어넣던지 있으면 찾아넣던지 하고 // @Managers에 Managers클래스(스크립트)를 컴포넌트로 같다붙인 뒤 // Managers 클래스의 static instance인 s_instance에다가 // @Manager라는 GameObject에 붙어있는 컴포넌트 -> Managers 클래스를 집어넣음으로써 // 결과적으로 Managers의 static instance인 s_instance에다가 // Managers 를 갖다넣음 즉 Manager s_instance = new Manager(); 이거를 // @Managers 라는 GameObject라는 애를 통해서 우회적으로 한 것임. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Slerp 함수에 관한 질문
Slerp 함수를 사용해서 북쪽을 본 상태에서 남쪽으로 방향으로 전환을 하게 되면 그 즉시 방향이 남쪽으로 변환이 되는건가요? transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.5f); transform.position += Vector3.forward * Time.deltaTime * _speed; 코드를 살펴보고 실행결과를 보면 캐릭터가 북에서 남으로 자연스럽게 움직이지만 월드 좌표 방향으로 즉시 전환되는 듯 합니다. (즉시 전환되기 때문에 ransform.position += Vector3.forward * Time.deltaTime * _speed; 이 코드가 실행됐을 때 월드좌표 방향으로 가는 것이 아닐까 하는 생각입니다..) 제 개인적인 추측이지만 궁금해서 질문 올립니다. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Vector3 연산자 오버로딩 질문
실제 Vector3 클래스를 살펴보면 연산자 오버로딩의 선언(?) 부만 있고 구현부는 찾아볼 수 없습니다. public static Vector3 operator +(Vector3 a, Vector3 b); public static Vector3 operator -(Vector3 a); public static Vector3 operator -(Vector3 a, Vector3 b); public static Vector3 operator *(float d, Vector3 a); public static Vector3 operator *(Vector3 a, float d); public static Vector3 operator /(Vector3 a, float d); 실제 구현부는 다른곳에 정의되어있나요? 감사합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티 쓰레드 질문 드립니다.
멀티 쓰레드 질문 드립니다. GameRoom 이 JobQueue를 가지고 있어서 멀트 쓰레드에서 안전하다고 하셨는데 GameRoom 의 Broadcast , Enter,Leave 등은 JobQueue 를 이용 하니 멀티 쓰레드에서 안전 한거 같은데 GameRoom 의 Flush 는 어떻게 안전 할수가 있나요?
-
미해결
유니티 초보 질문입니다ㅠㅠㅠ
유니티 특정 폴더의 mp3 파일들을 리스트로 보여주는 리스트 뷰 만드는 방법 궁금합니다. 안드로이드 디바이스 특정 폴더에 mp3파일이 여러 개 있는 경우에 전체 경로와 파일명을 같이 보여줄 수 있도록 하고싶은데 디바이스의 특정 폴더 접근과 리스트 뷰에서 프리팹을 어떻게 만드는지 몰라서 계속 막힙니다;;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷모아보내기 실습 보내는 갯수가 500으로 안떨어지는경우
더미클라이언트 수를 500으로 설정하고 실행 했을때 500으로 유지되지는 않고 267 정도로 계속 보내게 됩니다. 프로세스 메모리는 일정하게 유지가 되구요. 이런경우 프로세스 성능에 따라서 모아보내기가 적게 자주 보내게 될수도있나요? 예를 들어 while에서 패킷을 모아보내는 수가 500이 안차더라도 보낼수 있는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Action Invoke 질문입니다.
action 에 이벤트를 할당하고 Invoke 해서 실행시키는데 이게 그냥 실행시키는거랑 어떤 차이가 있을까요? Action<PacketSession, IPacket> action = null;if (_handler.TryGetValue(p.Protocol, out action)){ //1 action.Invoke(session, p); //2 action(session, p);}
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IP가 틀려서그런지 유니티에서 서버로 접속이 안되네요.
첫번째 사진이 서버 IP로그구요. 밑에 사진이 유니티 클라이언트 IP로그 입니다. 유니티에서 서버로 접속할때 OnConnectCompleted Fail: ConnectionRefused 로그가 뜨면서 플레이어 케릭터가 생성이 안되는 현상이 발생했습니다. 서버에 연결이 실패한 원인을 찾아보니 서버쪽에선 아이피가 :::1인반면 유니티쪽은 127.부터 시작하는 아이피로 서로 틀리더라고요. 서버쪽 로그를 보니 더미 클라에서 모아 보내기가 계속 찍히는거 보면 문제는 없어보입니다만, 이 경우 어떻게 해야될까요? 잘 부탁드립니다 ^^
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Packet Queue 질문
안녕하세요. "Rookiss"님, Packet Queue에 대해서 질문드리려고 합니다. Push() 에 대해서는 BackGround Thread가 계속 Push하므로 lock을 거는 이유가 맞다고 생각되는데 Pop()에 대해서는 Unity의 Main-Thread만 사용한다면 따로 lock을 걸 필요가 없다고 생각되는데 혹시 다른 이유가 있어서 lock을 거신건가요?? 답변해주시면 감사하겠습니다!
-
미해결따라하면서 배우는 고박사의 유니티 기초
총알이 발사가 되지 않습니다!
해당 에러가 뜨면서 총알이 발사되지 않습니다ㅠㅠ PlayerController코드는 다음과 같이 작성했습니다. using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] private KeyCode keyCodeFire = KeyCode.Space; [SerializeField] private GameObject bulletPrefab; private float moveSpeed = 3.0f; private Vector3 lastMoveDirection = Vector2.right; // 마지막에 움직인 방향을 저장하기 위한 변수 private void Update() { // 플레이어 오브젝트 이동 float x = Input.GetAxisRaw("Horizontal"); float y = Input.GetAxisRaw("Vertical"); transform.position += new Vector3(x, y, 0) * moveSpeed * Time.deltaTime; // 마지막에 입력된 방향키의 방향을 총알의 발사 방향으로 활용 if (x != 0 || y != 0) { lastMoveDirection = new Vector3(x, y, 0); } // 플레이어 오브젝트 총알 발사 if (Input.GetKeyDown(keyCodeFire)) { GameObject clone = Instantiate(bulletPrefab, transform.position, Quaternion.identity); clone.name = "Bullet"; clone.transform.localScale = Vector3.one * 0.5f; clone.GetComponent<SpriteRenderer>().color = Color.red; clone.GetComponent<Movement2D>().Setup(lastMoveDirection); } } } Movement2D 코드 using UnityEngine; public class Movement2D : MonoBehaviour { private float moveSpeed = 5.0f; private Vector3 moveDirection; public void Setup(Vector3 direction) { moveDirection = direction; } private void Update() { transform.position += moveDirection * moveSpeed * Time.deltaTime; } } ObjectSpawner 코드 using UnityEngine; public class ObjectSpawner : MonoBehaviour { [SerializeField] private int objectSpawnCount = 30; [SerializeField] private GameObject[] prefabArray; [SerializeField] private Transform[] spawnPointArray; private int currentObjectCount = 0; private float objectSpawnTime = 0.0f; private void Update() { // objectSpawnCount 개수만큼만 생성하고 더이상 생성하지 않도록 하기 위해 설정 if (currentObjectCount + 1 > objectSpawnCount) { return; } // deltaTime만을 덧셈으로 활용하면 실체 시간과 동일하게 흘러감 objectSpawnTime += Time.deltaTime; // 0.5초마다 한 번씩 실행 if (objectSpawnTime >= 0.5f) { int prefabIndex = Random.Range(0, prefabArray.Length); int spawnIndex = Random.Range(0, spawnPointArray.Length); Vector3 position = spawnPointArray[spawnIndex].position; GameObject clone = Instantiate(prefabArray[prefabIndex], position, Quaternion.identity); Vector3 moveDirection = (spawnIndex == 0 ? Vector3.right : Vector3.left); clone.GetComponent<Movement2D>().Setup(moveDirection); currentObjectCount++; objectSpawnTime = 0.0f; } } } 어디서 문제가 발생한 건지 에러 알림을 봐도 잘 모르겠습니다ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Tag기능 대신 Poolable 컴포넌트를 만드신 이유가 궁금합니다.
좋은 영상 올려주셔서 감사합니다. 별로 중요한 내용은 아니지만 궁금증에 한 번 질문해봅니다. 기존의 경험으로 게임을 만들 때, 무언가를 분류해야 한다면 Tag를 많이 사용했습니다. 이 영상을 보지 않고 풀링 오브젝트 패턴을 스스로 만들었다면, Poolable태그를 만들어서 풀링하고 싶은 프리팹에게 걸어줬을 것 같아요. Poolable 컴포넌트를 이용했을 때의 장점이 있다면, 알고싶습니다!
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
리소스 매니저 만들때 랩핑이라는게 나오는데 정확히 어떤 개념인건가요?
강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 리소스 매니저를 만드실때 랩핑을 한다고 하시면서 막 뭔가 하시던데 정확히 어떤 개념인건가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
void OnHitEvent() 오류
플레이어 OnHitEvent()는 잘 작동했었는데, 몬스터 OnHitEvent()가 잘 안되어서 (디버깅으로 확인 해보니 몬스터 OnHitEvent()으로 안들어 오는 현상 확인.) 애니메이션에 문제가 있나 다른 애니메이션으로 넣어봤더니 플레이어 OnHitEvent()까지 작동이 안되기 시작했습니다. 혹시 Base Controller와 PlayerController와 MonsterController 사이에 Init의 문제가 있을까 싶어서 몬스터 AI#1 강의를 계속해서 돌려봤는데 스크립트에는 문제가 없었습니다. 메일로 파일 보내드리니 확인부탁드립니다.. ㅠㅠ 혼자 해결해 나가보고싶어서 계속해서 해봤는데 잘 되질 않아 죄송합니다. 항상 감사드립니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
실행시 자동으로 실행된다고 하셨는데
해당 방법은 디버그시 알아서 배치 파일을 열어준다는 의미인가요? 그렇다면 어떻게 할 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 선생님 Thread.Yeild(); 에 대해서 질문 합니다.
while(true) { int expected = 0; int desired = 1; if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) break; Thread.Yield(); } 이 코드를 정리를 해보면 만약에 A 쓰레드가 있고, B쓰레드가 있다 A쓰레드가 공유 자원을 점유하고 있으면 lock이 0에서 1로 바뀌고 B 쓰레드는 접근 하려니까 lock이 1이니까 계속 무한 루프를 돈다. 이것은 성능상의 저하를 불러 일으킨다. 왜? 쓸데없는 행동이기 때문에 따라서 A쓰레드가 공유자원을 사용을 끝날 때 까지 B쓰레드를 무한루프를 돌게 하지말고 재우는데 Thread.sleep, yeild.. 뭐 이런 함수를 이용해서 재우는데 그럼 무한 루프가 잠시 멈추는 상황이잖아요? 그럼 a쓰레드가 공유자원을 쓰고 나왔다는 것을 어떻게 알 수 있나요? 검색 해보니까 sleep을 os가 깨운다는데 그럼 정리를 해보면 면접관님 께서 만약 이런 질문을 하시면 일단 OS가 A 쓰레드가 할일을 끝냈으니, 잠자고 있던 B쓰레드를 깨워서 그때부터 반복을 해서 다시 LOCK 검사를 진행합니다. LOCK 변수 값이 0이라면 컨텍스트 스위칭이 일어나는데 A 쓰레드의 정보가 레지스터에서 지워지고 B 쓰레드 정보가 채워짐으로써 B 쓰레드가 CPU를 점유하고 이제 B쓰레드가 공유자원 _num변수를 사용해서 _num++연산이 진행이 됩니다. 이렇게 저는 해당 챕터 강의를 이해 하고 정리를 했거 든요 혹시 틀린 점이 있다면 알려주심 감사하겠습니다. 아 그 sleep 걸어놓고 os가 깨우는 거 맞는지도 알려주시면 감사하겠습니다. ^^