반응형

 

 

 

 

 

GitHub - realnity09/SpriteMeshGen

Contribute to realnity09/SpriteMeshGen development by creating an account on GitHub.

github.com

 

스프라이트의 Custom outline이나 Custom physics shape 정보를 바탕으로 Mesh를 생성하는 커스텀 에디터다.

렌더링 되는 에셋들은 2D지만 3D물리를 사용해야해서 만들게 되었다.

※ Mesh collider에 사용할 메쉬 데이터이기 때문에 uv 설정은 따로 하지 않았다.

 

 

 

에디터 경로

패키지를 임포트한 뒤, CustomMeshMesh generator를 클릭하면 Mesh generator 창이 열리는것을 확인할 수 있다.

 

 

에디터 설명

1. Target save path : Generate한 메쉬가 저장될 디렉토리를 설정한다.

2. Target sprite : 메쉬로 Generate할 스프라이트를 선택한다. (스프라이트를 선택해야 하단 설정이 활성화 된다.)

3. Target vertices

   - Physics shape : Custom physics shape 정점을 바탕으로 메쉬를 Generate한다.

   - Out line : Custom outline 정점을 바탕으로 메쉬를 Generate한다.

4. Thickness : 메쉬의 두께(Z축)의 수치이다.

5. Generate : 메쉬를 생성한다.

※ 스프라이트의 정점 정보를 수정했을 때, 기존 메쉬를 지웠다가 재생성 할 필요 없이 Generate 해주면 메쉬를 변경한 정점 정보 대상으로 업데이트 해준다.

※ 메쉬를 업데이트 했을 시, Scene에 적용되어있는 메쉬가 업데이트 전의 메쉬로 보일텐데 이건 해당 Scene에서 갱신이 안되서 그렇지 업데이트가 되지 않은것이 아니다. (Play 모드를 해주거나 Scene을 다시 열면 업데이트 된 메쉬로 확인이 가능하다.)

 

 

 

스프라이트 에디터

- 스프라이트 에디터에 대해서 잘 모른다면 다음 메뉴얼 참고

 

스프라이트 에디터 - Unity 매뉴얼

스프라이트 텍스처에 단 하나의 그래픽 요소만 있는 경우가 있으나 관련된 여러 그래픽스를 하나의 이미지로 합치는 게 더욱 편리할 때가 많습니다. 예를 들어 바퀴가 차체와는 독립적으로 움

docs.unity3d.com

 

- Physics shape로 메쉬를 생성하려 할 시, 스프라이트 에디터에서 좌측 상단 드롭다운 메뉴를 클릭한 뒤, Custom physics shape을 선택한다.

- Outline으로 메쉬를 생성하려 할 시, 스프라이트 에디터에서 좌측 상단 드롭다운 메뉴를 클릭한 뒤, Custom Oueline을 선택한다.

※ 정점을 배치한 뒤 반드시 우측 상단의 Apply를 눌러서 저장해야 정상적으로 메쉬가 Generate된다.

 

 

 

주의사항

- 스프라이트 에디터에서 Custom physics shape로 정점 생성 후, 메쉬를 Generate하면 메쉬가 비정상적인 모양으로 생성될 때가 있다. (Custom physics shape은 triangle 정보가 없기 때문에...)

※ Outline은 정점 위치 상관 없이 정상적으로 생성된다.

- 렌더링쪽 지식이 조금이라도 있으면 제대로 나오게 정점 위치를 수정할 수 있겠지만, 만약 지식이 없는 사람은 정상적으로 모양이 나올때까지 정점들 위치를 시계방향으로 한칸씩 돌려서 Generate하면 된다.

 

 

 

 

 

 

반응형
반응형

 

 

 

 

URP 프로젝트에서 Unity chan 모델을 사용하여 간단한 조작을 할 수 있는 게임을 만든후 빌드, 앱을 실행해봤는데 실행하자마자 앱 크래시가 발생했다.

 

로그캣을 확인해 보니 다음과 같은 크래시 로그를 확인할 수 있었다.

05-13 10:35:14.027 26023 26045 E CRASH   : #00 pc 000000000046afa8  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #01 pc 0000000000abbdec  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #02 pc 0000000000abbfec  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #03 pc 0000000000abbf6c  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #04 pc 00000000005cd30c  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #05 pc 00000000005cfd5c  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #06 pc 00000000004a6330  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #07 pc 00000000004a7138  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #08 pc 00000000004a7d4c  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #09 pc 00000000004a8934  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #10 pc 0000000000601904  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #11 pc 0000000000615cd4  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/lib/arm64/libunity.so (BuildId: 58c4416265a9495b)
05-13 10:35:14.027 26023 26045 E CRASH   : #12 pc 000000000000430c  /data/app/com.UnityTechnologies.com.unity.template.urpblank-KJ_9V9jr1KDZTayNFGuYCA==/oat/arm64/base.odex

뭔지는 자세히 모르겠지만 libunity.so가 눈에 띄고, 유니티짱 모델의 툰 쉐이더가 Experimental이라 너무 의심이 가서 1차로 유니티짱의 모델을 빼고 실행해보니 정상적으로 실행이 된다.

그리고 libunity.so 관련 크래시에 대해서 찾아보니 Vulkan 그래픽스 API 때문에 발생하는 에러라고 한다.

(다른 사람들은 Admob과 Firebase하고 그래픽스 API가 충돌된다고 하는데 쉐이더는 둘째치고 이런 서드파티 SDK가 충돌나는건 왜그런지 모르겠다..)

 

 

 

해결방법

1. EditProject SettingsPlayerOther SettingsRendering 카테고리에서 Auto Graphics API를 해제한다.

2. 해제를 하게되면 Graphics APIs를 설정할 수 있게 되는데, Default로 Vulkan, OpenGLES3 순서로 설정되어 있을 것이다.

3. 이 순서를 OpenGLES3, Vulkan 순서로 변경하거나 Vulkan을 삭제한다.

 

이렇게 변경한 뒤, 빌드해서 실행하면 안드로이드에서 문제없이 실행이 가능하다.

 

 

 

 

 

반응형
반응형

 

 

 

 

이전에 C로 퀵정렬을 구현한 글을 썼었는데, 육안으로 과정이 보이는 글이 아닌 코드만 작성되어있는 글이어서 유니티 C#으로 퀵 정렬 과정을 육안으로 확인할 수 있도록 제작해봤다.

만들면서 파티션 정렬하는 과정에서 high index가 파티션 배열의 범위를 벗어나는 버그가 있었는데, 단순히 조건문 순서상의 오류라 바로 수정했다. (생각보다 그 글이 조회수가 좀 됐는데, 글을 보신 분들이 문제 제기를 안했다는게 의아함)

 

 

 

 

1. 유니티 C# 퀵정렬 프로젝트

- 코드가 아닌 유니티 프로젝트로 올립니다. (깃허브)

 

GitHub - realnity09/QuickSort_CS

Contribute to realnity09/QuickSort_CS development by creating an account on GitHub.

github.com

 

 

 

 

2. QuickSort 컴포넌트 설명

- TargetArrSize : 배열의 길이를 지정할 수 있다.

- Min, Max : 배열 요소의 최소값과 최대값. (지정한 범위 안에서 랜덤 함수로 지정된다.)

- Delay : 정렬하는 속도 (값이 높을수록 느려집니다. WaitForSeconds값.)

※ Scene에 버튼 2개가 붙어있는데, Create arr 버튼으로 배열을 생성하고, Quick sort 버튼을 누르면 정렬이 시작되며 정렬 과정을 눈으로 확인할 수 있습니다.

low index - Red, high index - Blue, pivot index - cyan

※ 정렬이 완료되면 UI element가 초록색으로 변합니다.

 

 

 

3. 퀵정렬 설명

 

퀵정렬(Quick Sort) 구현

퀵정렬(Quick Sort) - 찰스 앤터니 리처드 호어가 개발한 알고리즘이다. - 평균 O(n log n)으로 매우 빠른 정렬속도를 자랑한다. - 기준(Pivot) 값을 기준으로 나머지 원소에 대해 대소관계를 비교하여 큰

srdeveloper.tistory.com

 

 

 

 

 

 

반응형

'Stack > Algorithm' 카테고리의 다른 글

문자열, 숫자 뒤집기  (0) 2021.10.16
퀵정렬(Quick Sort) 구현  (0) 2021.09.19
삽입정렬(Insertion Sort) 구현  (0) 2021.09.18
선택정렬(Selection Sort) 구현  (0) 2021.09.15
버블정렬(Bubble Sort) 구현  (0) 2021.09.14
반응형

 

 

 

 

 

1. 필레이트(Fillrate)

- 그래픽 카드가 초당 화면에 렌더링할 수 있는 픽셀의 수를 의미한다. (픽셀 처리에 대한 부담)

- 렌더링 해야하는 픽셀의 수가 많거나, 프래그먼트 쉐이더가 무거우면 래스터라이저 스테이지에서 병목이 발생하는데 이것을 필레이트 병목이라고 한다.

- 필레이트 = 픽셀 수 X 프래그먼트 쉐이더 복잡도 X 오버드로우

 

 

 

2. 확인 방법

- 해상도를 변경해서 프레임을 확인해보면 된다. (해상도를 줄이면 렌더링 해야할 픽셀 수가 줄어들기 때문)

 

 

 

3. 해상도를 줄이는 방법

3-1) 코드로 변경하기

- Screen.SetResolution() 메서드를 사용하여 해상도를 변경할 수 있다.

 

3-2) Project setting에서 변경하기(Android, iOS 한정)

- EditProject SettingsPlayer에서 Resolution and PresentationResolution Scaling에서 설정이 가능하다.

- Resolution Scaling Mode가 기본값(Disabled)으로 되어있는데 Fixed DPI로 변경하고 Target DPI 값을 설정해주면 된다.

- Target DPI : 1인치에 몇개의 화소가 들어가는가(수치가 낮을수록 해상도가 낮아짐)

 

 

 

 

※ 하지만 해상도를 줄이면 유저가 알아차리기 쉽기 때문에 업스케일 샘플링을 사용하는데 이 부분은 추후에 작성 예정.

 

 

 

 

 

반응형
반응형

 

 

 

 

보통 카메라 흔드는 기능에 대해 구글링을 해보면 Random.insideUnitCircle이나 Sphere로 카메라를 흔드는 코드를 많이 볼 수 있었다. 그런데 이런식으로 구성을하면 끊기면서 흔들리는(?) 느낌이 강하게 들어서 좀 더 찾아보니 관련된 에셋이 몇개 있었는데 받아서 뜯어보니 Mathf.PerlinNoise라는 노이즈 함수를 이용해서 카메라를 흔드는것을 봤다.

 

에셋에서는 위치 및 회전값까지 변경해서 건드리고있었는데, 회전값까지 변경하는 코드는 카메라 흔들림이 너무 정신없어서 전부 빼고 x, y 좌표만 변경하는 방법으로 코드를 바꿨다.

 

※ Perlin noise (펄린노이즈)

- 단계적 텍스처를 만들기 위해 개발된 노이즈 함수, 지형(마인크래프트 등)을 생성할 때 이용한다고한다.

- 위키 링크 (영어)

- 유니티 링크 (영어)

 

 

 

 

코드

using System.Collections;
using UnityEngine;

public class CamShake : MonoBehaviour
{
    [SerializeField]
    private float m_roughness;      //거칠기 정도
    [SerializeField]
    private float m_magnitude;      //움직임 범위

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake(1f));
        }
    }

    IEnumerator Shake(float duration)
    {
        float halfDuration = duration / 2;
        float elapsed = 0f;
        float tick = Random.Range(-10f, 10f);

        while (elapsed < duration)
        {
            elapsed += Time.deltaTime / halfDuration;

            tick += Time.deltaTime * m_roughness;
            transform.position = new Vector3(
                Mathf.PerlinNoise(tick, 0) - .5f,
                Mathf.PerlinNoise(0, tick) - .5f,
                0f) * m_magnitude * Mathf.PingPong(elapsed, halfDuration);

            yield return null;
        }
    }
}

※ roughness : 거칠기 정도, 카메라가 움직이는 동안 카메라의 떨림을 제어하는 수치이다. 값이 높아질수록 카메라가 움직이는 시간동안 많이 떨린다.

※ magnitude : 카메라 움직임 범위, 카메라가 움직이는 범위 수치이다.

※ tick : 펄린노이즈 함수에 들어갈 값이다. 초반에 랜덤으로 값을 설정하는 이유는 노이즈 함수에 들어가는 값을 다르게하기 위해서이다. (항상 같은 움직임으로 흔들게 하고싶으면 틱값을 랜덤이 아닌 고정값으로 초기화하면 된다.)

 

 

 

 

결과

 

 

 

 

 

 

 

반응형

+ Recent posts