크래시의 원인: 애드몹은 유니티 메인 Thread가 아닌 별도의 Thread에서 돌아가기 때문에 Callback에서 TMPro 등 유니티 요소를 건드릴 경우 에러가 뜨며 앱이 꺼진다. 유니티 요소는 메인스레드에서만 건드리는게 원칙(?)이기 때문이다.

 

해결책: 보상 받는 admob 의 콜백 또는 AdClosed() 콜백에서 바로 건드리지 말고, 

아래 코드처럼 0.1f 초 딜레이를 준다.

 

// 애드몹 내부의 콜백메서드

void OnAdFullScreenContentClosed(){
      StartCoroutine(GetReward());
}

// 딜레이 줘서 유니티 메인스레드로 합류되도록 
IEnumerate GetReward(){

     yield return new Wait(0.1f);

    // 이후 보상처리 ( 게임 코드)
    popup.gameObject.SetActive(true); // 등등
}

 

 

 

 

Google play console에서 google play games service 설정 중, google cloud를 이용한 OAuth 사용자 동의화면 구성을 했음에도 플레이 콘솔 단계가 안넘어가는 경우의 해결책.

 

 

 

구글계정 여러개 로그인 돼있는 경우, 구글 콘솔 개발자 계정만 로그인하고 나머진 로그아웃해라. (크롬에서도)
구글 콘솔에서 개발자 계정 로그인된 경우에도 구글 클라우드 넘어가면서 메인계정으로 바뀌어서 제대로 진행이 안되기 때문이다.

 

타 계정 로그아웃 후 진행하면 아래스샷의 네모를 누르면 자동으로 동의화면 OAuth 가 생성되고 순조롭게 진행된다.

구글의 계정전환이 문제였다.

 

 

 

이후 Refresh(새로고침) 누르면 해결.

 

 

구글플레이게임즈 전반적인 인증 및 세팅 방법은 이 영상을 참고하자

 

https://www.youtube.com/watch?v=0AtXxdvdKcQ 

 

[GPGS 세팅할때 도움되는 참고 링크]

https://developer.thebackend.io/unity3d/guide/federation/gpgs/

https://github.com/playgameservices/play-games-plugin-for-unity

 

사용자 동의화면(OAuth consent screen) - Scope 설정할때 위의 것들이 안뜨는 경우 해결책이다.

 

1) Enable API & services 로 들어간다음

2) 상단에 +ENABEL API AND SERVICES 클릭 후, 

3) 아래쪽에, 구글 플레이 게임즈 누르고 활성화 하면,

4) OAuth consent screen 설정(edit) 다시 들어가서 scope 에 뜬다.

 

 

 

스크립트 파일은 꼭 유니티 에디터 안에서만 이동시켜야한다.

윈도우 탐색기나 비주얼 스튜디오 등 외부에서 스크립트 파일을 이동하는 경우 유니티 내부의 연결구조가 끊어져 missing script 가 뜨게된다. 

이때 해당 스크립트 붙은 오브젝트, 프리팹을 찾아 일일이 다시 연결해야하는데 상당히 번거롭다.

꼭, 유니티 안에서만 스크립트 파일을 이동시키자

 

 

분명히 PlayFabSharedSettings 에 입력 제대로 했는데 에러가 뜨는경우 해결법

 

상단 메뉴 - Edit - Project settings - Editor - Enter Player mode Option을 끄고 컴파일 후 실행해본다.

 

뭔가가 리프레쉬가 되지 않아 생기는 문제로 보인다. 뭔가 원인을 알수없는 문제의 상당수가 플레이 모드 옵션에서 생기는것 같다. 

 

또 A Native Collection has not been disposed, resulting in a memory leak 에러도 플레이모드와 연관 있는게 아닌가 의심된다.

 

 

주로 2D sprite 애니메이션 전환할때 헤메는 부분이다.

 

애니메이션 트랜지션(전환)에서 Exit time 이라고 적힌건 초(sec)가 아니라 애니메이션 클립 길이의 퍼센티지(%) 비율이다.

위 짤에서 attack에서 walk로 넘어가는데 Exit time이 1이란 것은 attack 클립의 전체를 보고 walk로 넘어가겠다는 의미이다.

이 값이 0.75 면 attack 클립의 뒷부분 25%는 짤리고, 1.25 면 attack 클립이 한번 + 첫부분 25% 추가로 재생된 후 전환된다.

초(sec)로 이해해서 많이 헤맸으나, normalized time 이란거 보고 뒤늦게 깨달음. 한동안 안하면 또 까먹을거같다

 

 

 

 

유니티

SendMessage cannot be called during Awake, CheckConsistency, or OnValidate (back: OnCanvasHierarchyChanged)

이라는 경고 메시지가 게임 Run 할때마다 발생함(에디터 상에서)

 

본인은 캐릭터 hp 바를 별도의 Canvas 에 각각 넣어줬는데 그 Canvas 의 overrideSorting 체크하니까 경고 사라짐

얼떨결에 해결

 

 

이번에 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

 

 

 

 

 

 

 

엑셀파일에 대고 마우스 우클릭 - excelAssetScript 생성한 다음 열어보면

 

public List<Entities> Sheet1  이런 줄이 있는데 Sheet1 부분을 엑셀파일의 실제 sheet 네이밍과 맞춰야한다.

기본 네이밍이 Sheet1 이라 안바꿨으면 코드도 그대로 둬야한다.

 

변수명 습관적으로 바꾸다가 로드 안돼서 삽질하다가 해결

 

 

 

#유니티

unity 

 

내 경우에는 에디터상에서는 별 이상없었으나 안드로이드 빌드한 경우 위의 경고메시지가 뜨면서 로딩이 작동하지 않았다. 몇가지 해결책을 정리해본다.

 

1) 세이브파일 삭제하고 다시 세이브

https://docs.moodkie.com/easy-save-3/es3-api/es3-methods/es3-deletefile/

 

2) 수동 레퍼런스 추가

유니티 프로젝트 뷰에서 해당 파일들 다 선택한후 우클릭 -> Easy save3 -> Add references to manager

원래 자동으로 파일참조를 업뎃하는데 문제가 발생했기에 수동으로 추가해주는 과정이다. 안드로이드 에러는 이걸로 해결했다.

 

3) 이지세이브 포럼에서 검색

https://moodkie.com/forum/search.php?keywords=Reference+with+ID+could+not+be+found

영어가 된다면 직접 문의하거나 다른사람의 사례를 참고하면 좋다

 

 

유니티 내장 Pool을 쓰면서 재사용 시 초기화 순서가 많이 헷갈려 원하는대로 컨트롤이 힘들었다.

로그를 찍어가면서 확인한 결과 알게된 것을 정리해본다.

 

[최초 생성 시] ObjectPool.Get()   Awake() OnEnable() ActionOnGet() Start()

 

[재활용 시] ObjectPool.Get() ActionOnGet() 안에서 gameObject.SetActive(true)하면 즉시 OnEnable()

 

유니티에서 setActive(true) 호출하면 OnEnable()이 호출되는 것을 알고있어야한다.

최초생성시에는 Get()과 동시에 생성되면서 gameObject의 awake -> OnEnable 사이클을 타지만,

재활용 시에는 ActionOnGet 먼저 호출되고 그 안에서 SetActive() 호출 시 -> OnEnable()이 호출되는 흐름을 타게된다. 최초생성시와는 다르게 이미 생성된 오브젝트를 재사용하는거라 Start()는 호출되지 않는다.

물론 이 순서도 ActionOn--() 안에서 SetActive()을 쓰지 않으면 바뀐다.

 

대개 ObjectPool.Get() 이후에 transform pos나 rotation 값을 넣어주는데 이 부분은 사이클의 맨 마지막에 들어오기 때문에 ActionOnGet(), OnEnable()에서 아무리 바꿔도 소용이 없는 것이다.

 

아래 코드를 보자.

 

 

 

Pool.Get() 에서 연달아 호출되는 메서드에서 position을 정해도 다음 줄에서 Vector3.zero로 바뀌는 모습이다.

주의해서 사용하자

 

 

 

 

 

 

#unity

유니티 허브에 프로젝트를 열거나 Program files 에 설치된 유니티 에디터를 직접 열려고 시도해도 아무런 반응없이 로딩 원만 빙빙돌다 무반응되는 경우가 있다. 아무런 에러메시지도 없어서 해결하기 난감하다.

 

라이센스 문제일 확률이 매우 높다

 

유니티 허브 -> 톱니바퀴 -> 라이선스 에서 새로고침을 눌러본다. 새로고침 실패가 뜬다면

추가 -> 무료 라이센스 받기를 눌러보고 껐다켜기를 반복하다보니 갑자기 라이선스 새로고침이 되고 프로젝트도 잘 열 수 있었다. 에러메시지 없이 안열리는 경우 라이선스를 확인해보자. 인터넷 없는 환경에서 열려고 시도했을때 라이선스가 꼬인게 아닌가 생각된다. 별거 아닌데 원인을 몰라 삽질 후에 작성

 

 

 

#unity

particle/standard unlit 셰이더가 검은색부분을 알파채널로 인식하기 때문에 일어나는 현상이다.

 

해당 파티클 머티리얼을 선택한 후 Shader를 Alpha Blended로 해주면 된다.

 

유니티 파티클 제작중에 선택된 파티클 오브젝트를 재생시키면 경계(테두리)에

주황색 라인이 굵게 생겨, 제대로 알아보기 힘들때가 있다.

 

이때 유니티 씬뷰 오른쪽 위 기즈모 버튼을 눌러 Selection Outline 체크 해제하면 된다.

이제 파티클 편집이 수월해졌다.

 

#unity

 

유니티 공식문서에 의외로 상당히 좋은 내용이 있어 공유한다.

아래와 같은 내용을 포함하고 있다. 

 

  • 배열에서 랜덤항목 선택
  • 확률이 다른항목 선택(각각 숫자 지정 후 확률 배정)
  • 연속 랜덤 가중치 지정( Animation curve 이용)
  • 리스트 순서 섞기 (셔플)
  • 아이템 집합에서 중복없이 선택
  • 공간 안의 랜덤 포인트( 큐브 안의 랜덤한 점 선택, 원 안의 랜덤 점 선택)

 

이미 많이 쓰던것부터 생소하지만 효율적인 방법까지 전부 나와있으므로

덱빌딩게임 혹은 랜덤이 필요한 모든 게임에 유용하게 쓰일 것 같다.

 

 

https://docs.unity3d.com/kr/2019.4/Manual/RandomNumbers.html

 

랜덤 게임플레이 요소 추가 - Unity 매뉴얼

여러 게임에서 임의로 선택되는 항목 및 값은 중요합니다. 이 섹션에서는 Unity에 내장된 랜덤 함수를 사용하여 일반적인 게임 역학을 구현하는 방법에 대해 알아봅니다.

docs.unity3d.com

 

 

 

#unity

 

특정 아이콘 등 선택된 자식을 앞으로 나오게 해야하는데 순서를 바꾸면 실제 레이아웃(grid ,horizontal 등) 내의 위치마저 바뀌는 문제가 생긴다.

 

이때는 자식에 Canvas 컴포넌트를 붙여주고 Override Sorting 을 체크해준 후 Order in Layer를 스크립트 등으로 sort를 컨트롤 해주면 된다. 즉, Canvas - layout 오브젝트 - 자식(Canvas)

 

Layout이 붙어있는 부모의 자식(icon이라고 가정)에 Canvas를 붙여주면 그 자식의 자식들도 자동으로 부모인 icon을 따라서 sort 된다.

 

** 버튼 등 상호작용을 위해 아래 그림과같이 Graphic Raycaster도 오브젝트에 붙여줘야한다.

 

 

 

https://www.reddit.com/r/Unity3D/comments/7psox8/ui_element_render_order_in_grid_layout/

 

 

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

디버깅 용도로 좋다.

using System.Reflection;

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

에러메시지 뜰때 해결법

 

1. 유니티를 끈다

2. 프로젝트 폴더/Temp/  안에있는 PropertyDatabase_ 로 시작하는 파일을 지운다

3. 유니티 재실행 하면 메시지가 사라져있다.

 

 

https://forum.unity.com/threads/the-property-database-library-search-propertydatabase-db-is-already-opened.1285634/

해상도에 대응하는 코드는 여러 블로그에 있는데, 적용하던 중 레터박스 쪽에 파란색으로 깜빡거리는 현상이 발생했다.(테스트 기종: 갤럭시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 문제도 해결되었음을 알수있다.

 

 

 

구글 플레이 콘솔에서 올릴때 유니티 프로젝트 세팅에서 Version 숫자 바꿨음에도 계속 이 메시지가 뜨면서 앱번들 안올라갈 때가 있다. 아주 빡치는데 해결책은 아래와 같다

 

Project Settings - Player 탭 - 안드로이드 아이콘 - Other settings 에서 쭉쭊 내리다보면 Identification - Version과 Bundle version Code가 있는데 둘다 바꿔보자.

이동(doMove)나 회전(doRotate) 등 모든 Do 시리즈 tween에 적용가능함

 

보통 오브젝트를 이동시키고 Tween 의 onComplete() 를 람다함수로 해서 다음 단계를 진행하곤 했는데,

tween.WaitForCompletion() 의 존재를 알고나니 코루틴과 결합하여 거의 모든 움직임을 손쉽게 구현할수 있게 되었다.

 

적을 이동시킨 후 공격을 하게한다고 하면,

IEnumerator MoveAndAttack(){
	var tween = enemy.transform.DOMove(pos, 0.3f);
    yield return tween.WaitForCompletion();
    enemy.Attack();
}

public void ButtonClicked(){
	StartCoroutine(MoveAndAttack());
}

이렇게 원하는 포지션(pos)로 이동 tween 완료시까지 대기(WaitForCompletion) 후, 원하는 작업을 처리하도록 하면

코드가 아주 깔끔해지고 람다함수를 쓰면서 겪는 호출순서나 scope 문제 등 복잡한 문제를 겪을 필요도 없다.

아주 아주 삶의 질을 높이는 두트윈 활용법! WaitForCompletion() 를 애용하도록 하자.

 

다른사람 프로젝트 열고 패키지 매니저에서 시네머신 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에 쓰는경우는 추가해야 하는듯.

 

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

 

 

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

vs2019, vs2022 둘다 적용됨

 

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

 

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

 

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

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

 

[*]
charset = utf-8-bom

 

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

 

 

+ Recent posts