전체 글 102

[Unity] photon pun2

photon pun2 photon은 각종 멀티플레이용 네트워크 패키지를 제공해주는 회사이다. photon의 여러 서비스중 pun2는 Photon Unity Networking로 유니티용 멀티플레이 패키지 서비스이다.pun2는 photon에서 제공해주는 서버를 사용하여 클라이언트 측 코딩만 진행하여 멀티플레이 게임을 제작하는것이 가능하게 해준다. pun2는 마치 p2p를 하는듯 마스터 플레이어와 그외 플레이어 사이의 통신처럼 인터페이스를 제공해주지만 실제로는 서버를 경유하는 서버 기반 멀티를 수행하게된다. pun2 asset pun2로 멀티게임을 만드려면 우선 photon서버에서 pun2 어플리케이션을 하나 생성하고 id를 받아야한다. 그러면 활성화된 pun2서버가 생겨나며 해당 서버로 멀티게임을 만들 수..

게임엔진/Unity 2023.08.03

[Unity 2D Shader] 2D 스프라이트 팔레트 스왑 쉐이더

색상만 다른 여러 픽셀 이미지를 위한 쉐이더 위 이미지와 같이 게임을 제작하다보면 픽셀의 형태는 동일하나 색상만 다른 경우가 존재한다. 이런 경우 각 이미지를 만들어 사용하는 방법도 있지만 스프라이트 스왑 기법을 사용하면 생산성을 높일 수 있다. 팔레트 스왑은 이미지를 색상이 아닌 컬러 인덱스를 가지도록 만들고 이후 렌더링 시 현재 선택된 팔레트에서 각 인덱스의 색상을 가져와 렌더링 하는 기법이다. 구현 유니티에서 이를 구현할 수 있는 한가지 방법은 기본 스프라이트 쉐이더를 다음과 같이 수정하면 된다. 1. 컬러들을 지정할 팔레트 2D 텍스처 프로퍼티를 추가한다. 2. spriteFrag에서 SampleSpriteTexture(IN.texcoord)를 통해 스프라이트 픽셀 값을 추출한다. 3. 2번에서 ..

그래픽스/Unity 2023.07.24

[일반물리학1][6장]강체의 회전

토크 힘은 물체에 병진 가속도를 발생시키고 병진 운동을 유도한다. 마찬가지로 토크는 물체에 각가속도를 발생시키고 회전 운동을 유도하는 회전에서의 힘과 같은 존재라고 볼 수 있다. 어떠한 회전점(고정, 무게중심등)을 가진 물체의 한 점p에 F라는 힘을 가했을 때 해당 물체에 발생하는 토크는 회전점에서 p로 가는 벡터와 F의 외적이 된다. T = R X F 토크의 크기는 유도하는 각가속도와 비례하며 토크의 방향이 가지는 의미는 토크 벡터가 자신을 가르키도록 봤을때 반시계방향으로 물체가 회전함을 의미한다. 즉 180도 관계의 토크는 반대 방향으로의 회전을 의미한다. 관성 모멘트 물체에 힘이 가해지면 F = ma 라는 공식에 의해 F/m에 해당하는 병진 가속도가 발생한다. 회전도 마찬가지로 물체의 한 점에 F라..

[Unity 2D Shader] 최상위 반투명 픽셀만 혼합하는 스프라이트 쉐이더

물에 비친 상을 위한 쉐이더 이번에 만든 쉐이더의 목적은 물 표면에 비친 상을 표현하기위한 쉐이더이다. 좀 더 정확히 말하면 불투명 스프라이트 위에 반투명 스프라이트들이 존재할 때 반투명 스프라이트들의 픽셀중 가장 깊이가 얕은 픽셀만 혼합되고 깊은 픽셀들은 무시되게 된다. 토이 프로젝트를 개발하는데 필요하여 구현하게 되었다. 이상적인 구현방법 맨 처음 계획한 구현방법은 다음과 같다. s1 -물 표면 이미지에 사용될 쉐이더 ZWrite On 그외 기존 sprite-default와 동일 s2 - 물 위에 비친 반투명 이미지에 사용될 쉐이더 ZWrite On ZTest Less AlphaTest on s1보다 늦게 렌더링 될 것이 보장 s2의 오브젝트들은 깊이가 얕은 것에서 깊은 순으로 렌더링 그외 기존 sp..

그래픽스/Unity 2023.07.14

[Effective C++]항목 53~55: 기타

항목 53 : 컴파일러 경고를 지나치지 말자 프로그래밍을 하다보면 컴파일은 정상적으로 되지만 컴파일러 경고가 나오는 경우가 있다. 이때 이러한 경고는 무시하지말고 무엇을 말하고 있는지를 살펴보아야한다. 대부분의 컴파일러 경고는 문법상 문제는 없지만 코드의 맥락이 직관적인 부분과 다르게 동작할 때 발생한다. 예를 들어 부모에서 f라는 가상 함수를 const로 선언하고 자식이 비 const f함수를 작성하였다면 일부 컴파일러에서 자식의 f가 부모의 f를 가린다고 경고를 띄운다. 실제로 자식의 f가 부모의 f를 가리기에 자식 인스턴스는 부모 포인터와 자신의 포인터에 담겨있을때 서로 다른 f를 호출한다. 객체지향의 기본 동작에서 벗어난 것이다. 이런식으로 겉으로 드러나는 직관적인 부분과 실제 동작이 다른 부분을..

[Effective C++]항목 49~52: new와 delete

항목 49 : new 처리자 new처리자는 new로 메모리 할당에 실패했을때 메모리 확보를 위해 시도되는 함수이다. 표준 new의 경우 다음과 같이 처리된다. 1. 매개변수로 할당할 바이트 사이즈를 받는다. 2. 바이트 사이즈가 0이면 1로 바꾼다 3. while(true) 4. malloc으로 사이즈만큼 할당시도 5. 성공시 할당된 포인트 리턴 6. 실패시 설정된 new 처리자 호출(new 처리자가 null 함수 포인터로 설정되있다면 throw bad_alloc) 7. 예외가 던져지거나 성공할때까지 반복 프로그래머는 의 set_new_handle에 void (void) 함수 포인터를 넣어 new 처리자를 자신이 만든 것으로 설정할 수 있다. 이때 리턴값은 기존 함수 포인터이다. new 처리자는 다음중 ..

[Effective C++]항목 45~48: 템플릿 2

항목 45 : 멤버 함수 템플릿클래스 템플릿 안에는 별개의 템플릿을 가지는 멤버 함수를 만들 수  있다. template class c{ public: tempalte void fff(U a);}이렇게 하면 특정 클래스 템플릿 인스턴스에서 특정 타입의 fff를 호출할때마다 해당 멤버함수가 생성되며 호출된다. 이러한 멤버 함수 템플릿의 대표적인 사용예시는 일반화 복사 생성자이다.스마트 포인터 템플릿을 만든다고 해보자. 만약 평범하게 자신에 대한 복사 생성자 만든다면 자식 타입에 대한 스마트 포인터를 부모 타입에 대한 스마트 포인터에 복사 생성할 수 가 없다. 이를 구현하기 위해선 멤버 함수 템플릿으로 smartPoint를 매개변수로 받는 복사 생성자를 만들면 된다. 그후 매개..

[Effective C++]항목 41~44: 템플릿 1

항목 41 : 템플릿의 특성 템플릿은 다음과 같은 두가지의 추가적인 특성을 가지는 문법이다. 암시적 인터페이스 기존 문법에서는 특정 타입의 연산자나 멤버에 접근할 때 명시적으로 특정 타입의 인터페이스에 접근한다. 하지만 템플릿에서는 타입 매개변수의 객체에 대해 암시적 인터페이스를 통해 멤버에 접근한다. 타입 매개변수에 입력되는 타입들은 해당 템플릿에서 상용한 암시적 인터페이스들에 대해 모두 유효해야한다. 그렇지 않다면 템플릿 인스턴스를 만드는 컴파일 타임에 에러가 발생한다. 컴파일 타임 다형성 기존 문법에서는 다형성을 사용할 때 런타임에 해당 레퍼런스에 들어있는 실제 객체가 무엇인지 인식하여 호출될 함수가 정해졌었다. 그에 비해 템플릿의 타입 매개변수를 활용한 다형성은 템플릿 인스턴스를 만들 때 해당 타..

[Effective C++]항목 38~40: 객체 지향 설계 3

항목 38 : 객체 합성 객체 합성은 그냥 한 클래스가 다른 클래스를 멤버로 가지는 것을 의미한다. 이는 개념적으로 보통 두가지 중 하나의 의미를 가진다. has-a 밖 클래스가 안 클래스를 개념적으로 소유한 경우이다. person 클래스가 string name, Address adress등의 멤버를 가진 경우에 해당된다. 보통 클래스가 현실의 객체를 나타낼때 나타난다.. is-implemented-in-terms-of 밖 클래스가 안 클래스를 구현에 활용하는 경우이다. 하나의 부품으로 사용했다고 봐도 무방할 듯 하다. stack 클래스가 내부적으로 list 객체를 멤버로 가지고 있고 이를 이용하여 구현된 경우 등이 해당된다. 보통 시스템 구현을 위한 인공물 클래스에서 나타난다. 항목 39 : priva..

[Effective C++]항목 35~37: 객체 지향 설계 2

항목 35 : 가상함수 대체제들 가상 함수는 재정의 가능한 함수를 상속하기 위해 사용한다. 이때 가상함수대신 여기에 쓸 수 있는 기법들을 살펴보자. 비가상 인터페이스 이 기법은 재정의가 필요한 부분을 private나 protected 가상 함수로 선언하고 이를 중간에 호출하여 사용하는 public 인터페이스 비가상 함수를 구현하여 제공하는 방법이다. 이렇게 하면 자식은 상속받은 private또는 protected 비가상 함수를 재정의할 것이고 사용자들은 재정의된 private함수를 사용하는 public 비가상 함수를 호출하여 사용할 것이다. 참고로 private도 자식에서 재정의는 가능하다.(호출은 불가능) 이 방식의 장점은 재정의 구현 부분 앞뒤로 기본 처리를 넣어줄 수 있다는 점이 있다. 함수 포인터..