묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 scene전환 관련해서 질문드립니다.
scene을 전환하실 때 단순히 DontdestroyOnLoad를 활용해서 고정시켜둘 객체들을 고정시켜두고 scene을 전환하셔서 구현하셨는데요... additive를 활용해서 mainscene에 고정시켜둘 객체들을 두고 mapscene들을 비동기로 로딩하는 방식이 어떤차이가 있는지 궁금합니다...
-
미해결절대강좌! 유니티 6 - TPS 게임으로 배우는 유니티 마스터클래스
콜백 함수, garbage colleection에 대해
콜백 함수 콜백 함수는 update에서 도는 건가요? 매 프레임마다 충돌되는지 안 되는지 체크를 해야 충돌 감지를 할 것 같은데... Start함수랑 Update함수 다 지우고 void OnCollisionEnter 함수만 둬도 잘 돌아가는 게 무슨 원리인지 궁금해요. 가비지 콜렉션 시니어 프로그래머가 아닌 이상 입문자에게 이것까지 관리하기엔 어려울 것 같은데, 그냥 "==문자열" 이 코드만 피하면 되는 걸까요?
-
미해결절대강좌! 유니티 6 - TPS 게임으로 배우는 유니티 마스터클래스
스크립터블 오브젝트에 대해 질문이 있습니다
안녕하세요 강의 잘 듣고 있는 학생입니다.다름이 아니라 스크립터블 오브젝트로 변수들을 저장하여 메모리 사용의 효율과 확장성을 늘리는 부분에 대해서는 너무 좋은 방법이고 이해를 했습니다. 근데 이펙트, 사운드 등의 파일도 Pooling 방식으로 사용이 가능 하고 효율은 어떤게 더 좋은지 궁금해서 입니다.예를들어 EffectManager 라는 오브젝트내에 사용할 Effect 들을 넣어두고 그 Effect 가 사용되는 시점에 enable 이 됐다가 사용이 끝나면 다시 disable 되고 다른곳에서 사용되면 다시 enable 로 사용하는 방식으로 하는 방법도 있던데 이런 방법의 장단점과 차이점에 대해서 알고 싶습니다.
-
미해결레트로의 유니티 C# 게임 프로그래밍 에센스
궁금한 부분이 있어서 질문 남깁니다.
안녕하세요 시간이 많이 흐른 지금도 보실지는 모르겠지만 강의 중에 궁금한게 있어서 질문 드립니다.Physics.OverlapSphere 을 사용하면 공격 대상이 빠르게 움직이면 공격을 받지 않는다고 하셔서 Physics.CastSphere 이걸 사용하셔서 움직인 궤적 사이에 겹치는 물체를 감지 해서 공격이 가능하게 구현을 하셨는데 만약에 좀비가 공격을 할때 플레이어가 움직이면서 피하고 데미지를 받지 않게 하려면 Physics.OverlapSphere이걸 써서 그냥 구현하면 되는건가요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
aws 와 microsoft azure 중 aws 선택하신 이유가 궁금합니다.
클라우드 서비스로 aws와 microsoft azure 둘중 비쥬얼 스튜디오랑 호환이 잘되있는 microsoft azure도 괜찮은 선택지일수 있을거같은데, 루키스님이 aws 고르신 이유가 궁금합니다. !
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
오목게임 구현
이 서버코드를 가지고 오목게임을 구현해보고 싶은데요 랜덤매칭을 해서 매칭이 된다면 방을 만들어서 방에서 조작하는게 맞겠죠 ? 그럼 GameRoom 은 전체 시스템에 대한 접속이라 생각하고 ( 전쳇말 등등을 위한 )GameActualRoom 이란걸 만들어서 매칭된사람들끼리의 룸 이라고 생각하고 만들면될까요 ? ..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
콘솔창에 격자가 안나옴 미로 생성 X
미로 생성 25*25 격자가 콘솔창에 출력 되지 않고 있습니다..1.Board 코드*****************************************************************************using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace C__알고리즘_6_플레이어_이동{ class Board { const char CIRCLE = '\u25cf'; public TileType[,] Tile { get; private set; } //배열 public int Size { get; private set; } public int DestY { get; private set; } public int DestX { get; private set; } Player _player; public enum TileType { Empty, Wall, } public void Initialize(int size, Player player) { if (size % 2 == 0) return; _player = player; Tile = new TileType[size, size]; Size = size; DestY = Size - 2; DestX = Size - 2; GenerateBySideWinder(); } public void GenerateBySideWinder() { // 일단 길을 다 막아버리는 작업 for (int y = 0; y < Size; y++) { for (int x = 0; x < Size; x++) if (x % 2 == 0 || y % 2 == 0) Tile[y, x] = TileType.Wall; else Tile[y, x] = TileType.Empty; } // 랜덤으로 우측 혹은 아래로 길을 뚫는 작업 // Binary Tree Algorithm Random rand = new Random(); for (int y = 0; y < Size; y++) { int count = 1; for (int x = 0; x < Size; x++) { if (x % 2 == 0 || y % 2 == 0) continue; if (y == Size - 2 && x == Size - 2) continue; if (y == Size - 2) { Tile[y, x + 1] = TileType.Empty; continue; } if (x == Size - 2) { Tile[y + 1, x] = TileType.Empty; continue; } if (rand.Next(0, 2) == 0) { Tile[y, x + 1] = TileType.Empty; count++; } else { int ramdomIndex = rand.Next(0, count); Tile[y + 1, x - ramdomIndex * 2] = TileType.Empty; count = 1; } } } } public void Render() { ConsoleColor prevColor = Console.ForegroundColor; for (int y = 0; y < Size; y++) { for (int x = 0; x < Size; x++) { // 플레이어 좌표를 갖고 와서, 그 좌표랑 현재 y, x가 일치하면 플레이어 전용 색상으로 표시 if (y == player.PosY && x == player.PosX) Console.ForegroundColor = ConsoleColor.Blue; else if(y == DestY && x == DestX) Console.ForegroundColor = ConsoleColor.Yellow; else Console.ForegroundColor = GetTileColor(Tile[y, x]); Console.Write(CIRCLE); } Console.WriteLine(); } Console.ForegroundColor = prevColor; } ConsoleColor GetTileColor(TileType type) { switch (type) { case TileType.Empty: return ConsoleColor.Green; case TileType.Wall: return ConsoleColor.Red; default: return ConsoleColor.Green; } } }}*****************************************************************************2. Player 코드using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace C__알고리즘_6_플레이어_이동{ class Pos { public Pos(int y, int x) { Y = y; X = x; } public int Y; public int X; } class Player { public int PosY { get; private set; } public int PosX { get; private set; } Random _random = new Random(); Board _board; enum Dir { Up = 0, Left = 1, Down = 2, Right = 3 } int _dir = (int)Dir.Up; List<Pos> _points = new List<Pos>(); public void Initialize(int posY, int posX, Board board) { PosY = posY; PosX = posX; _board = board; // 현재 바라보고 있는 방향을 기준으로, 좌표 변화를 나타낸다. int[] frontY = new int[] { -1, 0, 1, 0 }; int[] frontX = new int[] { 0, -1, 0, 1 }; int[] rightY = new int[] { 0, -1, 0, 1 }; int[] rightX = new int[] { 1, 0, -1, 0 }; _points.Add(new Pos(PosY, PosX)); // 목적지 도착하기 전에는 계속 실행 while (PosY != board.DestY || posX != board.DestX) { // 1. 현재 바라보는 방향을 기준으로 오른쪽으로 갈 수 있는지 확인. if (_board.Tile[PosY + rightY[_dir], PosX + rightX[_dir]] == Board.TileType.Empty) { // 오른쪽 방향으로 90도 회전 dir = (dir - 1 + 4) % 4; // 앞으로 한 보 전진. PosY = PosY + frontY[_dir]; PosX = PosX + frontX[_dir]; _points.Add(new Pos(PosY, PosX)); } // 2. 현재 바라보는 방향을 기준으로 전진 할 수 있는지 확인. else if (_board.Tile[PosY + frontY[_dir], PosX + frontX[_dir]] == Board.TileType.Empty) { // 앞으로 한 보 전진 PosY = PosY + frontY[_dir]; PosX = PosX + frontX[_dir]; _points.Add(new Pos(PosY, PosX)); } else { //왼쪽 방향으로 90도 회전 dir = (dir + 1 + 4) % 4; } } } const int Move_TICK = 10; int _sumTick = 0; int _lastIndex = 0; public void Update(int deltaTick) { if (_lastIndex >= _points.Count) return; _sumTick += deltaTick; if(_sumTick >= Move_TICK) { _sumTick = 0; PosY = points[lastIndex].Y; PosX = points[lastIndex].X; _lastIndex++; } } }}*****************************************************************************3. Progarm 코드namespace C__알고리즘_6_플레이어_이동{ internal class Program { static void Main(string[] args) { Board board = new Board(); Player player = new Player(); board.Initialize(25, player); player.Initialize(1, 1, board); Console.CursorVisible = false; const int WAIT_TICK = 1000 / 30; int lastTick = 0; while (true) { #region 프레임 관리 int currentTick = Environment.TickCount & Int32.MaxValue; // FPS 프레임 (60프레임 O 30프레임 이하 X) // 만약에 경과한 시간이 1/30초보다 작다면 if (currentTick - lastTick < WAIT_TICK) continue; int deltaTick = currentTick - lastTick; lastTick = currentTick; #endregion // 입력 // 로직 player.Update(deltaTick); // 렌더링 Console.SetCursorPosition(0, 0); board.Render(); } } }}
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
격자 생성 안됨 무한루프
F11을 눌러서 확인 했을 때public void GenerateBySideWinder(){// 일단 길을 다 막아버리는 작업for (int y = 0; y < Size; y++){for (int x = 0; x < Size; x++)if (x % 2 == 0 || y % 2 == 0)Tile[y, x] = TileType.Wall;elseTile[y, x] = TileType.Empty;}이 부분에서 무한루프를 돌고 있습니다아래는 전체 코드입니다.using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace C__알고리즘_6_플레이어_이동{ class Board { const char CIRCLE = '\u25cf'; public TileType[,] Tile { get; private set; } //배열 public int Size { get; private set; } public int DestY { get; private set; } public int DestX { get; private set; } Player _player; public enum TileType { Empty, Wall, } public void Initialize(int size, Player player) { if (size % 2 == 0) return; _player = player; Tile = new TileType[size, size]; Size = size; DestY = Size - 2; DestX = Size - 2; GenerateBySideWinder(); } public void GenerateBySideWinder() { // 일단 길을 다 막아버리는 작업 for (int y = 0; y < Size; y++) { for (int x = 0; x < Size; x++) if (x % 2 == 0 || y % 2 == 0) Tile[y, x] = TileType.Wall; else Tile[y, x] = TileType.Empty; } // 랜덤으로 우측 혹은 아래로 길을 뚫는 작업 // Binary Tree Algorithm Random rand = new Random(); for (int y = 0; y < Size; y++) { int count = 1; for (int x = 0; x < Size; x++) { if (x % 2 == 0 || y % 2 == 0) continue; if (y == Size - 2 && x == Size - 2) continue; if (y == Size - 2) { Tile[y, x + 1] = TileType.Empty; continue; } if (x == Size - 2) { Tile[y + 1, x] = TileType.Empty; continue; } if (rand.Next(0, 2) == 0) { Tile[y, x + 1] = TileType.Empty; count++; } else { int ramdomIndex = rand.Next(0, count); Tile[y + 1, x - ramdomIndex * 2] = TileType.Empty; count = 1; } } } } public void Render() { ConsoleColor prevColor = Console.ForegroundColor; for (int y = 0; y < Size; y++) { for (int x = 0; x < Size; x++) { // 플레이어 좌표를 갖고 와서, 그 좌표랑 현재 y, x가 일치하면 플레이어 전용 색상으로 표시 if (y == player.PosY && x == player.PosX) Console.ForegroundColor = ConsoleColor.Blue; else if(y == DestY && x == DestX) Console.ForegroundColor = ConsoleColor.Yellow; else Console.ForegroundColor = GetTileColor(Tile[y, x]); Console.Write(CIRCLE); } Console.WriteLine(); } Console.ForegroundColor = prevColor; } ConsoleColor GetTileColor(TileType type) { switch (type) { case TileType.Empty: return ConsoleColor.Green; case TileType.Wall: return ConsoleColor.Red; default: return ConsoleColor.Green; } } }}
-
미해결레트로의 유니티 C# 게임 프로그래밍 에센스
FreeLook 카메라 Zone 설정관련
저는 유니티6를 0.38f1 버전을 사용하고 있는데요카메라에서 Dead Zone, Soft Zone 등이 안보여서 찾아보니 FreeLook 카메라 인스펙터 창에서 Status Live 부분을 클릭해주시고아래 Rig 관리하는 부분에 Aim 이라는 탭을 여시면 선생님이 화면에서 보시던 Zone 설정하는 부분이 보이게 됩니다.
-
해결됨C# WinForm 사용자 정의 컨트롤 활용. 실무 역량 키우기
Item 속성 Serializable 오류
강의를 따라 진행중 다음과 같은 오류가 발생하였습니다." 'Items'속성의 코드를 생성하지 못했습니다... "KaburiKiosk.Moels.Product" 형식이serializable로 표시 되어 있지 않습니다"해당 오류는 Product Class에 [Serializable] 속성을 달아주니 해결이 되었지만강의에서는 따로 설정 해주는 부분이 없어도 잘 실행되는 것을 볼 수 있는데버전 차이로 인해 발생하는 문제일까요? 궁금합니다
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
M1의 어드레서블 리소스 관리 방식에 대하여 질문있습니다.
m1에서는 처음시작할때 모든 preload리소스들을 타이틀씬에서 로드했는데이건 씬이 하나이고 다 쓰여서 이렇게 한건가요?일반적으로 씬이 여러개이거나 씬이하나여도 전혀 다른 에셋들의 구성으로 씬이 구성되는 경우라면 그 해당하는 에셋이 필요할때만 로드시키는게 일반적인 걸까요?
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
몬스터 추적 강의 질문
안녕하세요 강의 잘 보고 있습니다 궁금한 내용 정리해서 질문드립니다. Init 관련 발음하실 때 아이닛 이라고 하시는 이유가 궁금? 합니다 보통 이닛 이라고 하지 않나요? 몬스터 추적 강의에서 Player 스크립트 작성할 때 FindClosetTarget(Spawner.m_Monster.ToArray()); 이렇게 ToArray 배열로 넘기는 부분이 있던데 꼭 배열로 넘겨야 하는지 궁금합니다 T로 받을거면 FindClosetTarget(Spawner.m_Monster); 이렇게 넘겨도 상관 없지 않을까 싶어서요
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
M1의 리소스매니져 클리어 타이밍에 대해 여쭤보고싶습니다.
강의에서는 Clear()를 사용하시지 않았는데일반적으로 규모가 있는 게임이면 Clear 타이밍이 어떻게 될까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
점프 구현
안녕하세요 이번에 서버 구현 강의를 듣고 유니티를 연동하고 , 캐릭터에 점프 애니메이션을 구현하려고 하는데,점프를 위한 패킷을 만들어야 하나요 ? 패킷에는 어떤내용이 들어갈까요 ? , isJumped 를 bool 형으로 만들면 될까요 ?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
C1 일정은 어떻게 되는건가요?
C1 일정은 어떻게 되고있는건가요? 벌써 3월인데... T1은 내부 사정상 취소되고 C1으로 변경해서 진행할거란 소식은 꽤 오래전에 들었습니다. 일정 공유좀 해주세요... 2개 프로젝트에 대한 강의를 들으려고 구매한건데, 너무 딜레이되는거 아닌가요?
-
미해결레트로의 유니티 C# 게임 프로그래밍 에센스
와..정말 감탄이 나오네요..
안녕하세요 즐겁게 수강하고 있는 학생 입니다.이번에 delegate 와 event 에 대해서 강의를 들었는데 다른 곳에서는 그냥 이럴때 이렇게 써요 하고 넘어가서 아...delegate 는 이럴때 사용하는 구나 라고만 넘어가서 정확히 어떤식으로 동작하는지 안의 구조는 어떤식으로 되어 있는지는 애매모호 하게만 알고 있었는데 이번 강의를 통해서 왜 delegate 를 사용해야 하고 사용을 안하면 어떠한 노가다를 해야 하고 그 노가다의 결과는 어떤 참혹한 버그를 초래할수 있고 등등을 잘 알게 되는 강의라고 생각 됩니다.이벤트라는 기능을 이렇게 조리 있게 표현하고 설명 하실수 있는 선생님께 정말 감탄하게 되네요...이미 선생님 강의를 처음부터 끝까지 전부 봤지만 다른 분들껄 보고 지금 다시 보는 상황인데 이해가 확실히 됩니다. 너무 감사합니다
-
미해결레트로의 유니티 C# 게임 프로그래밍 에센스
추상 클래스에 대해 이해가 잘 안되었는데
선생님의 강의를 듣고 인터페이스와 추상 클래스에 대해서 이해가 잘 되었어요 !물론 실전 프로젝트에서 어떻게 적재적소에 사용을 하느냐가 문제 겠지만 이런 작동 원리를 알고있고 필요할때 응용해서 사용 할수만 있다면 노가다를 줄이고 굉장히 편하게 쓸수 있을거 같아요감사합니다!!
-
미해결[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
소스코드 관련 문의드립니다.
안녕하세요.프로젝트를 진행하면서 문제 발생했을 때 git 소스 코드만 보고 찾기 어려움이 있습니다.. 커리큘럼을 보니 콘텐츠 개발은 완료된 것 같고 출시 준비만 남은 것같은데 혹시 전체 프로젝트 소스에 대해서 받을 수 있을까요?? 가능하시다면 링크를 주셔도 가능하고 이메일로 첨부해주셔도 됩니다!이메일:guddn1234k@naver.com
-
미해결한 장의 CheatSheet로 살펴보는 C#
수업자료
올려주신 노션 수업자료를 프린터해서 읽고 싶은데인쇄 가능하게 설정해주시면 안될까요?
-
해결됨두고두고 써먹는 유니티 비동기 프로그래밍
1-3. 코루틴의 주요 키워드 부분에서 자막에 'PoEc' 라는 용어가 나오는데 정확한 용어와 뜻을 알수 있을까요?
1-3. 코루틴의 주요 키워드 영상 0:28 부분에서 자막에 'PoEc' 라는 용어가 나오는데 정확한 용어와 뜻을 알수 있을까요?구글에서 검색해봐도 잘 모르겠습니다.