fullstack

[Unity] RequireComponent

Unity

RequireComponent는 게임 오브젝트에 꼭 필요한 컴포넌트를 스크립트로 작성하여 추가하는 것 입니다

[RequireComponent (typeof (Rigidbody))]

이렇게 작성을 하면 Rigidbody 컴포넌트가 해당 스크립트를 가진 게임 오브젝트에 자동으로 추가됩니다

 

다음은 예제 코드입니다

using UnityEngine;

// PlayerScript requires the GameObject to have a Rigidbody component
[RequireComponent (typeof (Rigidbody))]
public class PlayerScript : MonoBehaviour {
	Rigidbody rb;
	
	void Start() {
		rb = GetComponent<Rigidbody>();
	}
	void FixedUpdate()  {
		rb.AddForce(Vector3.up);
	}
}

 

이제 게임 오브젝트에 위 스크립트를 추가하면, Rigidbody 컴포넌트가 자동으로 추가되는 것을 볼 수 있습니다

이 게임 오브젝트의 Rigidbody 컴포넌트를 Remove Component 하려고 하면 다음과 같이 경고창이 나오는 것을 볼 수 있습니다

 

 

[Unity] Json 파일 간단하게 Class 변환하기 (Json.NET)

Unity

Json.NET을 이용하여 Json 파일을 간단하게 Class 로 변환할 수 있다

Json.NET 에셋스토어에서 받을 수 있다

 

우선 간단한 Json 파일을 만들어 보았다

{
    "level" : 0,
    "coin" : 0
}

 

그 다음에는 이 정보를 파싱할 Class도 만들어 보자

[Serializable]
class Data
{
    int level;
    int coin;
}

 

주의할 점은 Class 에 [Serializable] 를 붙여 직렬화 해 주어야 하고, 변수명을 서로 맞춰 주어야 한다

 

TextAsset jsonData = Resources.Load("Json/Data") as TextAsset;
_data = JsonUtility.FromJson<GameData>(jsonData.ToString());

 

Json 파일은 Resources 경로에 Json/Data.json 으로 저장하여 간단하게 Resources.Load 를 이용하여 불러와 보았다

이렇게 사용하면 Json Object를 생성하여 일일히 파싱하는 번거로움을 줄일 수 있다

 

Class를 다시 Json으로 변환할때는 JsonUtility.ToJson(_data) 이런식으로 사용할 수 있다

 

 

 

[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 이미지를 선택하기만 하면 됩니다

 

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