본문 바로가기

728x90

게임 개발

(10)
[유니티] 씬 재로딩 후 Action 변수의 target null 문제 아래와 같이 정적 클래스에 Action 참조 변수를 만들어놓고 public class MethodManager { public static event System.Action SomeThing; public static void DoSomeThing() { SomeThing(); } } 아래와 같이 다른 클래스에서 함수를 등록하여 사용하려고 합니다. public class GameControll : MonoBehaviour { void Start() { MethodManager.SomeThing += Controll1; } void Controll1() { // do controll1 } } 이제 다른 클래스에서 언제든지 MethodManager.DoSometing(); 을 호출하면 GameControl..
[유니티] Input.GetKey() 한글로 입력해도 동작하게 하고 싶다면 - 예를 들어 키보드 wasd 로 캐릭터나 카메라를 이동해야하는 경우 Input.GetKey(KeyCode.W)) { MoveUp(); } 위와 같이 사용하면 영어일때만 동작하고 한글일 때는 동작하지 않습니다. switch (Input.inputString) { case "W": MoveUp(); break; } 이렇게 사용하면 부드럽게 실행되지 않고 뚝뚝 끊겨서 사용됩니다. - 이 방법 저 방법 찾아보다가 의외로 간단하게 해결되었는데, Edit > Project Setting... > Input Manager 에서 Use Physical Keys 를 사용하면 됩니다. 밑에 있는 설명을 보니 물리적 키를 사용하면 키보드 언어 레이아웃에서 키 코드를 물리적 키트에 독립적으로 매핑할 수 있다. 예를 들어 키..
[유니티/셰이더] 순차적 체커보드 패턴 Procedural checkerboard pattern # 순차적 체커보드 패턴 메시의 텍스처 좌표에 기반한 체커보드 패턴을 출력하는 셰이더입니다. Shader "Unlit/Checkerboard" { Properties { // 체커보드의 밀도를 결정합니다. _Density ("Density", Range(2,50)) = 30 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; float _Density; v2f vert (float4 pos : POSITION, float2 uv : TEXCOORD0) { v2f ..
[유니티/셰이더] 커스텀 셰이더 기초 # 준비 기본적인 머테리얼을 생성합니다. Unlit Shader를 생성합니다. 이것은 조명없이 텍스처만 표시하는 간단한 셰이더입니다. 유니티의 에셋스토어에서 무료로 제공하는 Space Robot Kyle 에셋을 임포트합니다. # 간단한 Unlit Shader 기본적인 언릿 셰이더를 생성하고 더 단순화한 뒤 코멘트를 붙였습니다. Shader "Unlit/NewUnlitShader" { Properties { // 인스펙터에 타일링/오프셋 설정이 보이지 않습니다. [NoScaleOffset] _MainTex("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert // 버텍스 셰이더는 vert #pragma fragment ..
[유니티] Photon Fusion 103 간단 요약 # Photon Fusion 103 Photon Fusion 103은 Photon 홈페이지의 기술문서에 있는 Fusion 튜토리얼 중 한 단계를 말합니다. # FixedUpdateNetwork 로컬 물리 시뮬레이션에서 MonoBehaviour의 FixedUpdate() 역할을 하는 것이 네트워크 물리 시뮬레이션에서 NetworkBehaviour의 FixedUpdateNetwork()입니다. 각 틱의 시간 간격은 NetworkProjectConfig의 Simulation > Tick Rate에 의해 정의되며, 1/60초의 델타와 같습니다. NetworkRunner.DeltaTime 으로 접근할 수 있습니다. 따라서 Time.deltaTime이 아니라 Runner.DeltaTime으로 사용합니다. using..
[유니티] 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#] 타일형 랜덤맵 배열 섞기. 피셔-예이츠 셔플. # 목표 예를 들어 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..

728x90