블로그

  • [Unity3D] CS1617: Invalid option ‘latest’ for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.

    Unity 버전을 2018.4 로 업데이트 하고 나서 Visual Studio 2015 에서 다음과 같은 에러가 발생했습니다. 

    error CS1617: Invalid option ‘latest’ for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.

    LangVersion 값이 ISO-1, ISO-2, Default 혹은 1~6 사이의 정수 값 이어야 되는데 lastest로 잡혀 있다고 합니다.

    MS 공식 문서에는 latest 가 정의 되어 있지만 Visual Studio 2019 에 적용되는 규칙이라고 합니다. Visual Studio 2015 이후에 업데이트된 값인가 봅니다.

    https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/configure-language-version

    C# 언어 버전 관리 – C# 가이드

    프로젝트에 따라 C# 언어 버전이 결정되는 방법과 수동으로 조정할 수 있는 다양한 값에 대해 알아봅니다.

    docs.microsoft.com

    이 문제를 해결하는 방법들을 기록으로 남겨봅니다.

    1. Visual Studio 메뉴를 이용한 방법

    상단의 Project 메뉴에서 Assembly-CSharp Properties… 를 선택해 줍니다.

    Assembly-CSharp Properties 창 좌측 메뉴에서 Build 를 선택하고 우측 하단의 Advanced… 버튼을 클릭합니다.

    Advanced Build Settings 창을 열면 Language Version 값이 비어 있습니다.

    Language Version 값을 선택하면 사용 가능한 값 목록이 나옵니다.

    참고 

    Assembly-CSharp Properties 창이 열리지 않는다면

    Tools > Options > Tools for Unity > General 에서

    Access to project properties 옵션을 False 에서 True 로 변환 후 Visual Studio 재시작

    2. LangVersion 이 정의된 파일을 직접 수정

    프로젝트 경로의 Assembly-CSharp.csproj 파일안에서 텍스트로 같은 내용을 확인 할 수 있습니다.

    3. C# Script 에서 LangVersion 수정

    VSTU에서 만든 프로젝트 파일 사용자 지정

    VSTU에서 만든 프로젝트 파일 사용자 지정 – Visual Studio

    VSTU에서 만든 프로젝트 파일 사용자 지정Customize project files created by VSTU 이 문서의 내용 –> Visual Studio Tools for Unity는 프로젝트 파일을 생성하는 동안 Unity 스타일의 콜백을 제공합니다.Visual Studio Tools for Unity provides a Unity-style callback during project file generation. VisualStudioInte

    docs.microsoft.com

    위 문서를 참고해 다음과 같은 Script 를 추가해 프로젝트 파일을 수정할 수 있습니다.

    using SyntaxTree.VisualStudio.Unity.Bridge;
    ...
    
    ProjectFilesGenerator.ProjectFileGeneration += ( string name, string content ) =>
    {
    	return content.Replace("<LangVersion>latest</LangVersion>","<LangVersion>6</LangVersion>");
    };
    ...

    4. Microsoft.Net.Compilers 최신 버전 설치

    Visual Studio 의 NuGet Package 를 사용해 최신 버전의 Microsoft.Net.Compilers 설치해 C# 7.0 으로 업데이트 합니다.

    단, 추가적인 패키지 설치가 필요할 수 있다고 합니다.

    https://stackoverflow.com/questions/39461407/how-to-use-c-sharp-7-with-visual-studio-2015

    How to use C# 7 with Visual Studio 2015?

    Visual Studio 2017 (15.x) supports C# 7, but what about Visual Studio 2015 (14.x)? How can I use C# 7 with it?

    stackoverflow.com

    5. Visual Studio 최신 버전 사용

    2017 이상의 Visual Studio 를 사용합니다.

  • 넥슨 폰트

    http://levelup.nexon.com/font/index.aspx

  • 하이퍼 캐주얼 게임 “Hoppy Japan”을 Unity에서 1 개월로 만든 이야기

    unity UnityAdventCalendar2018

    시작하기

    f : id : takashicompany : 20181203102625p : plain

    안녕하세요! Unity 엔지니어의 사토 입니다.
    이 기사는 카약 Unity 강림절 달력 2018 4 일째의 기사입니다.
    올해 10 월에 출시 한 KAYAC의 신작 하이퍼 캐주얼 게임 “Hoppy Japan」의 개발에 대해 이야기합니다.

    AppStore
    Google Play

    Hoppy Japan은

    “Hoppy Japan”은 당사의 소셜 게임 사업부의 “천하 제일 기획위원회 ‘라는 제도에서 태어난 게임입니다.

    f : id : takashicompany : 20181203102932p : plain

    Hoppy Japan은 쉽게 속도감과 고양감을 체험 할 수있는 원 터치 액션 게임입니다.


    Hoppy Japan

    개발 멤버는

    • 프로듀서
    • 디쿠레타
    • 플래너 / Unity 엔지니어 (나)
    • 3D 아티스트 / 디자이너
    • 사운드 아티스트

    5 명입니다.

    제품 판의 제작은 1 개월에서 실시했습니다.

    기술적 인 개념

    • 전 세계적으로 배달을 상정하고 있기 때문에 저사양 단말에서 작동하도록
    • 단기간에 확실하게 개발을 추진하기 위해 간단한 구조와 설계를 의식하는
    • 아티스트가 Unity 작업 · 확인을 할 수 있도록

    라는 것을 염두에 두었습니다.

    배경 객체 재사용

    “Hoppy Japan」은 거리를 즐기는 게임입니다.
    캐릭터가 진행됨에 따라 “배경 오브젝트를 배치 · 후방에서 보이지 않게 된 배경 내용 지우기 ‘라는 구현을하고 있습니다.
    그 때 Instantiate 함수와 Destroy 함수를 사용하면 CPU 처리에 부하가 걸려 카쿠 붙는 원인이 게임의 경험을 해쳐 버립니다.

    f : id : takashicompany : 20181203102654p : plain

    위의 그림과 같이 카메라에서 얻을 수 없게 된 도시의 3D 모델을 Destory하지 않고 앞으로 다시 재정렬하는 구조로되어 있습니다.

    f : id : takashicompany : 20181203102843g : plain

    위의 그림과 같이 캐릭터가 진행에 맞추어 숨겨진 화와 배치 (재사용)을 순서대로 실행합니다.

    장면을 분할 / 대량로드

    Hoppy Japan에서는 타이틀 화면 게임 플레이 화면 · 결과 화면 스킨 목록 화면의 4 개의 장면으로 게임을 구성하고 있습니다.

    하나의 장면 파일로도 만들 수있을 것 컴팩트 한 게임이지만, 장면을 분할하여

    • 기능의 분리가 가능한
    • 기능의 확인을 혼자있다
    • 여러 사람이 작업 할 때 변경 부딪치지

    등을 실현하는 목적이 있습니다.

    f : id : takashicompany : 20181203102829p : plain

    또한, 응용 프로그램 시작시 모든 장면을로드하고 원활하게 놀 수 있도록 노력했습니다. 

    이것은 “Hoppy Japan”의 총 메모리 사용량이 약 60MB 였기 때문에 채용 할 수 있었다 …라는 측면도 있습니다.

    만든 것을 확인하고 조정하는 사이클을 빨리하기 위해 각 장면은 단독으로 편집기 재생해도 작동하도록했습니다.

    자신의 타임 스케일

    이 게임은 “슈퍼 슬로우 ‘라는 기능이 포함되어 있습니다.
    길게을하면 캐릭터의 이동 속도가 느린되어 착지점이 목적 쉬워진다 …라는 것입니다.
    Unity는 Time.timeScale는 게임 전체의 속도를 조절하는 기능이 있지만, 이번에는 사용하지 않았습니다.
    “캐릭터 이동과 이동 만 발생하고 UI는 보통의 속도로 움직이게」처럼 요소마다 조정할 수있는 것이 유연하게 대응할 수 있다고 생각했기 때문입니다.
    “Hoppy Japan」에서는 Time.timeScale는 사용하지 않고 자신의 timeScale을 정의하고 애니메이션 인스턴스 ( DOTween )과 Animator 파티클 등 슈퍼 슬로우를 적용 할 요소에 대해 동기화 처리를 썼습니다.

    void Update ()
    {
        // GameManager.timeScale라는 변수를 정의하여 동기화 할 애니메이션에 적용
        
        // Animator의 경우
        _animator.speed = _gameManager.timeScale;
    
        // DOTween의 Sequence 인스턴스의 경우
        _doTweenSequence.timeScale = _gameManager.timeScale;
    
    }
    
    void LateUpdate ()
    {
        // ParticleSystem에만 LateUpdate 동기화시킨다 (Update이라고 움직임이 거칠어 때문에)
        _particleSystem.Simulate (
            Time.deltaTime * _gameManager.timeScale,
            true ,
             false
        );
    }
    

    아티스트와의 연계

    아티스트가 스스로 만든 아트를 게임에 통합 확인할 수 있도록 여러 가지 궁리를했습니다.

    우선, 「Header 속성에서 예술의 반영 방법을 적는다 ‘라는 것입니다.
    Header 속성은 직렬화 변수로 정의함으로써 Unity의 Inspector 뷰에 텍스트를 표시 할 수 있습니다.
    주로 Inspectr 뷰에서의 변수의 설명에 사용됩니다.

    [Header ( "예술을 게임에 통합 단계" )]
    [Header ( "1. 만든 Block에 GameBlock 구성 요소를 설정" )]
    [Header ( "2. StageCheckScene 열기" )]
    [Header ( "3. GameStage 구성 요소의 조립식 수정" )]
    [Header ( "- 필드를 수정하려면 Field 계층 다음과 같이 설정" )]
    [Header ( "- 단계를 추가하려면 StepPool에 조립식 추가" )]
    [Header ( "- 블록을 추가하는 경우 BlockPools에 조립식 추가" )]
    [Header ( "4. Stage 조립식 저장하면"StageBundleData "를 검색" )
    [Header ( "5. StageBundleData에 조립식를 설정하면 SaveProject과 장면 저장" )
    [Header ( "6. GameScene을 재생하면 게임에 등장하는" )]
    
    f : id : takashicompany : 20181203102629p : plain

    다소 힘 기술 느낌이지만, 프로그래머는 별도 wiki 등을 준비하지 않고 설명을 쓸 때문에 쉽게 아닐까 생각합니다.

    또한 개발 초기 장면의 객체에 Inspector에서 만든 아트를 설정 준다고하는 방식 이었지만 장면 파일을 서로 만지는 경우 충돌이 발생하게되므로 ScriptableObject을 사용하여 아티스트가 쉽게 아트를 설정할 수 있도록했습니다.

    f : id : takashicompany : 20181203102639p : plain

    성능 조정

    일부 단말기는 GPU의 부하가 높고 FPS의 저하를 초래했기 때문에 특정 조건을 만족하는 단말 (FPS가 일정 수를 연속 밑돌아 계속 경우 등)에서는 해상도를 조정하여 묘화 부하를 경감하는 방법을 취했습니다.

    Screen.SetResolution (Screen.width / 2, Screen.height / 2, true);

    끝

    이상과 같이하여 “Hoppy Japan ‘은 만들어졌습니다.
    하이퍼 캐주얼 게임은 Unity와 궁합이 잘 기존의 기능을 적절하게 사용만으로도 좋은 게임을 만들 수 있습니다.
    꼭 도전 해보세요!

    내일은 미야 유사 “Bluetooth에서 Unity와 연결하는 컨트롤러를 ESP32 마이크로 컴퓨터로 만드는”입니다!