유니티용 vscode 셋팅 다 끝났다고 가정했을때 

 

while 이나 for 문의 자동완성 제안(suggestion)의 우선순위가 이상하게 되어 탭 눌러도 자동완성이 안되는 경우가 있다

아래 사진처럼 while 키워드 라고만 뜨는데 자동완성은 두번째의 While loop 라는 메뉴가 해주기 때문에 우선순위 설정이 잘못되어 자동완성을 쓸 수가 없었다.

 

해결책은 vscode의 설정(ctrl + , )의 검색창에서 editor.snippetSuggestions 라고 검색하면 나오는 항목에서

inline(기본값)으로 돼있는걸 top 으로 바꾸면 된다.

 

"editor.snippetSuggestions": "top"

 

자동완성이 최상단에 위치해있다. 해결 완료

 

이미지 선택창 미리보기에 이미지가 안뜨는 현상이 유니티에 나타나서 매우 불편을 겪던 중 

구글링하다 우연히 해결책을 발견함. 속이다 시원해서 공유차 올림

 

 

<해결책>

 

1. 프로젝트 뷰에서 아래 이미지처럼 도형 세개있는버튼 클릭 후, Sprite 선택

 

 

2. 프로젝트 뷰에 나온 Sprite 들 전부선택 ( 컨트롤 + a) 

- Sprite외에 다른 에셋이 섞이면 안됨(1번을 한 이유)

 

3. 왼쪽 인스펙터에서 점 3개짜리 버튼 클릭 후 Reset 

 

4. 이미지 선택창 띄워보면 모든 이미지가 전부 나타나 있음. 해결!

 

 

* 주의!!! 대량의 에셋을 한번에 리셋하기 전에 한두개로 꼭 테스트해봐야함. 후회할수 있음

 

출처 및 이미지 출처

https://discussions.unity.com/t/sprite-previews-are-missing-throughout-project/246363

유니티같이 큰 파일이 있는 프로젝트를 깃헙에 푸쉬할때 문제가 생기는데,

 

터미널 or CMD 로 해당 프로젝트 폴더로 이동 후,

git config http.postBuffer 524288000

입력.

해보고 문제가 해결된다면 글로벌로 설정

git config --global http.postBuffer 524288000

이후 다시 Push 시도하면 좀 긴 딜레이가 걸리나 십더니 순간 푸쉬에 성공한다.

 

https://stackoverflow.com/questions/15240815/git-fatal-the-remote-end-hung-up-unexpectedly

 

 

해결이 안되는 경우)

github 클라이언트 사용중이라면 Help -> Show log  메뉴로 로그를 확인하다보면 여러가지 에러메시지를 볼수있으니 복붙으로 구글링해보자.

 

 

유니티에서 앱 자동업데이트 (AppUpdateManager) 기능 통합하려할때 발생.

 

해결책 (solution)

 

필드 초기화에 딜레이를 주면 된다.

The error has disappeared, when I make some delay by coroutine before the initialization. After the loading of the scene completed.


Ienumberator Init(){
    yield return new Wait(0.5f);

    AppUpdateManager   aum = new AppUpdateManager();
}

 

이 부분을 코루틴으로 wait 딜레이를 줘 씬 로딩완료된 다음 호출하면 에러가 사라진다.

 

 

 

https://developer.android.com/guide/playcore/in-app-updates/unity?hl=ko&authuser=1

 IEnumerator checkInternetConnection(Action<bool> action){
     WWW www = new WWW("http://google.com");
     yield return www;
     if (www.error != null) {
         action (false);
     } else {
         action (true);
     }
 } 
 void Start(){
     StartCoroutine(checkInternetConnection((isConnected)=>{
         // handle connection status here
     }));
 }

https://answers.unity.com/questions/567497/how-to-100-check-internet-availability.html?childToView=744803#answer-744803

 

이번에 mediation 도입하면서 삽질한 내용 정리.

 

1. 빌드시 아래 에러메세지 뜨면서 빌드가 안되는 현상 

The SDK has resolved to an incompatible version with the Package. 어쩌구... include mainTemplate.gradle file by ...

일단 캔슬 빌드 누르고,

 

 

2. Edit > Project settings > Player > publishing setting에 들어가서 아래 스샷처럼 main Gradle 과 custom gradle properties templet 체크해주기 (파란 네모)

 

 

3. 위 스샷의 빨간네모의 경로의 gradleTemplate.properties 파일을 열어서 아래 내용 있는지 확인. 없으면 추가하고 저장

 

android.useAndroidX=true
android.enableJetifier=true

 

4. 이후 빌드시 exception 뜨면서 빌드가 중지되는데 에러메세지 잘 읽어보면 아래와 같은 내용이 나오는 경우의 해결책에 해당한다. 클래스가 중복된다면서 UnityAds 가 엄청 많이 겹치나보다... 

 

Execution failed for task ':launcher:checkReleaseDuplicateClasses'."

 

5. [해결책] 패키지 매니저에서 설치된 구형 Advertisement 를 remove 해야한다!!! (mediation 아닌 그냥 ad)

 

6. 일단 나는 둘다 삭제하고Advertisement with Mediation 만 다시 설치했다

 

7. 그 후에 유니티 상단 메뉴에서 Asset-> External Dependency manager -> android -> resolve 예의상 돌려주고 빌드하니 문제해결!

 

.

.

.

신형 광고인 미디에이션과 구형 광고의 클래스들이 충돌해서 벌어진 일인것 같다. Service - Ads 에 Install 패키지 떡 하니 써 놓아서 마치 무조건 설치해야하는 인상을 주는데 알고보니 역대급 함정... 무개념 유니티 하....

 

어쨌든 오늘도 해결했다.

 

 

<참고 링크>

https://stackoverflow.com/questions/69736807/gradle-failed-to-fetch-dependencies-for-unity-mediation-firebase-and-google-pl

https://answers.unity.com/questions/1711904/android-apk-build-failing-execution-failed-for-tas.html

 

 

 

 

 

 

 

아래와 같이 로그를 찍으면 현재 클래스명과 함수명을 출력해준다. 

디버깅 용도로 좋다.

using System.Reflection;

void Start()
{
	Debug.Log(this.GetType().Name + ": " + MethodBase.GetCurrentMethod().Name);
}

해상도에 대응하는 코드는 여러 블로그에 있는데, 적용하던 중 레터박스 쪽에 파란색으로 깜빡거리는 현상이 발생했다.(테스트 기종: 갤럭시s10)

첫 실행시에는 문제없어도 백그라운드로 내리고 다시 키면 깜빡임 현상이 재현되는 경우도 있었다.

 

검색 중에 아래 블로그를 발견

https://blog.naver.com/kj426/222131335427

 

읽어보면 URP에만 나타나는 문제같다.

 

적용 방법

1. 카메라에 스크립트 하나 생성 후, 위 블로그 코드를 붙여넣는다.
2. Start() 함수 안에 onSetting() 을 넣어준다(작성자가 깜빡한듯? ) 

<이하는 내 Canvas 세팅>

3. Canvas 오브젝트에 Canvas Scaler를 붙여주고, mode를 Scale with screen size,
레퍼런스 resolution을 내가 개발할때 켜두는 기준 화면해상도로 변경. Match는 가로게임인 경우 Height로 설정
4. Canvas Render mode를 Screen Space - Camera로 설정해줌

 

빌드 후 실행해보면 해상도 대응되면서 flickering 문제도 해결되었음을 알수있다.

 

 

 

 

    public static GameManager I { get; private set; }
    private void Awake()
    {
        if (I == null)
        {
            I = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else
        	Destroy(this.gameObject);
        
    }

 

싱글톤 코드가 길면 복잡해서 최대한 짧게 씀. 

 

다른사람 프로젝트 열고 패키지 매니저에서 시네머신 install을 함.

게임은 제대로 플레이되는데 vs상에서 시네머신 인식이 빨간줄 뜨는경우의 해결책임.

 

1. 비주얼 스튜디오를 닫는다.

2. 하이어라키에 virual camera 하나 생성한다(cinemachine 메뉴에서)

3. 생성한 virtual 카메라에 새 스크립트 하나 생성하고 더블클릭해서 연다.

4. using Cinemachine; 하면 문제없이 인식됨

5. 에러뜨던 스크립트에서도 빨간줄 사라진걸 확인(이후 버추얼 카메라와 위 생성한 스크립트 삭제해도 에러 없음)

 

원리는 모르겟는데 문제는 해결됨. 

 

public class LODChange : MonoBehaviour
{
    [MenuItem("Component/LOD/Set Default LOD Range", false, 0)]
    static void DoSetDefaultLODRange()
    {
        var list = Selection.GetFiltered<GameObject>(SelectionMode.TopLevel);
        foreach (var go in list)
        {
            var d = go.GetComponent<LODGroup>();
            if (null != d)
            {
                var lods = d.GetLODs();
                lods[0].screenRelativeTransitionHeight = 0.05f;
                lods[1].screenRelativeTransitionHeight = 0.01f;
                d.SetLODs(lods);
                PrefabUtility.RecordPrefabInstancePropertyModifications(d);
            }
        }
    }
}

 

일단 소스코드를 보자. 코드는 new script로 새 스크립트 만든다음 붙여넣기 하면 된다.

컴파일하면 유니티 에디터 위에 Component/LOD/Set ~ 라는 메뉴가 생긴다. [MenuItem()] 에서 보이는 것처럼 말이다.

내용을 대충보면 Selection.Getfilterd 이므로 하이어라키에서 선택된 놈들 중 GameObject인걸 가져오는데 Toplevel 즉 자식은 제외하고 부모만 가져오겠다는걸로 보인다.

foreach 문을 돌면서 가져온 gameObject의 원하는 컴포넌트를 원하는 대로 수정해서 프리팹이면 수정내역을 저장하겠다 이런 말인것 같다. 

 

사용법: 바꾸고싶은 게임오브젝트를 다중선택 한 후 메뉴를 클릭하면 된다.

 

아주 간단한 코드지만, 아주 많은 gameObject를 한번에 바꾸고싶을때 일일이 노가다하지 않아도 되어 상당히 유용하게 쓰일수 있겠다.

 

https://forum.unity.com/threads/editing-multiple-lod-prefabs-at-once.257156/

 

 

 

3d텍스트메쉬프로 컴포넌트를 생성할때마다 제목의 메시지가 자꾸 뜬다.

위의 F 모양 아이콘이 폰트애셋 (.asset 확장자) 인데 이놈들이 밑줄_(underLine)을 포함하고 있지 않다는 건데...

 

그냥 폰트에셋을 다시 만드는게 좋다.

 

유니티 - window - TextMeshPro - font asset creator 클릭

 

위처럼 필요에 따라 대충 세팅. 영어와 숫자만 쓸거면 ASCII 문자셋으로 하고 렌더모드는 화질과 관련있는듯.. 직접 테스트해볼 것 (참고: 아스키 코드에도 밑줄underline이 포함되어 있다)

Generate font atlas 클릭 - Save as - 원하는 이름 정하고 저장

 

폰트에셋 만드는 법을 모르면 구글링으로 간단하게 알아보고 해도 좋다

 

빨간네모처럼 내가만든 폰트에셋을 textmeshpro 오브젝트 안에 넣어주기

 

결과인데 위처럼 나와서 기존의 검은 outline 이 사라짐. 고쳐보자

TMP 적용 오브젝트 클릭 - 아래부분에 머티리얼 - Shader 부분을 빨간 네모처럼 Mobile 경로안의 distance Field로 바꿔준다 (기본 폰트에셋에 이거였는데 새로 생성하면 mobile 경로가 빠지더라. 이유는 모름)

 

그럼 outline 체크 활성화됨 - 체크해주고 Face와 Outline 세팅을 네모같이 기본에셋의 수치로 맞춰주면 검은 테두리 복구 성공!

 

 

별거 아닌데 검색해도 안나와서 짜증.. 나던 찰나에 아래블로그에서 도움받아 해결

이렇게 폰트 만들기에도 익숙해지고 하는거지 뭐

 

https://www.create-forever.games/the-character-used-for-underline-is-not-available-in-font-asset/

 

The character used for Underline is not available in font asset [FONTNAME]. | Unity Indies

例えば数字だけのフォントを作成し、それを使用するとこんな警告が出ることがあります。 The character used for Underline is not available in font asset [FONTNAME]. この警告を消したい場合、2通りの方法

www.create-forever.games

 

 

유니티는 피벗 회전 처리하기가 까다로운것 같다.

캐주얼 게임에 쓰일법한 상자 굴리기는 과연 어떻게 만드는걸까?

 

부모 오브젝트를 이용한 피벗회전을 이용하면 되지만, 90도 한번만 굴리는게 아닌

지속적으로 굴리는건 어떻게 할까 궁금해져서 구현해봤다.

 

자식 cube의 원하는 방향의 아랫쪽 모서리에 새로운 gameobject 를 만들어 위치시키고 자식cube의 부모로 setParent() 해준다. 그리고 Dotween으로 부모를 굴려주면 끝. 그리고 항상 기존의 피벗인 부모는 삭제시킨다.

깔끔하게 해결되었다.

 

https://github.com/nectar3/CubeRotateTurn

 

GitHub - nectar3/CubeRotateTurn: d

d. Contribute to nectar3/CubeRotateTurn development by creating an account on GitHub.

github.com

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;


public class Rotation : MonoBehaviour
{
    public float rotSpeed = 1f;

    private Transform parent;
    float cubeHalf = 0.5f;

    bool turning = false;

    private void Start()
    {
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            TurnToX(1);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            TurnToX(-1);
        }
        else if (Input.GetKeyDown(KeyCode.W))
        {
            TurnToZ(1);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            TurnToZ(-1);
        }
    }

    void TurnToX(int right)
    {
        if (turning) return;
        turning = true;
        DestroyParent();
        GameObject go = new GameObject("Pivot_parent");
        parent = go.transform;
        parent.position = new Vector3(transform.position.x + cubeHalf * right, transform.position.y + -cubeHalf, transform.position.z);
        this.transform.SetParent(parent);
        parent.DORotate(new Vector3(0f, 0f, -90f * right), 0.3f)
            .SetEase(Ease.Linear)
            .OnComplete(() => turning = false);
    }
    void TurnToZ(int forward)
    {
        if (turning) return;
        turning = true;
        DestroyParent();
        GameObject go = new GameObject("Pivot_parent");
        parent = go.transform;
        parent.position = new Vector3(transform.position.x, transform.position.y + -cubeHalf, transform.position.z + cubeHalf * forward);
        this.transform.SetParent(parent);
        parent.DORotate(new Vector3(90f * forward, 0f, 0f), 0.3f)
            .SetEase(Ease.Linear)
            .OnComplete(() => turning = false);
    }

    void DestroyParent()
    {
        if (parent)
        {
            this.transform.SetParent(null);
            Destroy(parent.gameObject);
        }
    }
}

 

 

 

unity

 

이 미친 두트윈 하.. 

 

onComplete 을 OnComplete 으로 바꾸면 해결된다.

 

대소문자땜에 이 고생 해야겠니? 

 

 

 

https://www.youtube.com/watch?v=Mmb-j-Vg2Qs 

 

 

5min 게임즈의 brickscape를 보고 따라해봤다. 콜라이더 충돌처리하는것부터 회전하는것까지 전부 어려웠으나, 매일 조금씩이나마 진행시켜 대충 완성했다. 

 

아쉬운 점

raytracing을 box로 안하고 직선으로만 해서 겹치는게 처리 안될듯..

블럭을 일일이 수작업으로 배치해야 한다는점.

정수단위 위치로 고정이 안된다는점

블럭 옮길때 카메라가 살짝 움직이는 것(귀찮아서 안고침)

 

만드는 과정에서 자꾸 막혀서 짜증이 났지만 완성 후 bloom 맥이니까 때깔이 좋아서 만족스럽다.

 

 

 

 

 

 

https://github.com/nectar3/Brickscape_clone

 

GitHub - nectar3/Brickscape_clone

Contribute to nectar3/Brickscape_clone development by creating an account on GitHub.

github.com

 

 

VS2019 기준이지만 이후 버전도 같은 기능이 있으므로 비슷하게 찾아서 하면됨

 

매번 Debug.log() 쓰는데 신물이 나셨다고요? 

존나 많이쓰는데 유니티놈들은 이거하나 심플하게 못만들어서 화나십니까?

vs code는 있는데 vs community 는 지원 안하는거 같아서 억울하십니까?

 

여기 해결책이 있습니다!

 

1. 해당 경로에 첨부된 스니펫 파일을 넣습니다( 유저마다 다를수 있음)

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC#\Snippets\1042\Visual C#

 

2. vs2019 도구->코드조각 관리자(영어로는 snippets 어쩌고) -> 가져오기 해서 위 폴더의 스니펫을 추가해줍니다

 

3. 에디터로 돌아와서 lg 쓰고 탭 두번 누르면 짜자잔~ 인생 존나 편해지는 소리 들리시나요? 축하드립니다.

 

* 추가: snippet 파일을 메모장으로 까보면 <header> 아래 <Shortcut> 부분 있죠? 그거 원하는대로 바꾸시면 단축어 변경됩니다! lg 말고 꼴리는 대로 넣으세요!

 

***추가:  윈도우 권한이 없어서 스니펫 파일 수정이 안되는 경우

- 파일을 권한없는 곳으로 복사(ex 바탕화면) 하고 수정한 다음, vs 스니펫 경로로 복붙하면 된다.

 

debuglog.snippet
0.00MB

 

 

 

 

참조: http://ekhart.pl/index.php/2017/06/26/visual-studio-unity-debug-log-snippet/

IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerDownHandler

등을 상속받은 후 OnDrag 등 메서드를 구현해도 오브젝트 클릭시 호출이안되는 경우가 있다.

 

 

1. 메인카메라에 Physics Raycaster 컴포넌트를 추가하면 된다.
2. 각 GameObject엔 콜라이더가 있어야한다. 

이유는 모르겠지만 잘 호출된다. UI에 쓴 경우는 Physics Raycaster 없이도 잘 호출되지만 GameObject에 쓰는경우는 추가해야 하는듯.

 

메인카메라에 컴포넌트 추가

 

 

마우스 드래그에 따라 오브젝트 움직이는 코드

Candy Cruch sage clone project for practice

 

https://www.youtube.com/watch?v=m5Uq20I8Q5o 

 

https://github.com/nectar3/CandyCrush1

 

GitHub - nectar3/CandyCrush1: dd

dd. Contribute to nectar3/CandyCrush1 development by creating an account on GitHub.

github.com

 

아래 블로그를 참고하여 테트리스보다는 단순한 방식으로 구현.

캔디 내리는 코드(FillBlank() ) 는 블로그와 다른 방식으로 구현함

 

참고: https://gamedevelopertips.com/create-candy-crush-clone/

 

candy sprites: https://www.nicepng.com/ourpic/u2r5r5r5t4a9t4o0_download-candy-crush-saga-sprites-clipart-candy-crush/

 

 

vs2019, vs2022 둘다 적용됨

 

깃헙에 푸쉬했을때나, 유니티 인스펙터창(inspector) 에서 비주얼 스튜디오로 작성한 한글주석이 깨지는 경우가 있다.

 

이때 루트 디렉토리(.sln 파일 있는곳)에 .editorconfig 라는 이름의 파일을 만든후 본문을 아래와 같이 해주고 저장.

 

인코딩이 utf-8으로 지정된다. 이후 꼭 한번씩 해당 스크립트(.cs)를 변경 후 저장해야 적용된다.

본문에 스페이스바 한번 누르고 저장후 유니티 컴파일 한번 해주면 한글이 잘 뜨는걸 볼수있다.

 

[*]
charset = utf-8-bom

 

메모장에 붙여넣고 저장- 파일형식- 모든파일- 파일명 .editorconfig으로한 후 저장. 위의 루트 디렉토리에 배치하면 vs2019 에서 자동인식하여 확인창이 뜨는데 예 누르면 된다. 2022는 따로 확인창이 안뜨지만 자동으로 되는듯?

 

 

+ Recent posts