메뉴 건너뛰기

게임
2020.11.20 21:22

스프라이트 하프 밉맵

조회 수 341 추천 수 0 댓글 0


Honeycam 2020-11-20 20-48-32.gif

가운데가 하프밉맵 적용한 오브젝트.

 

다른 스프라이트는 해상도에 따라서 좀 흐려져도 그러려니 하지만

주인공만은 어떻게든 선명하게 보여주고 싶었다.

 

하지만 밉맵은 1/2 사이즈로 점차 줄어드니까 그 사이에 있는 1.5 / 2에서는 좀 덜 선명한 상황 발생.

그렇다면 그 1.5 / 2에도 밉맵을 추가하면 어떨까 싶어서 만들어본 기능.

 

카메라 높이나 게임 해상도가 변화하면 이벤트 받아서 현재 화면상의 스프라이트 크기를 구해서

원본 스프라이트와 0.75배 스프라이트 중에서 골라서 LateUpdate에서 반영하도록 하였다.

 

무작정 사이즈만 0.75배로 줄인 텍스쳐를 만들면 유니티가 Non power of two라면서 신경질내므로 전용 스프라이트 아틀라스를 또 하나 뽑아줘야한다.

그리고 0.75배 텍스쳐는 Pixels Per Unit도 원본 텍스쳐의 75%로 해주어야 한다.

 

스프라이트 한 장 한 장을 매핑해서 Dictionary에 등록해주기 너무 귀찮았으므로 그냥 스프라이트 이름으로 구분하도록 하였다.

 

조잡함!

 

 


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

 

public class HalfMipmapSprite : MonoBehaviour {

 

    public SpriteRenderer _sRenderer;

    public Sprite[] halfMipmapSpriteList;
    private Dictionary<int, Sprite> spriteNameToSpriteDic = new Dictionary<int, Sprite>();

    
    public int originalMipmapLevel;
    [ReadOnly]
    public float currentSize;
    [ReadOnly]
    public int applyingLevel;
    [ReadOnly]
    public Vector2[] mipmapRanges;

    private float originalSize;

    private void Reset() {
        if (_sRenderer == null) _sRenderer = GetComponent<SpriteRenderer>();
    }

    private void Awake() {
        for (int i = 0; i < halfMipmapSpriteList.Length; i++) {
            spriteNameToSpriteDic.Add(halfMipmapSpriteList[i].name.GetHashCode(), halfMipmapSpriteList[i]);
        }

        originalSize = _sRenderer.sprite.rect.size.x;
        
        int totalLength = originalMipmapLevel + originalMipmapLevel - 1;
        float unitSize = originalSize / totalLength;
        
        float[] sizes = new float[totalLength];

        float tempSize = originalSize;
        for (int i = sizes.Length - 1; i >= 0; i--) {
            if (i % 2 == 0) {
                sizes[i] = tempSize;
                tempSize = tempSize * 0.5f;
            } else {
                sizes[i] = (tempSize + tempSize * 2) * 0.5f;
            }
        }

        mipmapRanges = new Vector2[totalLength];
        float midSize = 0;
        for (int i = 0; i < mipmapRanges.Length; i++) {
            float tempNewMidSize = 99999;
            if (i + 1 < mipmapRanges.Length) tempNewMidSize = (sizes[i] + sizes[i + 1]) * 0.5f;
            mipmapRanges[i] = new Vector2(midSize, tempNewMidSize);
            midSize = tempNewMidSize;
        }

 

 

        GameManager.gameResolutionChangeDGT += OnResolutionChangeEvent;
        GameManager.mainCameraManageUpdateDGT += OnResolutionChangeEvent;


    }


    private void OnDestroy() {


        GameManager.gameResolutionChangeDGT -= OnResolutionChangeEvent;
        GameManager.mainCameraManageUpdateDGT -= OnResolutionChangeEvent;

 


    }

    
    private void OnResolutionChangeEvent() {
        Vector2 spriteSize = _sRenderer.sprite.rect.size;
        Vector2 pixelSize = spriteSize / _sRenderer.sprite.pixelsPerUnit;
        
        Vector3 world_size = pixelSize;
        world_size.x *= transform.lossyScale.x;
        world_size.y *= transform.lossyScale.y;

        Vector3 screen_size = 0.5f * world_size / Camera.main.orthographicSize;
        screen_size.y *= Camera.main.aspect;

        Vector3 in_pixels = new Vector3(screen_size.x * Camera.main.pixelWidth, screen_size.y * Camera.main.pixelHeight, 0) * 0.5f;

        currentSize = in_pixels.x;// / spriteSize.x * originalSize;
    }

    private void LateUpdate() {
        int hash = _sRenderer.sprite.name.GetHashCode();
        if (spriteNameToSpriteDic.ContainsKey(hash)) {
            for (int i = 0; i < mipmapRanges.Length; i++) {
                if ((currentSize >= mipmapRanges[i].x) && (currentSize <= mipmapRanges[i].y)) {
                    applyingLevel = i;
                    if (applyingLevel % 2 == 1) {
                        _sRenderer.sprite = spriteNameToSpriteDic[hash];
                        
                    }
                    break;
                }
            }
        }

    }

}

 

 

 


사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

  1. 스파인 텍스쳐 런타임 색칠하기

    Date2022.09.02 Category게임 By조루나 Views234
    Read More
  2. 블렌더 맛보기

    Date2022.07.21 Category비주얼 By조루나 Views288
    Read More
  3. 파티클 메쉬와 Optimize Mesh Data의 저주

    Date2022.07.14 Category게임 By조루나 Views224
    Read More
  4. 유니티 2D(2.5D) 타일 에셋 - Super Tilemap Editor

    Date2022.07.06 Category게임 By조루나 Views272
    Read More
  5. 유니티 컬러 스페이스와 스파인 HSL 색 변경의 역습

    Date2022.07.06 Category게임 By조루나 Views448
    Read More
  6. 앱 이름에 따라 프레임이 다르게 나온다...

    Date2022.06.21 Category게임 By조루나 Views219
    Read More
  7. 유니티 스파인 슬롯에 HSL 색상 변경(=포토샵 Colorize)

    Date2022.05.13 Category게임 By조루나 Views403
    Read More
  8. 크기의 1~5 나타내는 액체용기 픽토그램

    Date2022.04.07 Category비주얼 By조루나 Views216
    Read More
  9. 배경 하늘 경계선이 마음에 안 들어서 그래디언트 추가

    Date2022.03.31 Category게임 By조루나 Views247
    Read More
  10. Shader를 적용 시킨 UI에 ZWrite가 On 되어 있으면 안되나?

    Date2022.03.29 Category게임 By조루나 Views227
    Read More
  11. 유니티 Spine 셰이더 고쳐서 부위별 Hue-Shift 적용시키기

    Date2022.03.10 Category게임 By조루나 Views275
    Read More
  12. 유니티 URP에 쓸 투명 원 쇼크 웨이브

    Date2021.12.27 Category게임 By조루나 Views294
    Read More
  13. 한붓 그리기 경우의 수 계산

    Date2021.10.20 Category게임 By조루나 Views326
    Read More
  14. 터렛 관절 무-빙-

    Date2021.07.23 Category게임 By조루나 Views341
    Read More
  15. 게임에 한 붓 그리기 퍼즐을 넣고 싶다길래...

    Date2021.07.15 Category게임 By조루나 Views305
    Read More
  16. 2D 쿼터뷰 타일 게임을 3D처럼 해달라잖아!

    Date2021.05.27 Category게임 By조루나 Views386
    Read More
  17. 2D 쿼터뷰 게임의 스프라이트 Sorting Order 정렬 방법

    Date2021.04.30 Category게임 By조루나 Views415
    Read More
  18. 스크롤러 에셋과 VerticalLayoutGroup의 저주

    Date2021.03.10 Category게임 By조루나 Views365
    Read More
  19. 스프라이트 하프 밉맵

    Date2020.11.20 Category게임 By조루나 Views341
    Read More
  20. 3D 입문2. Mixamo 애니메이션으로 날로 먹기

    Date2020.11.10 Category게임 By조루나 Views381
    Read More
Board Pagination Prev 1 2 3 Next
/ 3