fullstack

[Unity] Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 터치입력시 사용법

Unity

Unity 에서 마우스 움직임 값을 받아 사용하려고 Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 를 많이 사용합니다

 

다음과 같은 코드가 있다고 가정해 보겠습니다

float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");

 

그러나 모바일 디바이스에서 이를 그대로 사용하면 값이 변형되어 원하는 결과를 얻을 수 없습니다

모바일 디바이스에서는 Input.touches 의 deltaPosition을 사용해야 합니다

 

다음과 같이 코드를 작성하면 PC와 모바일 디바이스 모두에서 정상 동작 할 수 있습니다

float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
if (Input.touchCount > 0)
{
    x = Input.touches[0].deltaPosition.x;
    y = Input.touches[0].deltaPosition.y;
}

 

 

 

[Unity] Cylinder Collider 간단하게 만드는 방법

Unity

Unity 에서는 기본적으로 Cylinder Collider를 지원하지 않습니다

 

때문에 Cylinder 게임오브젝트를 Create 하면 다음과 같이 Capsule Collider가 붙게 됩니다

 

 

그래서 이렇게 사용을 한다면 충돌영역이 정확하게는 되지 않습니다

그래서 Cylinder 모양의 Collider를 사용하고 싶다면 따로 만들어야 합니다

 

 

이런식으로 Box Collider를 일정각도로 여러개 붙여서 간단하게 만들어 볼 수 있습니다

 

 

이렇게 더 많은 Box Collider를 사용 할 수록 더욱 둥글게 만들 수 있습니다

 

이 방법은 당연히 퍼포먼스적으로 좋지는 않습니다

그래도 꼭 Cylinder 모양의 Collider를 써야한다면 이런 방법으로 만들어서 쓸 수 있습니다

 

 

 

[Unity] 자식오브젝트에 있는 Collider 체크를 부모오브젝트에서 해야할때

Unity

unity 에서 부모오브젝트를 축으로 두고 자식오브젝트에 실제 모델링 오브젝트를 넣는 구성을 많이 합니다

 

이런 구조일 경우 스크립트처리는 부모오브젝트에서하는데 collider가 자식오브젝트에 있기 때문에 충돌체크가 난감할 수 있습니다

 

이는 아주 쉽게 해결이 가능합니다

바로 Rigidbody를 부모오브젝트에 추가해주기만 하면 됩니다

 

그럼 자식오브젝트에 충돌감지가 들어와도 부모오브젝트로 알아서 전달되게됩니다

 

[Unity] Spine 오브젝트 tint/dark color 변경하기

Unity

unity 에서 spine 오브젝트 material의 tint color 와 dark color 를 변경하는 방법 입니다

 

우선 shader를 Spine/Skeleton Tint 로 변경해 줍니다

 

코드는 다음과 같습니다

private MeshRenderer _renderer;
private MaterialPropertyBlock _block;

void Start()
{
    _renderer = GetComponent<MeshRenderer>();
    _block = new MaterialPropertyBlock();
    
    _renderer.SetPropertyBlock(_block);
    
    int id = Shader.PropertyToID("_Black");

    _block.SetColor(id, Color.red);
    _renderer.SetPropertyBlock(_block);
}

 

여기서 PropertyToId 를 "_Color" 라고 할 경우 Tint Color를, "_Black" 이라고 할 경우 Dark Color 를 변경할 수 있습니다

 

MaterialPropertyBlock 을 이용하여 원하는 색을 적용시켜 주면 됩니다

 

이를 반복문으로 구현하면 이런식으로 데미지를 받는 것 같은 효과를 줄 수 있습니다

 

 

 

[Unity] 랜덤값 출력. Random.Range

Unity

Unity 에서 랜덤값을 출력하고 싶을때는 Random.Range 를 사용하면 됩니다

 

Random.Range(min, max)

여기서 주의할 점은 시작 값은 포함되고, 끝 값은 포함되지 않는다는 것 입니다

 

예를 들어보겠습니다

 

int r = Random.Range(1, 10);

이렇게 사용한다면 r 이라는 변수에 1, 2, 3, 4, 5, 6, 7, 8, 9 중에 하나의 값이 랜덤으로 들어가게 됩니다

 

만약 소수점까지 사용하고 싶다면,

 

float r = Random.Range(0.1f, 1.0f);

 

이런식으로 자료형만 바꾸어서 사용하면 됩니다

 

 

 

[Unity] Spine 오브젝트에 Mask 적용하는 법

Unity

unity-spine 환경에서 sprite mask 기능을 지원하게 되어서 Spine 오브젝트에 쉽게 Mask를 적용할 수 있습니다

 

unity-spine 예제의 spine boy를 불러와 적용해 보겠습니다

 

 

이 게임오브젝트의 SkeletonAnimation 컴포넌트를 보면 Mask Interaction 이라는 항목이 있습니다

 

여기서 'Visible Inside Mask' 혹은 'Visible Outside Mask' 를 선택하면 되는데,

'Visible Inside Mask'는 추후에 생성할 sprite mask 의 영역만큼만 spine 오브젝트가 마스킹되서 보이게 되고,

'Visible outside Mask'는 sprite mask의 영역을 제외한 만큼만 spine 오브젝트가 보이게 됩니다

 

'Visible Outside Mask'를 선택해 보겠습니다

 

그럼 이렇게 자동으로 OutsideMask 메테리얼이 자동으로 생성되고 해당 spine 오브젝트에 적용이됩니다

 

그럼 이제 Sprite Mask를 생성해야 합니다

 

그리고 Sprite에 Mask 이미지를 선택하기만 하면 됩니다

 

이렇게 마스킹이 잘 되는것을 볼 수 있습니다

 

 

 

[디자인 패턴] 프록시 패턴(Proxy Pattern)

디자인 패턴

- 개념

다른 객체에 대한 접근을 제어하기 위해 대리자 역할을 하는 객체를 두는 패턴

대리자는 일을 처리하고 완료되면 그 결과를 알려준다

대리자 역할을 하는 객체는 흐름 제어만 할 뿐 결과값을 조작할 수 없다


프록시 패턴은 단순 포인터보다 더욱 다방면에 활용할 수 있다

1. 실제 객체를 요청하기 전이나 후에 인가 처리 (보호용 프록시)

2. 자원이 많이 드는 객체에 대해 백그라운드 처리 (가상 프록시)

3. 원격 메소드를 호출하기 위한 작업 (원격 프록시)

4. 실제 객체에 접근이 일어날 때 추가적인 행동을 수행 (스마트 참조자)




- 구현



Proxy는 Subject와 동일한 인터페이스를 제공하며, 실제 대상에 대한 접근을 제어하고 실제 대상의 생성과 삭제를 책임집니다. 그리고 Proxy 종류에 알맞는 요청을 수행합니다

Subject는 공통된 인터페이스를 정의하며, RealSubject가 요청되는 곳에 Proxy를 사용할 수 있게 합니다

Proxy 클래스는 자신이 받은 요청을 RealSubject 객체에 전달합니다




- 관련 패턴

적응자 패턴 (Adapter Pattern) - http://cpp11.tistory.com/57

장식자 패턴 (Decorator Pattern) - http://cpp11.tistory.com/58


[디자인 패턴] 책임 연쇄 패턴 (Chain of responsibility Pattern)

디자인 패턴

- 개념

요청을 처리할 수 있는 기회를 여러 객체에게 주어, 요청하는 객체와 처리하는 객체 간의 결합도를 없앨 수 있는 패턴




- 구현


Handler는 요청을 처리하는 인터페이스를 정의하고, 후속 처리자(successor)와의 연결을 구현합니다

ConcreteHandler는 자신이 처리할 행동이 있다면 처리하고, 아니라면 후속처리자에게 요청을 보냅니다

사용자가 처리를 요청하면 이 요청이 실제로 요청을 받을 책임이 있는 ConcreteHandler 객체를 만날 때까지 연결 고리를 따라서 계속 전달됩니다




- 관련 패턴

복합체 패턴 (Composite Pattern)


[디자인 패턴] 복합체 패턴 (Composite Pattern)

디자인 패턴

- 개념

객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만드는 패턴

개별적인 객체들과 객체들의 집합간의 처리 방법의 차이가 없을 경우, 같은 방법으로 취급하여 사용자가 동일하게 다룰 수 있도록 한다




- 구현


Component는 표현할 모든 구성요소들의 추상적인 인터페이스를 정의합니다

Leaf는 가장 말단의 객체로 Component에서 지정된 인터페이스를 구현합니다

Composite는 Component요소를 자식으로 가지며, Component요소를 관리하기 위한 추가적인 연산을 구현합니다




- 관련 패턴

장식자 패턴 (Decorator Pattern) - http://cpp11.tistory.com/58

플라이급 패턴 (Flyweight Pattern) - http://cpp11.tistory.com/60

반복자 패턴 (Iterator Pattern)

방문자 패턴 (Visitor Pattern)

[디자인 패턴] 플라이급 패턴 (Flyweight Pattern)

디자인 패턴

- 개념

개체의 상태를 공유 풀에 형성하여 메모리를 절약하는 기법

다량의 객체를 만들 때 공유 풀에 저장해 관리하여, 한번 생성된 객체는 중복으로 생성하지 않고 공유를 통해 효율적으로 자원을 활용한다




- 구현

FlyweightFactory에서 플라이급 객체를 생성하고 관리합니다. 또한 객체가 제대로 공유되도록 보장합니다

사용자는 ConcreteFlyweight의 인스턴트를 직접 만들 수 없고, FlyweightFactory를 통해서만 객체를 얻어야 합니다




-관련 패턴

복합체 패턴 (Composite Pattern)

상태 패턴 (State Pattern)

전략 패턴 (Strategy Pattern) - http://cpp11.tistory.com/59