728x90

전제: quasar로 함. vue 플젝하고 크게 다를바 없을듯

문제: www 폴더에 빌드 파일들을 넣고, 정상 작동 됨을 확인했는데, 새로고침을 하면 404가 뜬다.

해결: 텍스트파일에 아래 소스를 넣은후 파일명을 .htaccess로 바꾼다. ( .htaccess.txt 가 아니다 확장자가 htaccess가 되어야 함) 만든 파일을 www폴더 안에 넣는다.

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

 

 

또는 아래 파일을 www 안에 넣는다.

.htaccess
0.00MB

 

 

참고: 프로젝트에 'history' 모드를 넣을만한 곳은 다 넣었다. 그래도 안되서 저 파일을 올렸더니 됏다. 현재도 mode를 넣을 만한 곳에 history가 들어가 있다. 

728x90

문제: 유니티에서는 정상적으로 되는데, xcode로 빌드해서 핸드폰 실행을 하게 되면 애드몹 초기화시 에러가 나면서 멈춘다.

원인: 애드몹 승인상태가 검토필요(?)로 되어 있었음.

해결: 애드몹 승인.

 

모두 나하고 같은 원인은 아닐것이다... cocoa pods에서 google mobile ads sdk 업그레이드도 해봤고, 하라는거 다 했는데, 안됐다... 
그러다가 일단 테스트id를 넣고 실행했는데 됐고,, 다른 에러들 처리하느라 테스트id를 넣어둔걸 잊은채 앱스토어 운영 배포가 되어버렸다 ^_ㅜ

급하게 이것저것 보다가 애드몹을 보니..

 

승인상태가 검토필요(?)로 되어 있었다.
진짜 저거 볼때마다 불안불안했는데,, 저게 승인이 안되어 있는 상태여서 에러가 났던거다 ㅠ
구글은 항상 미리 넣어놨었기 때문에 문제가 없었으...
근데 난 이미 앱스토어에 올라가 있어서 넣을 수 있었는데, 올리기 전엔 어떻게 하지..? ㅇㅅㅇ;; 

암튼... 저기부터 확인해 보시길... 

끝.

728x90

 

관절을 생성하고 다시 만들려고 지우려는데 아무리 찾아도 삭제 버튼이 없다. 

이것저것 누르다 발견.

 

쉬프트 키 + delete 키

 

728x90

 

https://play.google.com/store/apps/details?id=com.loomi.cosmic_dust_growing 

 

우주 청소부 키우기 - Space Cleaner - Google Play 앱

행성 쓰레기가 자원이 된다!? 우주 청소부가 되어 자원을 모아보세요.

play.google.com

 

이번엔 연습이 아닌 실제 돈을 벌기 위한 게임을 출시했다.

"우주 청소부 키우기"

일단, 돈을 벌 수 있는 게임을 만들고자 했다. 
뭘 만들어야 할까 고민하다가, 과거에 인기가 많았고 요즘에도 인기가 많으며 매니아 층이 있는 게임을 만들어 보고자했다.
그게 바로 키우기 게임. 

장점은 많은 사람들이 찾는 다는 것. 
단점은 많은 사람들이 게임을 출시 한다는 것. 

그래도 일단 만들긴 했는데... 
게임을 만들면서 가장 어려웠던 부분은 코딩도 아니고 오류도 아닌... 디자인! ㅠ

 

튜토리얼 화면

 

디자인은 세군데를 이용했다. 
- 클립아트코리아.
- illustAC
- 내 손

클립아트 코리아에서는 양질의 디자인을 구매할 수 있었다. illustAC는 일본 사이트 같은데 기본적인 아이콘같은 이미지가 많았다. 위 사진에 손가락 모양이 illustAC에서 얻을 수 있었다.

한 50퍼 정도는 내가 직접 그렸는데, 역쉬 디자인은 나하고 맞지 않다.. ㅠ 하지만 왜 재밌었지... 

뭐 암튼, 드디어 게임이 나왔는데, 이제부터 해야 할 일은 
1. 애플에도 올리기.
2. 마케팅 알아보기.

게임 만들어서 올린다고 다 잘되는거 아니니까. 일단 이런 게임이 있다는 것만으로도 알려야 할 것 같은데.
어떻게 하는게 효율적일라나!?

728x90

문제: 유니티에서 실행하면 결제팝업이 뜨는데 핸드폰으로 안뜨는 이유

해결
- 구글은 직접 유니티에 붙어서 빌드해서 테스트 하면 안된다. 구글스토어에 내부테스트로 다운받아서 해야함.
- 내부 테스트에 올려서 구글플레이 스토어에서 다운받았는데도 안되는 경우 와이파이 연결이 되어 있는지 확인하기.
    와이파이를 끄니까 팝업이 뜬다.
- 빌링 퍼미션이 제대로 들어가 있는지 확인하기. gpt는 세가지를 알려줘서

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />

이렇게 넣었는데, 다른 사람들은 BILLING만 넣는것 같다. 빌링만 넣어도 무방한지는 다음에 테스트 해봐야겠다.

 

 


 

"초동수사 - 증언/증거 추리게임"

증거와 진술로 추리해야 하는 게임!

방탈출 게임이 아닙니다.

증거는 모두 찾았고 용의자들에게 증언을 얻어내세요!

 

시즌2가 나왔습니다!

초동수사 1, 2 합본으로 출시했으니 기존 앱에서 에피소드를 확인해주세요😍

(안드로이드는 아직  시즌1만...)

 

 

 

[Android]

https://play.google.com/store/apps/details?id=com.loomiloomi.crimescene

 

[IOS]

https://apps.apple.com/kr/app/%EC%B4%88%EB%8F%99%EC%88%98%EC%82%AC-%EC%A6%9D%EC%96%B8-%EC%A6%9D%EA%B1%B0-%EC%B6%94%EB%A6%AC%EA%B2%8C%EC%9E%84/id6499072416

 

‎초동수사 - 증언/증거 추리게임

‎Episode 1. 자택에서 친구들과 놀던 평범한 여대생 "나 미녀"가 갑작스럽게 사망했다. 그런데, 주변 사람들의 대화 내용이 심상치 않다!? ======== 안 남찬: "아니요! 저희는 밥을 먹고 있었을 뿐입니

apps.apple.com

 

728x90

문제: 인앱결제 상품등록창이 안나오고, 인앱 상품을 추가하려면 결제 권한을 APK에 추가해야 합니다. 라고만 뜸.

해결: 결제 권한을 주어야 한다.

방법
1. Assets > Plugins > Android > AndroiManifest.xml에 
 <uses-permission android:name="com.android.vending.billing"/> 를 추가해준다.

2. 다시 빌드해서 테스트앱에 배포하게 되면, 구글콘솔 화면이 바뀐다.

 

---------

* 만약 AndroiManifest.xml파일이 없다면, 

Edit > project settings > android 탭 > Publishing Settings > Build > Custom Main Manifest 체크하기.

 

 

 

 

 

 


 

"초동수사 - 증언/증거 추리게임"

증거와 진술로 추리해야 하는 게임!

방탈출 게임이 아닙니다.

증거는 모두 찾았고 용의자들에게 증언을 얻어내세요!

 

 

 

[Android]

https://play.google.com/store/apps/details?id=com.loomiloomi.crimescene

 

[IOS]

https://apps.apple.com/kr/app/%EC%B4%88%EB%8F%99%EC%88%98%EC%82%AC-%EC%A6%9D%EC%96%B8-%EC%A6%9D%EA%B1%B0-%EC%B6%94%EB%A6%AC%EA%B2%8C%EC%9E%84/id6499072416

 

‎초동수사 - 증언/증거 추리게임

‎자택에서 친구들과 놀던 평범한 여대생 "나 미녀"가 갑작스럽게 사망했다. 그런데, 주변 사람들의 대화 내용이 심상치 않다!? ======== 안 남찬: "아니요! 저희는 밥을 먹고 있었을 뿐입니다! 힘들

apps.apple.com

 

728x90

CommandInvokationFailure: Gradle build failed. 
D:/Unity/UnityEditor/2019.4.1f1/Editor/Data/PlaybackEngines/AndroidPlayer\OpenJDK/bin\java.exe -classpath "D:\Unity\UnityEditor\2019.4.1f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-5.1.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "bundleRelease"

stderr[
error processing C:\Users\Shinirom\.gradle\caches\transforms-2\files-2.1\583a75497389cd684886f6ff612791df\jars\classes.jar


대강 이런 에러가 났다.

 

mainTemplate.gradle 파일이 

이런식으로 되어 있었다.

 

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

apply plugin: 'com.android.library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // Add additional dependencies here if needed
}

android {
    compileSdkVersion 30
    buildToolsVersion '30.0.3'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        minSdkVersion 30
        targetSdkVersion 32
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
        versionCode 1
        versionName '1.0'
        consumerProguardFiles 'proguard-unity.txt'
        multiDexEnabled true
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
    lintOptions {
        abortOnError false
    }

    aaptOptions {
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }
}

내게 맞게 수정했다.

당연한걸 수정한거지만... 초반 에러의 원인은 이게 아니었을것임..


 

[ 빌드 에러 "각종" 해결 방법 ]
- 참고로 플러그인은 애드몹과 인앱결제만 사용.

- keystore 설정
- project setting > Player > Publishing Settings > Build 아래처럼 체크

- project setting > Player > Other Settings > Minimum API Level, Target API Level 수정
   -- 각 30, 32로 해둠.
- mainTemplate.gradle 파일에 multiDexEnabled true 이거랑 여러개 추가.(multiDex에러 검색하면 추가할거 여러개 나옴)

일단, 이정도.. 정리하면서 했어야 했는디..

 

 

 

 


 

 

"초동수사 - 증언/증거 추리게임"

증거와 진술로 추리해야 하는 게임!

방탈출 게임이 아닙니다.

증거는 모두 찾았고 용의자들에게 증언을 얻어내세요!

 

 

 

[Android]

https://play.google.com/store/apps/details?id=com.loomiloomi.crimescene

 

[IOS]

https://apps.apple.com/kr/app/%EC%B4%88%EB%8F%99%EC%88%98%EC%82%AC-%EC%A6%9D%EC%96%B8-%EC%A6%9D%EA%B1%B0-%EC%B6%94%EB%A6%AC%EA%B2%8C%EC%9E%84/id6499072416

728x90

 

using GoogleMobileAds.Api;
using UnityEngine;


public class AdMobManager : MonoBehaviour
{


    // These ad units are configured to always serve test ads.
#if UNITY_ANDROID
    private string _adUnitId = "ca-app-pub-3940256099942544/5224354917";
#elif UNITY_IPHONE
  private string _adUnitId = "ca-app-pub-3940256099942544/1712485313";
#else
  private string _adUnitId = "unused";
#endif

    public void Start()
    {
        // Google 모바일 광고 SDK를 초기화합니다.
        MobileAds.Initialize((InitializationStatus initStatus) =>
        {
            // 이 콜백은 MobileAds SDK가 초기화되면 호출됩니다.
            LoadRewardedAd();
        });
    }

    private RewardedAd rewardedAd;

    public void LoadRewardedAd()
    {
        // 새 광고를 로드하기 전에 이전 광고를 정리하십시오.
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }

        Debug.Log("Loading the rewarded ad.");

        // 광고를 로드하는 데 사용되는 요청을 생성합니다.
        var adRequest = new AdRequest();
        adRequest.Keywords.Add("unity-admob-sample");

        // 광고 로드 요청을 보냅니다.
        RewardedAd.Load(_adUnitId, adRequest,
            (RewardedAd ad, LoadAdError error) =>
            {
                RegisterEventHandlers(ad);

                // 오류가 null이 아니면 로드 요청이 실패한 것입니다.
                if (error != null || ad == null)
                {
                    Debug.LogError("보상형 광고가 광고를 로드하지 못했습니다. " +
                                   "with error : " + error);
                    return;
                }

                Debug.Log("응답으로 로드된 보상형 광고 : " + ad.GetResponseInfo());

                rewardedAd = ad;
            });
    }

    public void ShowRewardedAd()
    {
        if (rewardedAd != null && rewardedAd.CanShowAd())
        {
            rewardedAd.Show((Reward reward) =>
            {
                // 보상 주는 곳.
                Debug.Log(" 보상 주는 곳 // " + reward.Type + " // " + reward.Amount);
            });
        }
    }

    // RewardedAd는 일회용 객체입니다. 즉, 보상형 광고가 표시된 후에는 객체를 다시 사용할 수 없습니다. 다른 보상형 광고를 요청하려면 새 RewardedAd 객체를 만들어야 합니다.
    // 다음 노출 기회에 맞게 보상형 광고를 준비하려면 OnAdFullScreenContentClosed 또는 OnAdFullScreenContentFailed 광고 이벤트가 발생한 후 보상형 광고를 미리 로드합니다.
    private void RegisterEventHandlers(RewardedAd ad)
    {
        // 광고에서 수익이 발생한 것으로 추정될 때 발생합니다.
        ad.OnAdPaid += (AdValue adValue) =>
        {
            Debug.Log("광고에서 수익이 발생한 것으로 추정될 때 발생합니다. " + adValue.Value + " // " + adValue.CurrencyCode);
        };
        // 광고에 대한 노출이 기록될 때 발생합니다.
        ad.OnAdImpressionRecorded += () =>
        {
            Debug.Log("광고에 대한 노출이 기록될 때 발생합니다.");
        };
        // 광고에 대한 클릭이 기록될 때 발생합니다.
        ad.OnAdClicked += () =>
        {
            Debug.Log("광고에 대한 클릭이 기록될 때 발생합니다.");
        };
        // 광고가 전체 화면 콘텐츠를 열 때 발생합니다.
        ad.OnAdFullScreenContentOpened += () =>
        {
            Debug.Log("광고가 전체 화면 콘텐츠를 열 때 발생합니다.");
        };
        // 광고가 전체 화면 콘텐츠를 닫을 때 발생합니다.
        ad.OnAdFullScreenContentClosed += () =>
        {
            Debug.Log("광고가 전체 화면 콘텐츠를 닫을 때 발생합니다.");
            // 다음 보상형 광고 미리 로드
            LoadRewardedAd();
        };
        // 광고가 전체 화면 콘텐츠를 열지 못했을 때 발생합니다.
        ad.OnAdFullScreenContentFailed += (AdError error) =>
        {
            Debug.LogError("광고가 전체 화면 콘텐츠를 열지 못했을 때 발생합니다." + " with error : " + error);
            // 다음 보상형 광고 미리 로드
            LoadRewardedAd();
        };
    }

}

 

+ Recent posts