< Programming >/C#

메모리 구조에 관한 몇가지 정리(C,C++,C# 공통)

메모리 구조에 관해 알아보자. 크게 봤을 때 메모리의 구조는 코드 영역, 데이터 영역, 스택 영역, 힙 영역으로 나눌 수 있다. 이 중 사용자가 관리해야만 하는 영역으로는 힙 영역이 되겠으며, 스택과 데이터 영역은 컴파일 시점에 그 크기가 할당된다. 음.. 꼬리물리 방식으로 몇가지 개념에 대해 정리해보자. 스택 오버플로우가 뭔가? (컴파일시 스택영역의 디폴트크기는 1 Mega 이고, 스택메모리를 확장 할 수 있는데, Visual studio 환경설정에서 가능하다.)할당된 스택내에 스택프레임이 쌓이게 되는데, 재귀의 무한 반복 등의 이유로 스택영역의 크기를 초과하게 되는 상황을 말하며, 이 때 다른 메모리 영역을 침범하여 데이터의 손실 혹은 예상치 못한 변경을 야기한다. 스택 프레임이 뭔가? 함수가 호출되..

2020.02.06 게시됨

< Programming >/C#

유니티 포스트 프로세싱(Post processing)

포스트 프로세싱 후처리라고 번역되며, 게임화면이 최종 출력되기 전에 카메라의 이미지 버퍼에 삽입하는 추가 처리이다. 포스트 프로세싱을 사용하면 적은 노력으로 뛰어난 영상미를 구현할 수 있다.대부분의 포스트 프로세싱 연산은 엔더링 파이프라인의 주요 과정에서 적용되지 않고 마지막 부분에 적용된다.유니티는 포스트 프로세싱을 쉽게 사용할 수 있는 포스트 프로세싱 스택 패키지를 제공하는데, 이는 v1과 v2 버전이 있다. Camera 컴포넌트의 속성을 살펴보면 Rendering Path 옵션이 있는데 일반적으로 Forward Rendering 옵션으로 설정한다.이는 성능이 가볍지만 라이팅 표현이 실제보다 간략화되고 왜곡된다.Deferred Shading 으로 바꾸게 되면 빛을 온전하게 표현한다. 포워드 렌더링포워..

2020.02.04 게시됨

< Programming >/C#

익명함수와 람다식

익명 함수와 람다식 익명 함수는 미리 정의하지 않고, 인라인(실행 중인 코드 블록 내부)에서 즉석 생성할 수 있는 메소드이다.익명 함수는 실시간으로 생성할 수 있으며, 변수에 저장할 수 있는 값이나 오브젝트로 취급되며, 생성된 익명 함수는 델리게이트 타입의 변수에 저장할 수 있다. 단, 익명 함수는 미리 정의하지 않고 대부분 일회용으로 실시간 생성해서 사용하기 때문에 스코프 외부에서 따로 지칭할 수 있는 이름을 가지고 있지 않다. 익명 함수를 사용하면 실시간으로 일회용 메소드를 생성하고 이벤트로 등록할 수 있다. 간단한 예제를 보자. 1234567891011using UnitytEngine class EnemySpawner : MonoBehaviour { private void CreateEnemy(fl..

2020.02.04 게시됨

< Programming >/C#

System.Action ? ( 델리게이트 )

델리게이트와 event 키워드 Action 타입은 입력과 출력이 없는 메소드를 가리킬 수 있는 델리게이트이다. 델리게이트란 메소드를 값으로 할당 받을 수 있는 타입이다. 12345678910111213141516171819202122232425262728using UnityEngine; public class Cleaner : MonoBehaviour { Action onClean; void Start() { //+=를 사용해 메소드를 등록한다. 이때, () 괄호는 붙이지 않는 것에 주의한다. onClean += CleaningRoomA; // () 붙이지 않는다. onClean += CleaningRoomB; } void Update() { if(Input.GetMouseButtonDown(0)) { ..

2020.02.03 게시됨

< Programming >/C#

interface 사용하기

Interface는 어떻게 사용할까? 1234567891011121314151617using UnityEngine; void OnTriggerEnter(Collider other){ Potion manaPotion = other.GetComponent(); if(manaPosion != null) { manaPosion.Use(); } Scroll townScroll= other.GetComponent(); if(townScroll!= null) { townScroll.Use(); }} Colored by Color Scriptercs 위 코드는 충돌한 상대방 컴포넌트를 가능한 한 모든 아이템 타입으로 검사하는데,충돌한 상대방의 컴포넌트가 Posion인지 Scroll인지 모르기 때문이다.게임에는 수십 혹..

2020.02.03 게시됨

< Programming >/C#

박싱 언박싱

C# 자료구조인 컬렉션에 있는 ArrayList, queue, stack, dequeue, Hashtable 은 공통적으로 모든 자료형 즉, 최상위 자료형인 gameObject 까지 담을 수 있는데, 이 과정에서 제네릭(C++에서의 템플릿과 비슷)을 사용하는게 아니라면 박싱,언박싱을 하게된다. 예를 들어 int형 데이터를 저장할 때 자연스럽게 박싱을 거쳐 gameObject형 데이터로써 저장되는 것이다.다시 꺼내올 때에는 언박싱을 거쳐 int형으로 반환이 된다. 잠깐 이때 주의할 점으로는, int형이 아닌 타입의 데이터로 불러오려는 행위는 InvalidCastException 오류를 발생시킨다. (is 연산자 사용을 통한 타입확인) 이러한 일련의 과정은 성능저하를 발생시킨다. 이상으로 박싱언박싱과, 그에..

2020.01.07 게시됨

< Programming >/C#

유니티 스크립트 정리 (3일차)

추적할 대상을 따라가는 로직 ( 플레이어를 따라가는 카메라 )플레이어의 이동로직은 해당 스크립트의 update 함수에 있기에, 카메라의 추적하는 로직은 해당 스크립트의 LateUpadate() 함수에서 해준다.이는 스크립트의 실행 우선순위( Execution Order )를 지정하지 않는 한 어느 스크립트에 있는 Update함수가 먼저 실행될지 불확실 하기 때문이다. 불규칙한 난수를 발생시키는데 사용하는 함수 insideSpeher -> 반경이 1인 구체 내부의 3차원 좌푯값(Vector3)을 불규칙하게 반환한다.Perlin Noise -> 0과1사이의 난수를 발생시키지만 일반 난수 발생기와는 다르게 연속성이 있는 난수를 발생시키는 것으로 무작위한 terrain또는 텍스처,구름 등을 생성할 때 유용하게 ..

2019.12.19 게시됨