목차

반응형

스압주의(엄청난 분량이다. 그냥 빌드 처음부터 끝까지 세세한것 전부다 기록했다.)


내가 사용하였던 IOS 기기장치, 맥북프로, 아이폰 6s


유니티 설치

일단 먼저 맥북에서 유니티를 받는다.

특별한 사유가 없으면 최신버전이 좋은 것 같다.

https://unity3d.com/kr/get-unity/download

와 맥북 미쳤네 얘네는 그냥 단순 캡쳐도 이미지 뒤에 그림자가 깔리네? 갓갓...


유니티에서 프로젝트를 연다.(나는 콜랩을 사용하였다.)



XCODE 설치

다음은 xcode를 설치해야 한다.

단 앱스토에서 설치하기보다는 애플 개발자 사이트에서 다운로드를 하는 곳이 있는데 그곳에서 설치를 하도록 하자.

https://developer.apple.com/download/

회원가입을 해야한다.


버전은 가장 최신버전을 받도록 하자. 그렇지 않으면 아이폰 빌드시 xcode가 지원하지 않는 버전이라고 하면서 빌드가 안된다.


오류가 나지 않는다면 해당 부분은 넘어가도록 한다.

설치시 macos버전 10.13.6 이상이 필요하기 때문에 ... 오류

하지만 엄청난 대용량의 xcode를 기껏 받고 실행하려고 하면 macos버전 10.13.6 이상이 필요하기 때문에 ... 이런 오류가 나면서 설치가 안된다.

영어로 하자면 xcode can’t be installed on macos because macos version 10.13.6 or later is required 이런 식의 오류다.



맥버전별로 xcode가 돌아가는 버전이 나눠져있다.

마치 윈도우 7에서는 비쥬얼 스튜디오 2018이 안돌아가니 윈도우 10으로 업데이트 해야한다. 이런 느낌이다.

인터넷에서 찾아보면 자꾸 앱스토어에 가서 맥os를 업데이트 하라고 하는데 이미 최신이라서 업데이트 할 것이 없다.

더 찾아보니 os 자체를 업그레이드 해야한다.



당신의 맥의 os 명을 확인하자.


나같은경우 High Sierra로 최대 버전이 10.13.4 밖에 되지 않았다.

xcode 10을 돌리려면 High Sierra에서 Mojave로 업그레이드를 해야한다.(맥 os는 유명 지역이름을 따서 하는듯하다.)

이 업그레이드는 앱스토어에서 진행하는 것이 아니라 애플 사이트에서 진행해야한다.

https://www.apple.com/kr/macos/mojave/


업그레이드를 하고 버전이 올라간 것을 보고 나면 이제 xcode 설치가 잘 될것이다.



실행하면 위와 같은 화면이 나올 것 이다.


유니티 IOS 빌드

유니티로 넘어가서 ios Build를 하도록 하자


iOS를 누르고 switch platform을 하자.

이 과정에서 오류가 나는 사람이 있고 나지 않는 사람이 있는데 나같은 경우는 unity ios could not find file uielementsmodule.dll 라는 원인 불명, 잘 알려지지도 않은 오류가 발생하였다.

해당 내용은 아래에 적도록 하겠다.


Player Settings에서 위의 옵션만 바꾸었다.

configuration 부분을 어떻게 설정하느냐에 따라서 빌드오류가 나기 때문에 잘 설정하도록 하자.

본인은 4.5로 했다가 오류가 엄청나서 다시 기본 세팅으로 바꾸니까 잘 되었다.


빌드 경로를 지정해준다.

안드로이드에서 gradle 빌드와 비슷하다고 보면 된다.

빌드하고나서 해당 소스를 xcode로 불러와서 다시 iphone으로 빌드해준다고 보면 된다.



unity ios could not find file uielementsmodule.dll 오류

이유랑 결과도 잘 나오지 않는 오류가 뜬다.

그냥 새로운 프로젝트를 빌드해보면 잘 되는 것을 봐서 내가 넣은 라이브러리의 오류인 듯 하다.


그래서 해본것은 아래와 같다.


빌드 configuration 변경 : 3.5 -> 4.5로 변경 등 이것저것 해봄

알 수 없는 오류만 더 나오고 그래서 그냥 3.5로 다시 하는 것이 맞는 것 같다.


새로운 프로젝트를 하나 만들고 거기에 내 어플리케이션의 필요한 소스들만 엎음

여전히 위의 오류가 발생하였음.


검색결과 프로젝트 최상단의 library 폴더를 삭제하라고 하여서 삭제해봄 : 삭제하고나서 프로젝트를 들어가보면 플랫폼이 ios로 안되어있고 기본 standalone으로 되어있어서 ios로 바꾸면 파일을 찾을 수 없다는 오류가 난다.

그냥 quit 하고 다시 들어가보면 플랫폼이 바뀌어져 있다. 

라이브러리 폴더 삭제하고 빌드하니까 잘 되더라.... 정확한 이유는 모르겠다.


XCODE에서 유니티 프로젝트 불러오기, 아이폰으로 빌드

유니티로 빌드한 파일을 찾아 들어가서 .xcworkspace로 시작하는 파일을 눌러서 프로젝트를 불러온다.

행여나 저 파일을 위에것으로 잘못 불러오면 이상한 오류가 난다. 꼭 알맞은 파일을 불러와서 프로젝트를 임포트 하도록 하자.


그리고 빌드를 하기 전에 pod를 맥에 설치하고 pod install을 하도록 하자.

node로 치자면 node 설치하고 npm install을 하는 것과 비슷하다.

https://cocoapods.org/


휴대폰을 맥북에 연결한뒤 개발 설정을 한다.


내용 생략


그러면 저 부분에 원래 Generic iOS Device로 되어있었을텐데

본인의 아이폰이 인식 될 것 이다.




그리고나서 빌드를 하려고 하면 오류들이 엄청 뜰텐데 일단 signing을 먼저 해야한다.

위 번호대로 눌러서 자동 사인을 하도록 하자.


활성화 선택


이 부분은 본인의 계정을 선택하자

별다른 라이브러리 설치를 하지않았다면 빌드를 하면 오류없이 빌드가 잘 될 것이다.

기본 유니티 프로젝트로 테스트를 해보니까 별다른 설정이 필요 없었다.


앱에 설치하려고 하면 위와 같은 오류가 뜰 것 이다.

아래대로 하자.









위와 같이 아이폰에서 설정을 하고나면 이제 빌드가 잘 될 것이다.


다음에는 유니티 iOS에 광고모듈 부착, 파이어베이스 설정, 출시를 하면서 발생하는 문제들에 대하여 포스팅 할 것이다.

반응형
반응형

AchievementManager라는 파일을 새로 생성하였다.

이 파일에서 도전과제에 대한 기능들이 정의되어있다.


아래는 도전과제 기능을 구현하기 위해 필요한 기능들이다.


도전과제 데이터에 대한 정의

public class AchievementData
{
public int ScoreN { get; set; }
public int PlayN { get; set; }
public static int BoostCount = 0; }

위와같이 도전과제 데이터에 대한 정의를 내린다.

ScoreN은 N점이상 달성시 해제되는 도전과제이고 PlayN은 N회이상 플레이해야 해제되는 도전과제이다.

ScoreN과 PlayN이 의미하는 값은 해당 도전과제를 달성하기 위한 수치를 의미한다.

PlayN이 5일경우 5회이상 플레이시 도전과제를 달성할 수 있도록 하는 것이다.

BoostCount는 한 게임 내에서 사용한 부스트의 횟수인데 아래에서 설명하겠다.

위와 같이 각 도전과제의 달성수치에 대한 정의를 내린다.


그리고 저장하기 위한 데이터에 대하여 클래스를 생성한다.

public class SaveData
{
[SerializeField] public int MaxLevel;
[SerializeField] public int[] StageScore;

[SerializeField] public bool unlockScoreN;
[SerializeField] public int pointScoreN;

[SerializeField] public bool unlockPlayN;
[SerializeField] public int pointPlayN;

public SaveData()
{
MaxLevel = 0;
StageScore = new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
PlayCount = 0;
unlockScoreN = false;
pointScoreN = 0;
unlockPlayN = false;
pointPlayN = 0;
}
}

해당 클래스는 게임내의 저장데이터를 가지고 있다.

MaxLevel이나 StageScore 같은 값은 도전과제와는 상관없는 게임 데이터이며

ScoreN을 놓고 봤을때

unlockScoreN은 도전과제에 대한 달성 여부를 의미한다.

pointScoreN은 도전과제에 대하여 얼마나 달성하였는지 나타내는 수치다.(해당 데이터가 저장되어야하는 이유는 유저가 도전과제를 얼마나 달성하였는지 게임이 종료되어도 해당 데이터의 기록이 남아있어야 하기 때문이다. 그리고 유저가 저장되어 있는 수치보다 높은 수치를 기록하면 해당 수치로 덮어씌우고 저장해준다.)


데이터의 갱신

도전과제 데이터에 대하여 지속적으로 갱신이 필요하다.

예를들면 위의 소스에서 PlayN을 5로 지정하였을때

pointPlayN은 0, unlockPlayN은 false로 초기화 된다.

5번을 플레이하면 unlockPlayN이 true가 되어야한다.(도전과제 달성여부 검사하는 부분은 아래에서 한다.)


유저가 게임을 플레이할때마다 휘발성 데이터인 PlayCount 값을 증가시켜준다.

그리고 아래 스크립트를 통하여 도전과제에 대하여 얼마나 성취하였는지 기존 데이터와 비교하여 기존보다 수치가 높으면 저장해준다.


게임에 대한 플레이 횟수는 계속해서 누적해서 카운트가 되어야하기때문에 아래와 같이 saveData에서 직접적으로 증가시켜준다.


AchievementManager.saveData.pointPlayN++;


하지만 한 게임내에서 부스트를 N회이상 사용하는 도전과제를 예시로 들면 해당 도전과제의 데이터는 누적되는 데이터가 아니라 게임마다 데이터가 바뀌어야하는 휘발성 데이터이기 때문에 아래와 같이 데이터를 갱신한다.

AchievementManager.BoostCount++;


도전과제 달성 현황 화면이다. 위 수치를 나타내기 위해서는 saveData에 저장을 해둬야한다.



도전과제 달성여부 확인

도전과제 데이터에 대한 갱신이 되었으면 도전과제가 달성되었는지 확인해주는 부분이 필요하다.

더불어 도전과제 데이터가 현재 저장되어있는 도전과제 데이터 수치보다 더 높은 수치면 데이터를 바꿔주는 부분도 포함되어있다.

//도전과제 달성여부 확인
public void checkAchievement()
{
if (gameManager.
play)
{
checkMaxScore();
checkStageScore();
checkDefault();
checkScoreN();
checkPlayN();
checkBoostNInAGame();
checkScoreN2();
checkExactN();
checkNoBoostTillN();
checkScoreN3();
checkBoostN2InAGame();
if (hasModified)
{
hasModified = false;
SaveData();
}
}
}

위와 같이 checkAchievement 함수를 update 부분에서 지속적으로 호출하여 도전과제 데이터에 대한 달성 여부를 확인한다.

hasModified는 도전과제를 달성하면 true로 바뀐다.

도전과제를 달성하면 자동적으로 저장되게끔 하기 위해서이다.


check함수에 대하여 예시를 보여주자면

//도전과제 확인
public void checkPlayN()
{
//도전과제 달성률 확인용
if (saveData.pointPlayN < saveData.pointPlayN)
{
saveData.pointPlayN = saveData.pointPlayN;
}
if (!saveData.unlockPlayN)
{
if (AchievementData.PlayN <= saveData.pointPlayN)
{
Achieve(out saveData.unlockPlayN, "Play 100 Times");
}
}
}

위와 같다.


//도전과제 달성률 확인용
if (saveData.pointPlayN < saveData.pointPlayN)
{
saveData.pointPlayN = saveData.pointPlayN;
}

해당 코드는 기존 도전과제 데이터에 비하여 더 향상된 수치를 가지면 수치를 업데이트 시켜주는 것 이다.(해당 데이터가 바로 저장이 되지는 않지만 게임 종료시, 시작시 데이터를 저장해주도록 하였기 때문에 게임 종료시 알아서 저장이 된다.)


 if (!saveData.unlockPlayN)
{
if (AchievementData.PlayN <= saveData.pointPlayN)
{
Achieve(out saveData.unlockPlayN, "Play 100 Times");
}
}

달성한 도전과제가 아닐시 달성여부를 확인하고 달성하였으면 Achieve함수를 통하여 도전과제 달성 함수를 호출한다.

Achieve 함수 내용은 아래에서 설명한다.


도전과제 달성

도전과제를 달성하면 유저에게 달성했다는 표시를 해야한다.

Achieve 함수를 통하여 아래와 같은 애니메이션을 표출하도록 하였다.


Achieve 함수의 내용은 아래와 같다.

//도전과제 달성 - 안내창 보여주기
public void Achieve(out bool achieve, string mention)
{
achieve = true;
hasModified = true;
_EffectManager.Achieve();
_EffectManager.LockOff();
_EffectManager.setAchieveText(mention);
Debug.Log(mention);
}

먼저 out을 통하여 해당 도전과제 bool 데이터에 대하여 true로 바꿔주고 이펙트 매니저에서 애니메이션의 텍스트를 바꿔주고 애니메이션을 호출한다.

Achieve 함수는 아래와 같이 호출한다.

 Achieve(out saveData.unlockPlayN, "Play 100 Times");


비슷하지만 단순히 도전과제만 달성하고 유저에게는 표출될 필요가 없는 부분은 아래와 같이 처리한다.

//도전과제 달성 - 안내창 없이
public void AchieveQuiet(out bool achieve, string mention)
{
achieve = true;
hasModified = true;
Debug.Log(mention);
}


도전과제 달성 데이터 저장 및 불러오기

데이터 저장과 불러오기는 아래 블로그 포스트를 참고하도록 한다.

Unity 안드로이드 파일 읽고 쓰기 streamingAssetsPath persistentDataPath








아무래도 단순히 내 생각만으로 잘 모르는 도전과제 시스템에 대하여 만들어보고 작업해보았는데 글을 쓰기전에 다른 사람들은 도전과제 시스템을 어떻게 구현하나 확인해봤다.


아래 글은 매우 정리가 잘 되어있고 체계적으로 구현이 되어있는데 언어는 다르지만 내용 자체는 매우 좋아서 다음 글은 해당 시스템에 대하여 공부하고 실제로 구현하려고한다.

https://gamedevelopment.tutsplus.com/tutorials/how-to-code-unlockable-achievements-for-your-game-a-simple-approach--gamedev-6012

반응형
반응형

음악을 불러올때 너무 많은 양의 음악을 불러오게되면 그만큼 게임의 시작이 지연된다.

대략 10곡을 불러왔을때 기준 7~8초정도의 로딩시간이 걸린다.


그럴때는 에셋폴더의(streaming asset에 넣으면 안된다. 인스펙터에서 해당설정이 안보임) 음악파일들을 선택하고


인스펙터에서 Load In Background를 체크해준다.


그러면 게임을 시작할때 메인스레드에서 음악을 같이 불러온다.


해당 옵션에 대한 설명은 아래와 같다.


활성화하면 오디오 클립이 메인 스레드에서 정지됨 없이 백그라운드에서 로딩되어집니다. 씬이 재생을 시작하면서 모든 오디오클립이 로딩을 마치게 되는 표준 Unity 동작을 확립하기 위해 디폴트값이 꺼져 있습니다. 아직 백그라운드에서 로딩 중인 오디오클립의 재생 요청은 클립이 로딩을 마칠 때까지 미뤄집니다. 로딩 상태는 AudioClip.loadState 프로퍼티를 통해 쿼리가 가능합니다.


즉 이말은 해당 옵션을 체크하게되면 음악이 전부다 불러와지지 않았음에도 불구하고 재생될수도 있다는 것인데 이럴 경우 AudioClip.loadState 확인을 통하여 재생이 가능한지 확인을 하고 재생을 하는 것이 바람직하다는 의미인 것 같다.

반응형
반응형

데이터 불러오는 부분

public SaveData LoadData()
{
DataSaveManager dsm = new DataSaveManager();
if (Application.platform == RuntimePlatform.Android)
{
Debug.Log("안드로이드");
return dsm.LoadGameData2();
}
Debug.Log("PC");
return dsm.LoadGameData();

}
//안드로이드
public SaveData LoadGameData2()
{
string filePath = "file:///"+Application.persistentDataPath + "/data.json";

SaveData saveData;
Debug.Log("파일검색:"+filePath);
WWW www = new WWW(filePath);
while(!www.isDone) {}
string dataAsJson = www.text;
Debug.Log(dataAsJson);
Debug.Log(dataAsJson != "");
if (dataAsJson != "") {
Debug.Log(dataAsJson);
saveData = JsonUtility.FromJson<SaveData> (dataAsJson);
} else
{
saveData = new SaveData();
}
return saveData;
}

여러가지 방법이 있지만 위처럼 해야지 정상적으로 되더라

www에 while을 사용하지 않고 IEnumerator를 사용하는 경우도 있었는데 데이터의 리턴을 받는 부분에서 PC와 동일한 방식으로 하고싶어서 while을 사용하여 기다려주었음.


데이터 저장하는 부분

public static void SaveData()
{
DataSaveManager dsm = new DataSaveManager();
dsm.SaveGameData(saveData);
}
public void SaveGameData(SaveData saveData) {
Debug.Log("파일 저장!");
string dataAsJson = JsonUtility.ToJson (saveData);
Debug.Log(dataAsJson);
string filePath = Application.persistentDataPath + "/data.json";
Debug.Log(Application.persistentDataPath + "/data.json");
Debug.Log(Application.dataPath + gameDataProjectFilePath);
File.WriteAllText (filePath, dataAsJson);

}


이것말고도 streaming asset에다가 데이터를 넣고 입출력하는 방법으로 시도해보았는데 데이터를 쓰는 부분에서 정상적으로 처리가 안되었다.


streaming asset에다가 데이터를 넣으면 Application.streamingAssetsPath로 접근을 해야하고

어플리케이션 데이터를 저장할때는 Application.persistentDataPath에다가 해주는게 맞는 것 같다.


Application.persistentDataPath

When you publish on iOS and Android, persistentDataPath points to a public directory on the device. Files in this location are not erased by app updates. The files can still be erased by users directly.


Application.streamingAssetsPath

The path to the StreamingAssets folder (Read Only).


Streaming Asset은 데이터를 읽는것밖에 되지 않아서 위의 말대로 게임 데이터는 마음대로 수정이 가능한 persistentDataPath에다가 읽기, 쓰기를 하는 것이 맞다.



맥에서 데이터 경로로 접근하기 위해서는 추가적인 환경설정이 필요하다. 아래 글을 참고하자

유니티 MAC Application.persistentDataPath 경로 이동

반응형
반응형

유니티 모펍 페이스북 광고 네트워크를 연동하기 위해서는 여러가지 조건이 필요한데 기억나는대로 적겠다.



facebook이 테스트 사용자 휴대폰에 설치되어있어야하며 광고 관리자 계정과 동일한 계정으로 로그인이 되어있어야함



모펍에서 추가한 페이스북 네트워크의 placement ID와 페이스북에서 제공해준 placement ID가 동일해야함


SDK가 잘 연동되어있어야함(jar, aar)

필자의 경우 2개의 라일브러리를 설치하였음 AudienceNetwork.aar, mopub-facebookaudiencenetwork-adapters-5.1.0.0.jar


주의할것은 다른 광고 연동을 하다보니

com.android.support.support-compat-26.1.0

com.android.support.support-core-ui-26.1.0

com.android.support.recyclerview-v7-26.1.0.aar

이런것들(필수 라이브러리가 꽤 많더라 한 7개였나? 라이브러리 관련해서 똥빠지게 뒤지다보면 이거 모아놓은것을 쉽게 찾을 수 있음)은 기본적으로 설치가 되어있다는 가정하에 말하는거임 얘네들 없고 위에 2개만 설치한다고해서 광고가 돌아가지는 않을거임


C:\jump\Assets\MoPub\Plugins\Android\MoPub.plugin\libs 아래에

mopub-facebookaudiencenetwork-adapters-5.1.0.0.jar 파일 다운로드 링크

C:\jump\Assets\Plugins\Android 아래에

AudienceNetwork.aar 다운로드 링크


최신파일을 받으려면 아래 사이트에서 참고


라이브러리를 제대로 설치안하면 아래와 같은 경고가 나오더라


로그캣에서 facebook으로 검색해보면 아래와 같은 로그가 나타난다.

01-27 15:35:52.347 8681-8762/? W/MoPub: Class not found for attempted network adapter class name: com.mopub.mobileads.GooglePlayServicesAdvancedBidder

    Class not found for attempted network adapter class name: com.mopub.mobileads.FacebookAdvancedBidder

01-27 15:35:52.349 8681-8762/? W/MoPub: Class not found for attempted network adapter class name: com.mopub.mobileads.FacebookAdvancedBidder

01-27 15:35:52.353 8681-8681/? W/MoPub: Ignoring unknown class name com.mopub.mobileads.FacebookRewardedVideo

01-27 15:35:52.406 8681-8681/? W/MoPub: Ignoring unknown class name com.mopub.mobileads.FacebookRewardedVideo

01-27 15:35:54.094 8681-8681/? D/MoPub: Attempting to invoke custom event: com.mopub.mobileads.FacebookBanner

    Couldn't locate or instantiate custom event: com.mopub.mobileads.FacebookBanner.

01-27 15:35:54.160 8681-8681/? E/MoPub: Couldn't create custom event with class name com.mopub.mobileads.FacebookRewardedVideo

01-27 15:35:54.981 8681-8681/? E/MoPub: Couldn't create custom event with class name com.mopub.mobileads.FacebookRewardedVideo


com.mopub.mobileads.FacebookAdvancedBidder 이 파일이 없어서 생긴 오류임을 알 수 있다.

2019 1월 27일 기준 아래 링크에서 최신파일을 받을 수 있다

링크


해당 jar파일은 아래 경로에 넣어주도록 한다

Assets\MoPub\Plugins\Android\MoPub.plugin\libs


본인의 기기가 광고 테스트 기기에 등록이 되어있어야함

일단 광고테스트를 하다보면 본인의 기기가 테스트 기기 등록이 안되어있을경우 아래와 같은 로그가 나옴

01-27 15:45:30.419 11298-11298/? D/AdInternalSettings: Test mode device hash: 10259d71-ed3d-435d-8580-3f5401de6b25

    When testing your app with Facebook's ad units you must specify the device hashed ID to ensure the delivery of test ads, add the following code before loading an ad: AdSettings.addTestDevice("10259d71-ed3d-435d-8580-3f5401de6b25");

저 해쉬를 복사해서 테스트 기기로 등록해주자



여기까지해서 테스트 디버깅이 잘 된다면 이제 한시름 덜었다

에러가 발생하면 에러원인을 잘 알려주니까 말이다(진짜 욕이 안나올수가없다 페북 광고연동 너무 불친절해 xxx들아)


오른쪽에 no fill 원인 링크를 찾아 들어가면 자세하게 원인을 알려준다.


나는 배너광고는 잘 뜨는데 아래와 같은 로그가 발생했다.

Rejecting re-init on previously-failed class java.lang.Class<ul>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/SafeBrowsingResponse;

찾아보니까 광고에 영향을 주는 에러는 아니라고 한다.(실제로 광고는 정상적으로 호출되는데 로그가 남았었음)


MoPub.InitializeSdk는 한번만 해야한다.

잘 모르고 MoPub.InitializeSdk를 동영상광고 한번 배너광고 한번 따로따로 해줬는데 그렇게하면 오류는 발생하지 않지만 설정하는 과정에서 이후에 설정한 MoPub.InitializeSdk값이 제대로 반영이 되지 않는다.

// NOTE: the MoPub SDK needs to be initialized on Start() to ensure all other objects have been enabled first.


반응형
반응형

빌드하는데 아래와 같이 알 수 없는 오류가 발생한다.


IOException: Sharing violation on path C:/jump/jump.apk

System.IO.File.Delete (System.String path) (at <ac823e2bb42b41bda67924a45a0173c3>:0)

UnityEditor.Android.PostProcessor.Tasks.MoveFinalPackage.Clean (System.String path) (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.Android.PostProcessor.Tasks.MoveFinalPackage.CleanAPKs () (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.Android.PostProcessor.Tasks.MoveFinalPackage.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.Android.PostProcessAndroidPlayer.PostProcess (UnityEditor.BuildTarget target, System.String stagingAreaData, System.String stagingArea, System.String playerPackage, System.String installPath, System.String companyName, System.String productName, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.Android.AndroidBuildPostprocessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args, UnityEditor.BuildProperties& outProperties) (at <e1c3953b4cf040ddb1400046b1c34897>:0)

UnityEditor.PostprocessBuildPlayer.Postprocess (UnityEditor.BuildTargetGroup targetGroup, UnityEditor.BuildTarget target, System.String installPath, System.String companyName, System.String productName, System.Int32 width, System.Int32 height, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:286)

UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)


대강 느낌상 C:/jump/jump.apk 파일을 삭제할 수 없다는 오류로 이해가 되어서 확인해보니 apk파일을 반디집으로 열고있어서 삭제가 안돼서 apk를 덮어씌워서 생성할 수가 없어서 생기는 오류였다.

반응형
반응형

패브릭에서 오류 메시지를 발견했다.



Fatal Exception: java.lang.Error: FATAL EXCEPTION [main]

Unity version     : 2018.3.0f2

Device model      : TrendMicro GI-I9500_TMMARS

Device fingerprint: Samsung/unia_x86/vmi:5.1/LMY47D/roland10201431:userdebug/test-keys


정확히 어떤 경우에 발생하는지는 모르겠지만 안드로이드 java에서 native로 지원하는 함수가 없어서 발생한 오류임을 짐작하였다.


Caused by java.lang.UnsatisfiedLinkError: No implementation found for void com.unity3d.player.UnityPlayer.nativeRestartActivityIndicator() (


nativeRestartActivityIndicator라는 메소드 명을봐서는 지금 내 앱에서 겪고있는 문제가 앱을 전환하였을때 오류가 발생한다고 하는데 그 오류인 것 같다.(정확하지는 않음)


그래서 구글에서 찾아보니 빌드했을때 

빌드 gradle에

ndk {
    abiFilters 'armeabi-v7a', 'x86'
}

위와 같이 설정하라고 한다.


어디선가 익숙하다 싶었는데 빌드할때 용량줄이려고 target architectures에서 x86부분을 체크를 해줬던 기억이 났다.

다시 x86부분을 체크하고 빌드를 하였다.


x86을 체크하냐 마냐에 따라서 아래 apk파일아래에 x86폴더가 만들어지는지 안만들어지는지 차이가 생기는 것을 봐서 이 부분을 체크해주면 문제가 해결될 것 같다.

위는 apk아래 lib폴더 아래에서 볼 수 있다.

만약에 빌드시 x86을 체크해제하면 x86 부분이 없어진다.


또한 문제가 발생한 기기의 cpu 기반이 x86인것을 봐서는 이 문제가 맞는 것 같다.

반응형
반응형

앱을 올리면 앱 서명란에서 앱에 대한 인증서 파일을 올리라고 한다.

유니티를 사용하는 사람들은 나처럼 안드로이드 스튜디오를 쓰는게 귀찮을테니까 두번째 방식을 선택해서 키를 만들도록 하자.


pepk 도구를 다운받는다. java가 윈도우에 설치되어야한다.

모자이크 걸린곳은 구글 암호화키다. 적어놓자


keystore파일과 jar파일을 한곳에 둔다. keystore 만드는 방법은 아래 링크가서 확인

키스토어 파일 만들기


그러면 이제 cmd창을 켜서 구글 인증서 파일용 pem 파일을 제작하자



명령어 양식은 아래와 같다.

java -jar pepk.jar --keystore=user.keystore --alias=alias--output=user.pem --encryptionkey=asdasdsadafffaedwddawdawdadwawdadadwdw

파란색 부분을 각자 상황에 맞춰서 입려하자 암호화키는 구글 사이트에 적혀있다.



그러면 pem파일이 만들어지는데 구글 앱스토어에다가 올려준다.

반응형
반응형

CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.

C:\Android\sdk\platform-tools\adb.exe -s "ce051605d060b10404" install -r "C:\jump\jump.apk"


stderr[

adb: failed to install C:\jump\jump.apk: 

]


보통 다른 블로그에서는 설치시 이미 설치되어있는 앱을 삭제하라고 나와있는데 그런 오류가 아니다.

알고보니까 핸드폰의 용량이 부족했다.


영화한편 지우고 나니까 잘됨

ㅡㅡ 아오 또 쓸모없는 삽질

반응형
반응형

유니티 파이어베이스 설치시 Microsoft.VC90.CRT.manifest could not be extracted! 오류가 발생한다.

국내나 해외나 해결방법에 대한 글이 거의 없다.

꽤나 오랜시간을 뒤져봤다.

주로 vc 9.0을 다시 설치하라고 하는데 많이 해봤지만 해결하지 못한다.


원인은 generate_xml_from_google_services_json.exe파일이 Microsoft.VC90.CRT.manifest을 찾지 못하면서 발생하는 문제다.


그래도 오래걸리지는 않으니까 한번 시도해보자

https://community.norton.com/en/forums/dependent-assembly-microsoftvc90crt-could-not-be-found

1. Microsoft Visual C++ 2008 Redistributable Package:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en(link is external)

2. Microsoft Visual C++ 2008 SP1 Redistributable Package:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&displaylang=en(link is external)

3. Microsoft Visual C++ 2010 SP1 Redistributable Package:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c32f406a-f8fc-4164-b6eb-5328b8578f03


그 다음으로는 닷넷도 설치해보고 이것저것 많이 해봤는데


현재 작동중인 계정의 유저이름이 영어가 아니라서 이런다고 한다.

지금 당장 C:\Users로 가서 현재 계정이 한글인지 확인해보자

한글이라면 계정을 새로 생성해서 빌드를 해보자


영어로 윈도우 계정을 새로 파서 generate_xml_from_google_services_json.exe를 실행해보면 이제 위의 오류가 나오지 않는다.


유저명 폴더 한글에서 영어로 바꾸니까 잘된다.

아 화난다...

반응형