반응형

1번 : 이미지 가장자리에 여백이 없고 Filter Mode를 Bilinear로 세팅.

2번 : 이미지 가장자리에 여백이 없고 Filter Mode를 Pointer로 세팅.

3번 : 이미지 가장자리에 4방으로 2px의 여백을 주고 Filter Mode를 Bilinear로 세팅.

4번 : 이미지 가장자리에 4방으로 2px의 여백을 주고 Filter Mode를 pointer로 세팅.

UI Canvas에서 설정 별 이미지 깨짐 현상 비교

보통 Sprite 이미지를 임포트 해서 Canvas 상에 올린 후 로테이션값을 조절해 사용하다보면 위 이미지에서 처럼 가장자리가 깨지거나 혹은 가장자리만 깨지는 현상을 경험할 수 있다. 결론부터 얘기해서 3번처럼 보이게 하기 위해서는 포토샵에서 아래처럼 이미지의 바깥쪽에 1~2px의 여백을 만들어 가져오면 해결된다. 가져온 이미지는 Filtermode를 Bilinear 또는 Trilinear로 선택해주고 Apply시켜준다.

포토샵에서 이미지 가장자리에 강제로 여백을 준다.
Filter Mode

 

 

참고 : https://gamedev.stackexchange.com/questions/139626/is-ui-anti-aliasing-broken-in-unity-5-6

 

Is UI anti-aliasing broken in Unity 5.6?

I have a project that was started in Unity 5.5. When I open it in 5.6, most 2D graphics look like they're not anti-aliased: left is 5.6, right is 5.5 What you see there are UI Images in a Canvas....

gamedev.stackexchange.com

 

반응형
반응형

유니티의 UI컴포넌트를 많이 사용하는데, ScrollRect도 당연히 많이 사용하게 된다.

ScrollRect로 리스트 구현할 때 간혹 리스트 안에 Button을 붙이는 경우가 생기는데 Button과 ScrollRect간에 이벤트가 공유되지 않아 원치 않은 상황이 생기게 된다. 예를 들면 Button위에서 Swipe을 하게 될 경우 이런경우 스크립으로 버튼오브젝트에 발생되는 터치 이벤트 정보를 스크롤렉트로 동일하게 잘 넘겨주면 되지만 ... 아무튼 귀찮다.

이번꺼는 버튼만 정리한 내용이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ButtonTouchHandler : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerClickHandler {
	bool isEnable;
	Button Btn_Target;

	void Start () {
		Btn_Target = this.gameObject.GetComponent<Button> ();
		Btn_Target.interactable = false;
	}
	public void OnPointerDown (PointerEventData e) {
		isEnable = true;
		Btn_Target.interactable = false;
	}
	public void OnDrag (PointerEventData e) {
		if (Mathf.Abs (e.delta.x) > 2 || Mathf.Abs (e.delta.y) > 2) {
			Btn_Target.interactable = false;
			isEnable = false;
		}
	}
	public void OnPointerClick (PointerEventData e) {
		if (isEnable) {
			Btn_Target.interactable = true;
			Btn_Target.OnPointerClick (e);
		}
	}
}

 

추가로 상위 ScrollRect로 이벤트를 공유하는 스크립은 이렇게...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class MyEvent : UnityEvent<Vector2> { }

public class Synchronizer : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
	public ScrollRect ParentSR;
    
	public void OnBeginDrag (PointerEventData e) {
		ParentSR.OnBeginDrag (e);
	}
	public void OnDrag (PointerEventData e) {
		ParentSR.OnDrag (e);
		if (Mathf.Abs (e.delta.x) > 2 || Mathf.Abs (e.delta.y) > 2) {
			isDrag = true;
		}
	}
	public void OnEndDrag (PointerEventData e) {
		ParentSR.OnEndDrag (e);
	}
}
반응형

+ Recent posts