본문 바로가기

728x90

전체

(53)
[유니티] Photon Fusion 102 간단 요약 # Photon Fusion 102 Photon Fusion 102은 Photon 홈페이지의 기술문서에 있는 Fusion 튜토리얼 중 한 단계를 말합니다. # 방만들기, 접속하기 Photon Fusion 네트워크의 주체는 입니다. NetworkRunner의 멤버 함수인 StartGame(StartGameArgs args) 로 Fusion 네트워크를 시작할 수 있습니다. private NetworkRunner _runner;// 러너 변수를 선언하고 _runner = gameObject.AddComponent(); // 객체를 생성합니다. _runner.ProvideInput = true;// 이 클라이언트에서 입력을 한다는 뜻 await _runner.StartGame(new StartGameArgs()..
[C#] out var 파라미터 out은 참조를 통해 인수를 전달하는 키워드입니다. return 으로 반환값을 받지 않기 때문에, 2개 이상의 값도 가져올 수 있습니다. 간단한 사용방법은 아래와 같습니다. 함수 호출부와 함수 정의부에서 out 키워드를 사용해야 합니다. int x, y; Get(out x, out y);// 함수 호출부 Console.WriteLine($"{x}:{y}"); void Get(out int x, out int y) // 함수 정의부 { x = 10; y = 20; } 출력결과 10:20 C# 7부터 더욱 편리해졌습니다. Get(out int x, out int y);// 변수 선언없이 사용 Console.WriteLine($"{x}:{y}"); void Get(out int x, out int y) { x..
[게임개발/C#] 타일형 랜덤맵 배열 섞기. 피셔-예이츠 셔플. # 목표 예를 들어 10*10 크기의 타일형 랜덤맵을 만들 것입니다. 그 중 20개의 타일에 벽을 배치해야할 것입니다. 이 때 사용할 수 있는 방법으로 tile[0,0] ~ tile[9,9]까지 100개의 타일을 무작위로 섞어 20개를 뽑아 벽 타일로 정해줄 수 있습니다. 이렇게 배열 (유한 수열)이 있을 때 골고루 섞어주는 방법으로 피셔-예이츠 셔플(The Fisher-Yates Shuffle)을 사용하는 방법을 알아보겠습니다. # 피셔-예이츠 셔플 피셔-예이츠 셔플은 기존의 순열에서 무작위로 하나의 수를 뽑아 새로운 수열에 뽑은 순서대로 놓는 방식입니다. 이렇게 뽑은 랜덤 수열은 매 번 뽑을 때마다 어느 한 쪽으로 편향되지 않고 골고루 나온다는 장점이 있습니다. # 코드 예제 public static..
[게임개발] 타일형 랜덤맵에서 고립된 공간 만들지 않기. Flood Fill 활용. # 목표 타일형 랜덤 맵을 만들기 위해서 빈 타일을 미리 깔아놓고, 랜덤 한 좌표에 일정 갯수의 벽 타일을 생성하는 방법을 사용합니다. 이럴 때 아래의 오른쪽 그림과 같이 벽 타일로 둘러쌓여서 고립된 공간이 생기기 마련입니다. 이 고립된 공간이 생기지 않도록 하는 방법을 알아보겠습니다. # Flood Fill 알고리즘 플러드 필 알고리즘은 다차원 배열에서 연결된 영역(공간)을 찾는 알고리즘입니다. 그림판에서 사각형을 그려놓고 픽셀로 둘러쌓여진 곳 안에 연결된 부분에 모두 색칠하는 방법으로 사용하는 것이 대표적입니다. 모서리 방향을 연결된 것으로 볼 것이냐 아니냐에 따라 4방향 탐색, 8방향 탐색이 있습니다. 오른쪽 아래에 위치한 타일에서 시작했을 경우 녹색 타일은 연결되어 있는 영역입니다. 빨간색 타일은..
[유니티] 게임 패널에 GUI 띄우기 유니티로 게임 개발을 하다보면 특정한 상황을 반복적으로 실행해서 테스트를 해야하는 경우가 많습니다. 예를 들면 캐릭터가 죽었을 때 재시작 버튼을 띄운다던가, 다시 시작지점으로 돌아가게 한다던가 하는 후속 처리가 있습니다. 이 기능들이 제대로 작동하는지 테스트하려면 캐릭터를 반복적으로 죽여야 합니다. 하지만 직접 캐릭터를 죽음의 상황에 처하도록 컨트롤하는 것은 시간낭비가 많습니다. 그래서 유니티에서는 게임 패널에 UI버튼을 추가하여 스크립트를 실행할 수 있도록 도와주고 있습니다. 예를 들어 캐릭터가 적에게 맞아 체력이 0 이하로 내려가면 die() 함수가 실행됩니다. 그럴 때 간단히 UI 버튼을 눌러 die()함수가 실행되도록 하는 것입니다. 가장 간단하게 구현하는 방법은 다음과 같습니다. private ..
[게임개발/C#] 맵에디터 랜덤 맵 생성 관련 시드값 설정하기 마인크래프트나 문명같이 맵을 랜덤하게 생성해주는 게임에서 랜덤 맵을 생성할 때 시드값 (Seed) 이라는 것이 있어 시드값을 똑같이 입력하면 랜덤 맵일지라도 똑같게 만들어진 맵에서 플레이할 수 있습니다. 이 것을 구현하기 위한 Random 클래스 사용방법입니다. - 기본적인 랜덤 값 생성 방법입니다. Random rand = new Random(); int num = rand.Next(); Console.WriteLine(num); 출력 결과 1499166260 ( 0 이상 Int32.MaxValue 미만의 정수 값 ) 이렇게 실행하면 매 번 실행할 때마다 랜덤한 값을 얻을 수 있습니다. - 시드를 활용한 랜덤 값 생성 방법입니다. // 먼저 seed로 사용할 랜덤값을 구합니다. Random randSe..
[네트워크/C#] SocketAsyncEventArgs를 이용한 비동기 TCP 통신 # SocketAsyncEventArgs 클래스 SocketAsyncEventArgs 클래스는 비동기 소켓 통신을 할 때 송신과 수신 자체 작업을 담당하는 클래스입니다. Socket 통신을 하기 때문에 Socket이고, 비동기로 작업을 하기 때문에 Async입니다. 작업을 완료하면 실행되는 완료 콜백 함수를 가질 수 있어 Event이고, Socket 클래스의 비동기 함수에 인수로 들어가기 때문에 Args라고 생각하시면 좋겠습니다. Socket 클래스의 함수 중 뒤에 Async가 붙는 함수들은 모두 public bool ***Async(SocketAsyncEventArgs e); 의 형태로 선언되어 있습니다. 그래서 SocketAsyncEventArgs를 활용한 비동기 통신을 할 때의 대략적인 순서는 So..
[안드로이드] SQLite 처음 사용해보기 - 안드로이드 스튜디오에서 프로젝트를 생성합니다. - 생성 한 후 run 'app'을 눌러 한 번은 실행해야 테스트가 잘 작동합니다. - 위도우키 + R 을 눌러 실행창을 연 후 'cmd' 실행하여 프롬프트 창을 엽니다. - adb.exe 의 위치를 찾아갑니다. > cd C:\Users\USER-PC\AppData\Local\Android\Sdk\platform-tools * adb (android debug bridge )는 PC에서 스마트폰과 통신하기 위한 프로그램입니다. > dir adb.exe 현재 폴더(디렉터리)에서 adb.exe를 보여줍니다. - adb 를 관리자 권한으로 실행한 후 > adb root - shell을 실행하여 AVD에 진입합니다. > adb shell shell에 진입하면 명..
[알고리즘] 너비 우선 탐색 Breadth First Search # 문제 설명 아래 그림과 같은 이진트리를 너비 우선 탐색해봅니다. 간선의 정보를 입력받아 처리합니다. 인접 리스트를 이용합니다. queue 자료구조를 직접 구현합니다. 너비 우선 탐색은 시작 노드부터 인접한 노드들을 모두 우선 방문하는 방식의 탐색 방법입니다. 시작 노드인 노드1을 방문 한 후 노드1에 인접한 노드2, 노드3을 방문합니다. 노드2에 인접한 노드4, 노드5를 방문합니다. 노드3에 인접한 노드6, 노드7을 방문합니다. 노드4는 인접한 노드가 없으므로 끝입니다. 노드5 ~ 노드7은 노드4와 같습니다. 다르게 이야기하면 시작 노드부터 간선 한 번에 인접한 노드들을 순회하고, 간선 두 번에 인접한 노드들을 순회하고, 간석 세 번에 인접한 노드들을 순회하는 방식으로 볼 수 있습니다. # 입출력 예..
[C] 자료 구조 # 단일 연결 리스트 Single Linked List # 연결 리스트 각 노드가 데이터와 다음 노드를 가리킬 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료 구조입니다. - 배열과 다른 점 세 개의 데이터가 있는 배열[3]이 있다면 배열[0]부터 배열[2]까지 메모리의 연속된 곳에 자리하게 됩니다. 연결리스트는 각 노드가 각자 생성될 때 할당받은 다른 메모리 주소를 갖습니다. 그래서 다음 노드의 주소를 가리키는 포인터가 필요한 것입니다. - 장단점 데이터의 추가 삭제가 빠릅니다. 시간복잡도 O(1) 특정 위치의 데이터 검색이 오래걸립니다. 시간복잡도 O(n) - 노드 Node 노드에는 각종 데이터 변수와 다음 노드를 가리킬 포인터 변수가 필요합니다. 따라서 여러가지 타입의 집합체인 구조체로 정의합니다. struct Node{// 노드 이름 int val..

728x90