상세 컨텐츠

본문 제목

[Unity] 유니티 해상도, 작은 오브젝트, 픽셀 깨짐, 울렁임 관련

게임엔진관련/유니티 엔진

by AlrepondTech 2020. 5. 26. 14:53

본문

반응형

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=77080

 

 

 

 

안녕하세요. 유니티와 에셋 NGUI로 게임을 개발하고 있는 개발자입니다. 현재 위에 보시는 스크린샷과 같이 아이소메트릭2D에 픽셀 소스로 개발하고 있으며, 플레이어는 한 칸 한 칸 정해진 길이로 움직이게됩니다. 카메라 또한, 플레이어를 따라옵니다. (자식은 아닙니다.) 그런데 이 와중에 큰 문제가 발생하여 이렇게 감히 여쭙니다.

 

 문제는, 카메라가 플레이어를 따라 이동하는 과정에서 주변에 있는 오브젝트들이 지직거리며 깨지는 문제입니다. 심한 정도는 아니지만, 육안으로 확실히 볼 수 있는 정도입니다. 물체들이 울렁거린다는 느낌도 받습니다.  실제로 텍스트나 텍스트를 감싸고 있는 실선의 말풍선 또한 번쩍거리면서, 흔들리는 현상이 있습니다. 밑에는 카메라 스크립트입니다.

 

void Update()

{

position = new Vector3 (Player.localPosition.x, Player.localPosition.y, Player.localPosition.z);

this.GetComponent<Transform> ().localPosition = Vector3.Lerp(this.GetComponent<Transform> ().localPosition, position, 0.05f);

}

 

  그렇습니다. 이 스크립트의 문제점은 Lerp값을 업데이트로 주기적 호출해 0.05f만큼 이동하기 때문에, 사실상 Player의 Potion 원값에는 절대 도달할 수 없는 구조로 되어 있습니다. 이 때문에 Position값이 네 자리 밑으로 연산되기도 합니다. 하지만 이 스크립트가 연출상 움직일 때, 아주 부드럽게 움직이기에 만족은 있지만, 픽셀의 지직거림을 참기가 어렵네요. 혹시 이 부분 때문에 문제가 발생하는 걸까요? 정말 활동도 안하는 이기적인 사람이지만 갑히 고수님들에게 여쭙니다.

 

기타 사항.

1. NGUI로 개발되었습니다. 아틀라스의 밉맵을 꺼두었습니다. Flitter mode는 원본 픽셀의 느낌을 살리기 위해 Point로 설정되어 있습니다.

2. 그래픽설정, 퀄리티설정은 최대한 최저로 설정되었습니다. (기본 옵션일 때도 똑같은 문제가 발생했습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

이동관련은 Update보단 LateUpdate로 처리하는게 좋습니다.
그래도 끊킴이 심하다고 느낄경우 카메라를 자식으로 두는방법이 부드럽습니다.
그리고 this.GetComponent<Transform> ().localPosition  이렇게 설정할경우 성능상 좋지 않습니다.

전역변수로 Trasform this_TRansform; 이런식으로 한다음 Start나 Awake에서 초기화시켜서 사용해주는게 졸습니다.
그리고 Lerp을 쓰는경우는 물체를 어디에서 어디로 옴길때 쓰게됩니다. 그런데 0.05로 픽스시킬경우 굳이 무거운 Lerp를 쓸필요 없습니다.
this.GetComponent<Transform> ().localPosition = position; 이런식으로 쓰는게 훨씬 가볍습니다.

------------------------------------------------------------------------------------------------------------------------------------------------------------

z-fighting 문제 아닌가요?

1. 카메라 Near 값 조정해보세요.
2. depth도 보시구요.

보통 카메라 조절로 해결 될거예요.
관련된 자료가 많으니 검색해보시면 금방 나올겁니다.

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Z-fight에 관련해서 지금 열심히 구글링해보고 있습니다. 힌트주셔서 감사합니다. 혹시 그런데 Near와 depth를 값을 어떤식으로 조정하는 게 z-fight을 막는 방법인가요? z-fight이 어떤 문제인지는 알았는데, 쉽지 않네요ㅜ_ㅜ

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

어떤식으로 값을 넣으면 해결되느냐는 작성자님 플젝을 봐야 알겠지요.
검색해보셔서 아시겠지만 Near가 월드에 그려지는 오브젝트랑 거의 겹치거나 하면 문제가 생길수 있습니다.
이럴경우 Near를 더 - 해주시면 될겁니다.
플레이 눌르고 인게임에서 Scene에서 확인해보시면서 조절하시면 될거예요.

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=32907

2D이미지를 텍스쳐로 랜더링할때 필터링 없이 이미지 그대로 선명도를 유지하면서 표현할 방법은 없을까요?

2D게임을 만들고 있는데 배경으로 플레인을 만들어 2D텍스쳐를 올렸습니다. 카메라는 orthographic에 플레인도 이미지와 1:1사이즈로 만들어서 화면 해상도에 딱 맞게 만들어서 뿌리고 있습니다만 게임을 돌려보면 이미지가 살짝 뭉개지듯 선명도가 떨어집니다. 같은 이미지를 GUI텍스쳐로 로 뿌리면 이미지 원본 그대로 나오는데 텍스쳐로 뿌릴때도 2D이미지 그대로 렌더링되게 할 수는 없을까요? 

 

이미지 타입은 물론 GUI로도 해보고 Advanced로해서 밉맵을 꺼보기도 했지만 결과는 똑같았습니다. 쉐이더를 바꿔봐도 별차이가 없고 이미지 필터를 point로 하면 선명도는 유지되는것 같은데 이건 또 부분부분 약간씩 픽셀이 깨지는 문제가 있더군요. point로 했을 때 이미지가 깨지지 않게 하거나 아니면 그외에 GUI텍스쳐로 찍을 때처럼 플레인에서 원본 이미지 그대로 표현하는 방법은 없을까요? 고수닙들의 도움 부탁드립니다.

 

*2D게임에서 라이트와 상관없이 이미지 그대로 표현하는데 가장 좋은 쉐이더는 어떤게 있는지도 함께 알려주시면 감사하겠습니다. _(._.)_

 

----------------------------------------------------------------------------------------------------------------------------------------------------

Texture Format이 Automatic TrueColor 인가요?

참조 : http://mobilism.tistory.com/entry/Unity3D-2D-%EA%B2%8C%EC%9E%84%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%85%8D%EC%8A%A4%EC%B3%90-%EC%84%A4%EC%A0%95

 

------------------------------------------------------------------------------------------------------------------------------------------------------

아, 아직 초기단계라 배경밖에 없습니다. ^_^; 텍스쳐로 넣은 배경 이미지 크기는 화면해상도와 똑같은 720 X 1280으로 해상도와 1:1사이즈고 물론 게임 뷰포트 전체에 딱 맞게 꽉 찬 상태입니다. 2D텍스쳐의 인스펙터에서 이미지 필터링을 Point로 하면 뭉개짐이 없이 원본대로 나오긴 하는데 이때는 또 부분 부분 픽셀들이 조금씩 깨지는 현상이 있더군요. 이미지와 화면 해상도 사이즈가 1:1인데도요.

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

해결봤습니다. 결국은 텍스쳐 필터에 Point를 쓰는게 답이었고 픽셀이 밀리거나 깨지는 문제는 기존 게시글 검색에서 해답을 보았던 문제인데도 같은 문제인지 몰랐었네요. 버텍스의 실수좌표와 텍스쳐 픽셀의 정수좌표사이에서 오는 문제였습니다. http://blog.daum.net/gamza-net/16

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: https://unityindepth.tistory.com/55

 

Pixel Perfect sprites in Unity 2D

 

유니티 4.3에서, 유니티에서 제공하는 2D 툴로 작업을 한적이 있다면 다음과 같은 현상을 보았을 것이다.

 

 

 

 

위 그림은 1024x768 크기의 물결 스프라이트를 씬에 올려 놓은 경우다. 하지만 왼쪽 상단에 위치한 게임 해상도는 1024x768임에도 불구하고 게임화면과 물결 스프라이트이미지가 딱 맞지 않는 현상이 발생한다.

 

이를 해결하기 위해서는 Camera 옵션중 orthographic의 Size를 변경해주면 된다.

 

Camera Size는 다음과 같이 계산하면 된다 : Camera Size = (GameTargetHeight / 2) / PixelsToUnitys

 

Pixels To Unity은 Default로 100으로 되어있다.

 

위와 같은 경우는, 게임 해상도가 1024x768이기 때문에, CameraSize는 3.84가 될 것이다 :

(768 / 2) / 100 = 3.84

 

 

 

Camera Size를 수정하면 다음과 같이 물결 스프라이트가 게임화면에 딱 들어맞게 된다.

 

 



출처: https://unityindepth.tistory.com/55 [UNITY IN DEPTH]

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

 

반응형

 

 

728x90

 

 

 

 

출처: https://playallnight.tistory.com/18

 

오늘은 제가 유니티를 공부하던 중 배웠던 것을 포스팅 할 것 입니다.

 

바로 '유니티2D 해상도' 입니다.

 

저 같은 경우는 유니티로 2D 게임을 만들때 가장 어려웠던 부분 중 하나가 해상도입니다. 설정한 해상도 (예를 들어 1280x720)에 2D Sprite를 유니티로 배치하면 정한 해상도와는 크기가 다르게 보여집니다.

 

오늘은 이 것을 해결 해 볼 것 입니다.

 

우선 Camera 컴포넌트를 보겠습니다.

 

 

 

우리가 봐야할 곳은 1번 Projection과 2번 Size 입니다.

 

1번 Projection

Projection 항목에는 두 가지가 있습니다.

 

- Perspective 보통 3D에서 쓰입니다. 현실 세계속 카메라와 비슷한 카메라라고 생각하시면 됩니다. 

원근감이 적용돼 카메라와의 거리가 멀수록 오브젝트의 크기가 작게 보입니다.

- Orthographic : 보통 2D에서 쓰입니다. Perspective와는 다르게 원근감이 없는 카메라 입니다. 

원근감이 적용되지 않아 카메라와의 거리가 멀든 가깝든 오브젝트는 항상 똑같은 크기로 보여집니다. 

 

일단 우리는 2D 게임을 제작하니 Orthographic 으로 셋팅 하겠습니다.

 

2번 Size

Size 항목은 Projection 항목이 Orthographic으로 셋팅 되어야만 활성화 되는 항목입니다. 

Size는 카메라 확대에 관한 것이라고 보면 되겠습니다. 

 

Size의 숫치가

 

- 작으면 : 화면이 확대됩니다..

- 커지면 : 화면이 축소됩니다.

 

제가 위에서 Orthographic 뷰는 원근감이 없어 카메라와의 거리 상관없이 크기는 항상 똑같다고 했죠?

Size는 Orthographic에서의 카메라 줌이라고 생각하시면 됩니다.

 

유니티 카메라를 정한 해상도와 똑같이 보이게 할려면 Size 항목을 조절하시면 됩니다.

 

일단 게임을 만드실 때 정해둔 해상도가 있으실 것 입니다. 저 같은 경우는 1280x720 으로 하겠습니다.

 

Size 항목에 자신이 정해둔 해상도 세로 사이즈의 반(저 같은 경우 '360') 을 넣어 주시면 여러분이 생각하신 해상도와 똑같이 카메라가 보여지게 됩니다. 

 

아직 끝난 것이 아닙니다. Unity의 띄울 Sprite도 옵션을 셋팅 해줘야합니다.

 

Sprite를 눌러보시면 Inspector가 다음과 같이 보입니다.

 

우리가 봐야할 곳은 Pixels Per Unit입니다.

 

Pixels Per Unit

Sprite의 픽셀과의 비율입니다.  기본적으로 100으로 설정되어 있을 것 입니다.

예를 들어 64x64 사이즈의 Sprite가 있으면 유니티에서는 Scale XY를 100으로 맞춰주어야만 실제 Sprite 사이즈로 보여지는 것입니다.

 

Scale을 바꾸지 않고 Pixels Per Unit을 1로 바꾸면 실제 Sprite 픽셀 사이즈와 똑같이 보여지게 됩니다.

 

아래는 결과 화면입니다.

 

 

Camera 컴포넌트의 Size 보시면 720의 반인 360 으로 셋팅 되어있는 것을 볼 수 있습니다.

그리고 Pixels Per Unit도 1로 설정되어 있습니다.

 

그럼 카메라에 보여지는 것이 실제 해상도와 같은지 포토샵에서 같은 해상도로 보여드리겠습니다.

 

 

둘이 캡처의 크기가 달라서 조금 달라 보일 수 도 있지만 

둘의 크기는 정확히 똑같습니다. 유니티 카메라에서 실제 해상도와 똑같이 보이는 것입니다.

좋아요공감

공유하기

글 요소

구독하기



출처: https://playallnight.tistory.com/18 [PlayAllNight]

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: https://connect.unity.com/p/mwu-korea-2019-gilgoyangi-iyagi-feemodev-1

 

[ 사용된 유니티 기술 ]

 

Unity Asset store - Pixel perfect camera를 사용하여 픽셀 울렁임을 줄이고, 해상도 별 카메라 최대 크기를 제한하였습니다.

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: https://m.blog.naver.com/zldejs22/221670502725

 

 

- 3D 공간을 촬영하는 카메라 내 모바일 해상도별 대응을 위해 사용한다.

사용을 위한, 카메라 내의 스크립트로 할당하여 사용할것.

[고정 해상도 비율을 원할 경우 다음과 같이 작성하십시오]

defaultHeight = myCam.fieldOfView;

defaultWidth = myCam.fieldOfView * myCam.aspect;

대신, 해당 해상도에서의 FOV값(ex>60) / 아래 공식을 통해 결정된값을 defaultHeight/Width 고정값으로 넣어주시면 끝.

using UnityEngine;

public class TestFOV : MonoBehaviour {

public Camera myCam = null;

public bool maintainWidth = true;

[Range(-1, 1)]

public int adaptPosition;

float defaultWidth;

float defaultHeight;

Vector3 CameraPos;

private void Awake()

{

myCam = this.gameObject.GetComponent<Camera>();

}

private void Start()

{

CameraPos = myCam.transform.position;

defaultHeight = myCam.fieldOfView;

defaultWidth = myCam.fieldOfView * myCam.aspect;

}

private void Update()

{

if (maintainWidth)

{

myCam.fieldOfView = defaultWidth / myCam.aspect;

myCam.transform.position = new Vector3(CameraPos.x, CameraPos.y + adaptPosition * (defaultHeight - myCam.fieldOfView), CameraPos.z);

}

else

{

myCam.transform.position = new Vector3(adaptPosition * adaptPosition * (defaultWidth - myCam.fieldOfView * myCam.aspect), CameraPos.y, CameraPos.z);

}

}

}

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: https://docs.unity3d.com/kr/530/Manual/FrustumSizeAtDistance.html

 

뷰 Frustum은 카메라에서 일정 거리에서의 교차 영역이 월드 공간에서 가시 공간의 사각형 영역으로 정의 됩니다. 어떤 거리에의 사각형의 크기가 어느 정도인지 또는 사각형의 크기는 거리가 어느 정도인지에 대한 계산이 도움이 되는 경우가 있습니다. 예를 들어, 만약 움직이는 카메라에 의해 오브젝트를 지속적으로 추적할(예를 들어 플레이어 등을 추적) 필요가 있는 경우 오브젝트가 안보이는 거리까지 접근해서는 안됩니다.

어떤 거리에서의 Frustum의 높이 (둘다 표준 월드 단위)는 다음 수식에 의해 계산할 수 있습니다 :

 

var frustumHeight = 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);

var distance = frustumHeight * 0.5f / Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);

var camera.fieldOfView = 2.0f * Mathf.Atan(frustumHeight * 0.5f / distance) * Mathf.Rad2Deg;

 

var frustumWidth = frustumHeight * camera.aspect;

var frustumHeight = frustumWidth / camera.aspect;

 

… 또한 이 과정을 반대로 하는 Frustum의 높이에서 거리를 계산할 수 있습니다 : 또한 높이와 거리가 주어졌을 때 FOV 각도를 계산할 수 있습니다 : 각각의 이러한 계산은 Frustum의 높이가 포함되지만, 이것은 width 에서 쉽게 계산할 수 있습니다(반대의 경우도 마찬가지로 계산할 수 있습니다) :

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

#기타관련링크

- https://m.blog.naver.com/gold_metal/220886179355

 

- https://www.slideshare.net/jungsoopark104/3d-2d

 

- https://yulcat.com/2016/10/05/%EC%9C%A0%EB%8B%88%ED%8B%B0%EB%A1%9C-%ED%94%BD%EC%85%80-%EC%95%84%ED%8A%B8-%ED%91%9C%ED%98%84%ED%95%98%EA%B8%B0/

 

- https://forum.unity.com/threads/scaling-resolution-up-with-pixel-perfect-camera.616024/

 

- https://www.youtube.com/watch?v=CU4YjSZNTnY

 

- https://www.youtube.com/watch?v=5WYvYZnGKKc

 

- http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_lecture&wr_id=3617

 

- https://cgamefancy.tistory.com/78

 

 

 

=======================

=======================

=======================

 

 

 

 

 

반응형


관련글 더보기

댓글 영역