[Unity] 서버 등을 준비하지 않고 오프라인 보상을 실시하는 방법

7910 단어 Unity2DUnityC#

입문


처음 뵙겠습니다. 잘 부탁드립니다.
첫 투고였기 때문에 간단하게 자기소개를 했다.
현재 창업한 친구 곁에서 유니티 엔지니어로 대학에 다니면서 일합니다.
현재 스마트폰을 위한 캐주얼 게임 제작을 의뢰받았다.원격으로 OK이기 때문에 기본적으로 집이나 수업 시간에 일을 합니다.정말 고맙습니다.
그 맡은 게임의 기능 중 하나는'오프라인 보수'가 있다.게임을 하지 않아도 게임 내 동전이 게임을 하지 않은 시간을 얻을 수 있다는 뜻이다.
소사 뚜껑을 닫는 시간에 회복된 체력(게임을 할 때 소비) 등이 가까운 기능이죠.
이 기능을 구현할 때는 힘들었지만 직접적인 보도는 보지 못했다.
자신이 사용한 비망록으로서 유사한 기능을 설치한 사람에게 도움이 되기를 바란다.

규격


이번에 설치할 때 대체로 규정된 규격을 소개하였다.
  • 서버와 교환하지 않음
  • 분당 받을 수 있는 보수의 양은 고정적이며, 그 양은 증가할 수 있다
  • 어플리케이션을 다시 시작하거나 시작하지 않거나(다른 어플리케이션을 일시적으로 활성화) 보수가 발생하면 팝업하고 보수를 받을 수 있습니다
  • 정말 얼토당토않아요.

    실시


    그러면 실제로 설치하지만, 하는 일은 대략 두 가지 항목이 있다.

    보수 계산


    서버와 교환하지 않기 때문에 로컬에서 시간을 얻고 지난번 시간과의 차이를 내서 보수를 계산해야 한다.
        private void SetOfflineEarning()
        {
            double minutes = CalcSecond(DateTime.UtcNow, _endTime) / 60;
            _endTime = DateTime.UtcNow;
            _earnOffline = (int) minutes * _offlineEarning;
            Save();
        }
    
    DateTime.UtcNow, 현재 UTC 시간을 얻을 수 있습니다.Save(); 중 이번 기능과 관련된 것은 저장만 가능합니다_endTime.또한 기록이 없고 게임이 시작될 때 읽는다_endTime.
    1분의 보수이기 때문에 이번에는 60으로 나눈다.
    참고로 CalcSecond() 아래와 같습니다.DateTime의 UTC 시간의 차이점을 총 초수로 되돌리는 방법입니다.
        private double CalcSecond(DateTime now, DateTime prevTime)
        {
            return (now - prevTime).TotalSeconds;
        }
    
    이렇게 되면 _earnOffline 오프라인 보수가 대입된 상태가 되기 때문에 이를 전체 수입을 나타내는 구성원에 더하면 된다.

    멀리 떨어진 어플리케이션 감지


    응용 프로그램이 시작될 뿐만 아니라 다른 응용 프로그램에서 돌아올 때도 반드시 팝업해야 하기 때문에 응용 프로그램에서 멀리 떨어진 상황을 검사할 필요가 있다.
    Unity의 MonoBehaviour는 다음과 같은 방법을 제공합니다.OnApplicationPause(bool pauseStatus)이것은 응용 프로그램이 다른 응용 프로그램으로 이동하거나 홈 화면으로 돌아가 잠시 중단되었을 때, 또는 반대로 응용 프로그램으로 돌아갈 때 응용 프로그램이라고 부른다.
    즉, pauseStatusfalse 때 돌아왔기 때문에 여기에 오프라인 보수 처리를 기술하면 된다.
    여기서 주의해야 할 점은 구글의 AdMob을 가져올 때다.만약 당신이 광고를 다시 읽는 것을 본다면, 이것도 응용 프로그램을 떠나는 것으로 판정될 것이다.닫고 돌아올 때도 이 같은 방법으로 불린다는 얘기다.
    따라서 다시 쓰는 광고를 도입했다면 다시 쓰는 광고를 표시할 때 무시해야 한다.
        private void OnApplicationPause(bool pauseStatus)
        {
            //ゲーム中は無視
            if (GameSceneManager.IsGameStart) return;
            //リワード広告後は無視
            if (_isRewarding) return;
            if (!pauseStatus) _isOpenOfflineEarning = true;
            OpenOfflineEarning();
        }
    
    OpenOfflineEarning() 아래와 같습니다.
        public void OpenOfflineEarning()
        {
            //起動時にはオフライン報酬を表示
            if (_isOpenOfflineEarning)
            {
                _isOpenOfflineEarning = false;
                //もし稼ぎが0ならなし
                if (CalcOfflineEarning() <= 0) return;
                SceneManager.LoadSceneAsync(SceneName.OfflineEarningScene, LoadSceneMode.Additive);
            }
        }
    
    특별히 만드는 방법의 의미가 있나요?지금 돌이켜보면 생각할 게 많지만, 미리 웃어두는 게
    방금 SetOfflineEarning 가져온 목표 장면의 장면 관리 스크립트Start()에서 실행되었습니다.CalcOfflineEarning()SetOfflineEarning에서 진행된 계산 부분만 진행하고 값만 반환하는 방법이다.보수가 0인 경우 튀어나올 필요가 없고 계산 결과에 대입되면 귀찮기 때문에if문장으로 판정합니다.
    코드도 먼저 올려놓을게요.(같은 내용을 기술하니 정말 어리석다. 더 간결하게 쓴 것 같다.)
        public int CalcOfflineEarning()
        {
            double minutes = _timer.CalcSecond(DateTime.UtcNow, _endTime) / 60;
            return (int) minutes * _offlineEarning;
        }
    
    추가로 불러오는 장면은 다음과 같다. 팝업 디스플레이용 UI를 준비하고 스크립트에서 돈을 벌 수 있는 금액을 고쳤다.

    총결산


    나는 첫 투고 문장으로 읽기 어려운 점도 있다고 생각하지만, 용서해 주십시오.
    이번에는 기본적으로 시간차를 통해 보수를 계산하고 응용 프로그램으로 돌아가는 것을 판정하며, 이때 팝업 디스플레이용 장면을 추가로 불러옵니다.
    더 좋은 방법도 있을 것 같지만, 조금만 참고해 주시면 좋겠어요.

    추적 (2019-05-13)


    이번 실제 설치에는 특별한 저가 대책이 없다.
    기획사에 확인해 보니 대책을 세우지 않아도 된다고 해서 일단 보류했다.며칠 뒤면 대책이 실릴 것 같습니다.

    참고 자료

  • Unity의 OnApplicationFocus, OnApplicationPause, OnApplicationQuit 함수의 터미널(iOS/Android) 동작 요약
  • 좋은 웹페이지 즐겨찾기