전체 글 (114)

08
11

 

해당 글에서 사용한 라이브러리는 아래의 링크에서 확인할 수 있습니다.

https://github.com/Real-Serious-Games/Unity-Weld

 

GitHub - Real-Serious-Games/Unity-Weld: MVVM-style data-binding system for Unity.

MVVM-style data-binding system for Unity. Contribute to Real-Serious-Games/Unity-Weld development by creating an account on GitHub.

github.com

 

Bringing MVVM to Unity - Part 2: Property and event bindings

 

Bringing MVVM to Unity - Part 2: Property and event bindings

Do you need a better way to structure your Unity UI and reduce complexity? Are you looking for a cohesive way to coordinate the multiple parts of your UI? This series introduces Unity-Weld: an open source implementation of the MVVM design pattern that will

www.what-could-possibly-go-wrong.com

 

시작 전 정리하자면

View : 뷰는 UI 요소입니다. 버튼이나 글자 띄우는 UI같은걸 말합니다.

View Model : 뷰 모델은 뷰와 모델간 중개자 역할을 합니다. 뷰의 상태와 행동을 관리하고, 뷰와 모델 사이의 데이터 바인딩을 처리합니다. 


#1 데이터 바인딩이란?

  • 데이터 바인딩: UI 요소와 데이터 소스를 연결하여 데이터가 변경될 때 UI가 자동으로 업데이트되도록 하는 과정.

예를 들어, ListView와 데이터 컬렉션을 바인딩하면 데이터 변경 시 UI가 자동으로 갱신됩니다.

  • 변수 바인딩: 프로그래밍에서 변수를 선언하고 초기화하거나, 변수를 특정 값이나 객체에 연결하는 과정. ← 우리가 알고 있는 값 할당 느낌
  • 이벤트 바인딩: 특정 이벤트가 발생할 때 실행될 함수를 지정하는 과정. 예를 들어, 버튼 클릭 이벤트와 클릭 핸들러를 연결하는 것.

MVVM 왜 쓰는가 → UI 데이터 바인딩 하기 위해서

 


#2 One way property binding 단방향 프로퍼티 바인딩

예시 상황

MyViewModel1이라는 뷰 모델이 Text라는 프로퍼티를 가지고 있습니다.

이 Text는 Canvas에 있는 Text 컴포넌트에 있는 One Way Property Binding 컴포넌트로 바인딩되어 데이터가 갱신됩니다.

 

OneWayPropertyBinding = 단방향 프로퍼티 바인딩

→ text프로퍼티 변수(뷰 모델)를 바인딩해서 Text UI 뷰에 갱신시킴

 

사용 용도 : Text UI같이 UI 건드려서 변수가 수정 안되는 것들은 변수에 영향이 안가니까 단방향으로 설계하여 MyViewModel1이 프로퍼티(뷰 모델)를 수정하면 뷰로 전파되어 갱신됩니다.

이 바인딩으로 바인딩될 대상 뷰 모델은 INotifyPropertyChanged  인터페이스를 상속해야합니다.

이 인터페이스는 프로퍼티가 변할 때마다 이벤트 호출해서 뷰 모델과 뷰 간의 속성 동기화를 용이하게 합니다.

비슷한 매커니즘으로 WPF가 있습니다

 

[Binding] 이라는 속성을 변수 위에 선언해주면 해당 변수(프로퍼티)는 바인딩될 대상으로 바뀝니다.

대상 변수들은 set될 때 아래 예시처럼 OnPropertyChanged() 메서드 호출해서 갱신해줘야합니다.

[Binding]
public string Text
{
    get
    {
        return text;
    }
    set
    {
        if (text == value)
        {
            return; // No change.
        }

        text = value;

        OnPropertyChanged("Text");
    }
} 

#3 Two way property binding 양방향 프로퍼티 바인딩

예시상황

MyViewModel2라는 뷰모델이 Text라는 프로퍼티를 가지고 있습니다.

이 Text는 UI인 InputField에서 Two Way Property Binding 컴포넌트로 바인딩하고 있습니다.

따라서 InputField 수정사항이 Text로 푸시되고 Text에서도 InputField로 푸시됩니다.

 


#4 Event binding 이벤트 바인딩

예시상황

클래스 MyViewModel3에서 RotateCube()라는 함수 메서드를 가지고 있고 이를 버튼 UI라는 뷰가 바인딩하여 버튼 클릭시 바인딩한 이벤트를 실행합니다.

여긴 단방향 혹은 양방향 바인딩과는 다르게 INotifyPropertyChanged  인터페이스 상속 안했습니다. 이유는 이벤트만 바인딩할 예정이기에 프로퍼티가 변경되는걸 알 필요 없기 때문입니다.

 


#5 지금까지 배운걸 합치기

눈여겨볼만한건 Text가 양방향으로 InputField를 통해 수정되고 단방향으로 Text UI 뷰에 갱신되는 과정입니다.

이런식으로 서로 복합적으로 사용해서 바인딩을 활용하시면 될 것 같습니다.

COMMENT
 
08
10

 

안드로이드로 빌드시 생길 수 있는 오류입니다.

삽질한 방법들을 간단하게 모아봤습니다.

 


#1 JDK SDK NDK Gradle 경로 확인

Preferences -> External Tools탭에가시면 사진의 탭을 찾을 수 있습니다.

위 사진처럼 체크를 다 해주시고 경로 지정까지 제대로 되어있다면 노란색 경고가 안뜰겁니다.

노란색 경고가 뜬다면 SDK나 JDK나 등등 수동으로 설치하셔서 해당 경로에 넣어주면됩니다.

 

참고

https://note0913.tistory.com/328

 


#2 Library 폴더 삭제후 재부팅

 

프로젝트 폴더에 가보시면 Library 폴더가 있을겁니다. 과감하게 삭제하시고 다시 부팅해보시면 됩니다.

 


#3 Keystore 설정하기

제가 해결한 방법인데 첨에는 당연히 잘 되어있겠거니하고 무시했지만 혹시나하고 Keystore을 새로 만드니 해결했습니다.

Keystore은 ProjectSettings -> Player -> Publishing Settings 탭에 있습니다.

KeyStoreManager로 새로 키 만드시는거 추천드려요.

 


#4 모바일 종속성 삭제

여기서부턴 솔직히 안될 가능성이 크지만 기왕 삽질한거 같이 넣어봤습니다.

 

유니티 에디터상에서 왼쪽 상단 탭에서

Assets/Mobile Dependency Resolver/Android Resolver/Resolve 또는 Force Resolve 또는 Delete Resolved Libraries

탭을 눌러보시면 해결될 가능성이 있습니다.

다만 유니티 최신 버전은 이 Resolver 기능이 외부 에셋으로 빠졌기 때문에 수동으로 에셋을 다운하셔야합니다.

https://github.com/googlesamples/unity-jar-resolver  

위의 링크에서 OpenUPM으로 설치하시는 방법이 젤 빠릅니다.

 


#5 최소 API 레벨 높이기

이제부턴 막나가는식이긴합니다. 진짜 다 건드려보는거에요.

ProjectSettings -> Player -> Other Settings

탭에서 중간쯤 스크롤하시다보면 Minimum API Level 부분이 있는데 이걸 누르시고

가장 높은 레벨로 설정해보시면 됩니다.

그러면 해당 API가 없을 때 설치하라고 뜰텐데 누르시고 설치된다면 해결하신겁니다.

안된다면 수동으로 설치하시는 방법이 있습니다만 SDK API가 꼬일 가능성도 있고 그냥 포기하시는걸 추천드립니다.

그래도 도전해보시겠다면 아래 글 추천드려요.

https://devparklibrary.tistory.com/29

 


#6 에디터 삭제 or 버전 다운그레이드

솔직히 이렇게까지 했는데 안된다면 그냥 에디터 문제일테니 아예 에디터 버전을 바꾸시거나 다시 설치하시는걸 추천드립니다. 

폴더 경로

C:\Program Files\Unity\Hub\Editor

 

지금까지 정리한 내용으로 해결되셨길 바랍니다. 읽어주셔서 감사합니다.

COMMENT
 
07
13

유니티로 탑다운 방식 애니메이터를 구현하기 위해 8방향 BlendTree를 만들고 이를 다른 프리팹에도 사용해야했습니다.

처음에 오버라이드 컨트롤러 있는줄 몰라서 하나하나 다 복붙해서 만들었지만 혹시나 해서 찾았더니 있었네요.

애니메이터 또한 프리팹처럼 상속이 가능합니다.

프리팹 상속은 아래 글 확인 하기시 바랍니다.

https://kimyir.tistory.com/17

 


#1 오버라이드 하는 법

Project 탭 부분에서 원하는 폴더 빈공간에 우클릭하여

Create -> Animator Override Controller를 선택해줍니다.

 

생성 후 아래처럼 Controller 부분에 상속 부모가될 애니메이터를 선택해줍니다.

오른쪽 동그라미 버튼 눌러 선택해주시면 됩니다.

 

보다시피 상속된 애니메이터에 사용하고 있는 애니메이션 클립들을 할당하실 수 있습니다.

애니메이션 클립들만 따로 폴더 만드셔서 정리하시면 됩니다.

똑같은 역할의 토끼(예시)들은 다 같은 애니메이션 로직을 공유하게 되는것입니다.

이제 원본 애니메이터 컨트롤러와 동일한 로직을 사용하지만 원본 대신 새롭게 할당된 애니메이션을 재생합니다.

COMMENT
 
06
25

Sentinels는 ClearSky Studio에서 제작한 스팀 무료 플레이 히어로 슈팅 게임입니다.

  • UI 작업과 스팀 SDK 연결 작업을 맡았습니다.
  • 상점 기획과 레벨 디자인을 맡았습니다.
  • Json을 이용해 스팀에 데이터를 저장했습니다.
  • 무기와 캐릭터 해금 기능을 스팀 DB로 구현했습니다.
  • 순위, 퀘스트, 업적 기능을 스팀 DB로 구현했습니다.
  • 위 작업들로 인해 SteamWorks활용법과 UI를 구성하는 창의력을 기르는데 한몫하게되었습니다.

텀블벅 사이트

https://tumblbug.com/sentinels?ref=%EA%B2%80%EC%83%89%2F%EC%B5%9C%EA%B7%BC

 

2D 팀 대전 슈팅 게임, Sentinels

2D 팀 대전 슈팅 게임, Sentinels

www.tumblbug.com

 

스팀 페이지

https://store.steampowered.com/app/2399040/Sentinels/

 

Sentinels on Steam

Sentinels is a free-to-play hero shooter game created by ClearSky Studio. Master the powerful abilities of the various agent characters in the game and experience tactical squad play, fast-paced hero shooting and team deathmatch.

store.steampowered.com

 

COMMENT