스프라이트 랜더러(Sprite Renderer)의 속성 중의 Sorting Layer의 경우


Sprite의 렌더링 순서를 정의해준다.


물론 Z의 크기값에 따라 조정할 수 있지만, 이것을 사용하면 수치가 아니라 좀 더 간편하게 할 수 있게 된다.


Sprite가 여러 개 있을 때, 


가장 뒤에 있어야 할 Sprite...예를 들면 배경등은 Sorting Layer 가장 상단에 작성하고,


가장 앞에 보여야 할 Sprite...예를 들면 Player등은 Sorting Layer 가장 하단에 작성한다.


이렇게되면 같은 Sprite라고 해도 위에 나오게 된다.


물론 Default가 가장 뒷쪽으로 가게 된다.



예를 들어 1 2 3이 있다고 하자.


1에는 Sorting Layer가 적용되지 않은 Default


2에는 Sorting Layer 첫 번째 Num_01


3에는 Sorting Layer 두 번째 Num_01


즉, 태그는 다음과 같이 생성되어있다.



이렇게 한 뒤, 실행해보자.


2 --> 1로 드래그해보면 1 위에 2가 올라가는 것을 볼 수 있다.



3은 1과 2 모두보다 앞으로 나온다. 실제로 드래그해보면 3밑으로 1과 2가 밑으로 나오는 것을 볼 수 있다.



결론. 1이 가장 밑 < 2가 중간 < 3이 가장 상위에 있는 것을 볼 수 있다.


이처럼 스프라이트(Sprite) 이미지의 레이어 층을 쉽게 만들어주는 것이 바로 Sorting Layer이다.




Posted by sungho88
,

게임 오브젝트를 움직이는 작업을 하다보면, 


화면을 벗어나 우주 공간처럼 끝없이 가게 되는 것을 볼 수 있다.


이때, 화면안에 있도록 제한을 해줘야 하는데 가장 간단하게 구현할 수 있는 것이 바로



Camera.main.WorldToViewportPoint 를 사용하는 것이다.




Transforms position from world space into viewport space.


Parameters:


    position:

Vector3 Camera.WorldToViewportPoint(Vector3 position)



바로 카메라(Camera).WorldToViewportPoint(pos)로 써도 되지만, Camera.main을 쓰는 이유는


MainCamera라는 태그(Tag)가 붙은 첫번째 활성화된 카메라를 불러온다는 뜻이다.


즉, 기본적으로 유니티 프로젝트 생성시 만들어지는 main카메라를 사용하겠다는 의미이다.


WorldToViewportPoint(현재 위치)의 경우 position을 월드 공간에서 뷰포트 공간으로 변경시킨다.


카메라의 좌측 하단은 (0,0 , 0.0)이며, 우측 상단은 (1.0 , 1.0)이다. 


또한, z position은 카메라로부터의 거리를 월드 단위로 환산한 값이다.


따라서,


       Vector3 pos = Camera.main.WorldToViewportPoint(transform.position);


            if (pos.x < 0f) pos.x = 0f;

            if (pos.x > 1f) pos.x = 1f;

            if (pos.y < 0f) pos.y = 0f;

            if (pos.y > 1f) pos.y = 1f;


        transform.position = Camera.main.ViewportToWorldPoint(pos);



렇게 하면, 현재 위치(transform.position)를 pos 변수에 대입하고,


pos.x < 0f 라면 왼쪽 화면 밖으로 나갔다는 의미이므로 아무리 왼쪽으로 이동해도 0.0f

 

pos.x > 1f 라면 오른쪽 화면 밖으로 나갔다는 의미이므로 아무리 오른쪽으로 이동해도 1.0f 


pos.y < 0f 라면 아랫쪽 화면 밖으로 나갔다는 의미이므로 아무리 아래쪽으로 이동해도 0.0f 


pos.y > 0f 라면 윗쪽 화면 밖으로 나갔다는 의미이므로 아무리 윗쪽으로 이동해도 0.0f 



로 조건을 줘서 화면 안에서 못 벗어나게 한다.


그 다음에 다시 뷰포트 공간에서 월드 공간으로 변경시킨 뒤, 현재 위치에 넣으면 된다.


이렇게 한 뒤, 게임을 실행해보면 아무리 애써도 화면을 벗어나지 않고 가장자리까지만 가는 것을 볼 수 있다.




Posted by sungho88
,

짧아서 간단히 작성할 것이라 생각했는데 약 2시간동안 고생했다.


드래그 코드는 이미 내장된 함수가 존재한다.


OnMouseDrag()


이 함수를 호출하여 원하는 코드를 적으면 된다.


일단, 움직이고자 하는 게임오브젝트들에 Drag.cs 파일을 갖다 붙인뒤 Drag.cs파일에 코드를 입력한다.


[Drag.cs]


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Drag : MonoBehaviour
{

float distance = 10;

void OnMouseDrag()
{
print("Drag!!");
Vector3 mousePosition = new Vector3(Input.mousePosition.x,
Input.mousePosition.y, distance);
Vector3 objPosition = Camera.main.ScreenToWorldPoint(mousePosition);
transform.position = objPosition;
}
}


불필요한 Start() 함수와 Update() 함수를 삭제하고 OnMouseDrag()함수만 작성해 간략하게 만들었다.


그런데!! 아무리 해도 함수가 실행되지 않았다.


그래서 혹시나해서 OnMouse로 시작하는 모든 함수를 작성해보았다.


OnMouseEnter

OnMouseExit

OnMouseUp

OnMouseDown

..


모든 마우스 관련 함수가 호출되지 않았다.


고민끝에 혹시나해서 이미지(Sprite)에 Collider를 추가해봤더니 이런 !! 된다.


마우스 관련 함수를 사용하기 위해서는 반드시 


콜라이더를 써야만 한다는 것을 알게 되었다.


위와 같이 쓴 다음에 실행해보면 게임오브젝트가 마우스로 이동하는 것을 볼 수 있다.

 

Posted by sungho88
,