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] 디바이스 경로에 파일 입출력하기 (Application.persistentDataPath)

Unity

게임정보를 저장할 때 PlayerPrefabs를 쓰면 쉽고 편리하게 정보를 저장할 수 있지만, 조금 복잡하고 많은 데이터를 저장해야 할 때에는 PlayerPrefabs는 한계가 있습니다

이럴 때에는 xml 이나 json 파일을 만들어서 디바이스 내부에 파일로 정보를 저장하는 것이 좋습니다

 

우선 파일입출력을 사용하기위해서 다음과 같은 namespace를 추가해 줍니다

using System.IO;

 

저는 Json파일을 생성하여 저장정보를 저장하겠습니다

이를 위해서 JsonUtility를 사용하였습니다

 

디바이스의 저장경로는 Application.persistentDataPath 로 얻어오면 됩니다

 

먼저 파일을 쓰는 로직입니다

File.WriteAllText(Application.persistentDataPath + "/UserData.json", JsonUtility.ToJson(_data));

 

다음은 파일을 읽는 로직입니다

if (File.Exists(Application.persistentDataPath + "/UserData.json"))
{
    string json = File.ReadAllText(Application.persistentDataPath + "/UserData.json");
    _data = JsonUtility.FromJson<Data>(json);
}

 

위 예제는 최대한 간단하게 입출력만 한 예제이고, 보안을 위해서 파일을 저장할 떄 암호화를 해주면 더욱 좋습니다

 

 

 

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

 

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

 

 

 

[Unity3D] WWW객체로 Web에 있는 Image 불러오기

Unity

Web에 있는 이미지를 불러오기 위해 WWW객체를 사용한다.

WWW객체는 URL의 내용을 가져오기 위한 유틸리티 모듈이다.


1
2
3
4
5
6
7
public string url = " /* Image url  */ ";
IEnumerator Start()
{
    WWW www = new WWW(url);
    yield return www;
    plane.GetComponent<Renderer>().material.mainTexture = www.texture;
}



Web에 있는 이미지를 불러와 plane에 적용하였다.