#include "Unity/EAGLContextHelper.h"

#include "Unity/GlesHelper.h"

 

 

がどちらもないって言われるの。

Unity + NCMB(ニフクラ)で。

xcodeでビルドすると。

 

での解決方法。

 

・Finderで、EAGLContextHelper.hを検索して、

 どこかにある、そのファイルと、GlesHelper.hと、それぞれの.mmファイルをコピーして、

 

・Unityでiosビルド後のファイルの、同じような場所(classes/unity/以下)にコピーすると、

 一応ファイルがないとは言われなくなる!

 

で。

 

さらにそこからフレームワークがなくて怒られちゃうので、

 

 

 
に沿って、必要なフレームワークを追加するの。
 
 
で、なんとか動いたの!
やったぜ!
 
 
 
 
 

 

 

 

 

 

 

 

 

unityのAndroid書き出しで、

 a failure occurred while executing com.android.build.gradle.internal.tasks

 

というエラーに悩まされて、いく数日。。

 

解決方法は見つからないけれど、

KeyStoreManagerから、別のAliasキーを作って、一度設定し、

元のキーに戻してから、”別名の .apk"ファイルを作ろうとしたら、

うまく行ったよ!

 

ということを、

書き残しておきます。

誰かが困った時に、届きますように。

 

 

 

a failure occurred while executing com.android.build.gradle.internal.tasks.workers$actionfacade
 

っていうエラーが出たの!

UnityのAndroidでbuildしようとしたら。

で、もう1日ずっとあれこれ調べていて。全然ダメで。

 

KeyStoreを作り直してもダメで、

JDKを新しくしても、Android のバージョンを上げてもダメで。

もーいやー!ってなったの。

 

最終手段として、

Unityのプロジェクトフォルダから、Asset以外は全部すてて、1から再設定したら

あっさり通ったよ!

 

という感じで。

またこれでハマって困った人が今後でてきたときに、ここに記す…パタリ

 

 

Unityで、Android用に吐き出して、GooglePlayにアップしようと思ったら、めちゃくちゃ困った話。

 

・Androidの最新SDKじゃないと申請できない!

 → Android Studioというソフトを入れて、そこから最新SDKを落としてくる

 → UnityのAndroidの設定で、最新のSDKをセッティングする

 

・JDKが対応してないとか怒られる!

 → Unityのバージョンを一度アンインストールして、再インストールする時に、

   Androidのタブを開いて、JDKとかも一緒にインストールする

 

・Publishing Settings / Keystore Managerで怒られる

 → Keystore Managerから、配信者のキーを作って、設定する。

 → 毎度、パスワードを入れる

 

※で!

・ Exportはできたけれど、Buildができない!(今ここ)

 

iPhone4Sを使ってまして。
調子に乗ってiOS7にしたら、アプリ開発で激ハマり…。

xcode4では、iOS7の機器を認識できないらしく。
xcode5にしないといけないけど、xcode5にするには、MAC OS X 10.7ではなく、10.8を購入するしかなく。もう何がなんだか。

xcode5にしたら今度は、iOS6のが作れなくなっちゃう??
うーん。
世の中にはまだまだiOS6の人も多いよね・・。
面倒だなぁ。

あーやっとうまくできた。ということで、備忘録。

参考にさせてもらったところ

でやりましたよ。

1)*-Info.plistをいじる。

$金 objective-c-background

*-info.plistの、Keyにある一番下のものを選ぶと、+とーが表示されるので、
そこで+を押すと、新しいKey?(Property?)が追加されるので、

「Required background modes」を選択。
それが出来上がったら、「Required background modes」の左にある▼を押して開き。

item0 とあると思うので、その右端の項目を選択して、上下矢印を押して、
「App provides Voice over IP services」を選択。
これで準備完了。


2)*AppDelegate.m に記述する( *ViewController.mではなくて)

- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[UIApplication sharedApplication] setKeepAliveTimeout:600.0 handler:^{[self icon];}];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
[self icon];
}

// iconバッジを表示するかどうか判定(セーブもするよ)
-(void)icon
{
// dateをロードしてくる。
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *loadDate = [def stringForKey: @"date_data"];
if(loadDate ==NULL) loadDate = @"2013/01/01 23:00:00";

// 現在時刻を取得
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"YYYY/MM/dd HH:mm:ss"];
NSDate* date = [NSDate date];
NSString* dateStr = [formatter stringFromDate:date];
NSLog(@"date =%@", dateStr);

// ロードしてきたdateと、現在のdateを比較する。
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
[inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSDate *dateA = [inputDateFormatter dateFromString: loadDate]; // セーブされてた時刻
NSDate *dateB = [inputDateFormatter dateFromString: dateStr]; // 現在時刻

// dateBとdateAの時間の間隔を取得(dateB - dateAなイメージ)
NSTimeInterval since = [dateB timeIntervalSinceDate: dateA];
NSLog(@"%f分", since/(60));
NSLog(@"%f時", since/(60*60));
NSLog(@"%f日", since/(24*60*60));

// 1分以上経過してたら(でもチェックは600秒後)
if(since/(60) >1){
NSLog(@"dateSave");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject: dateStr forKey: @"date_data"]; // 現在時刻をセーブして
[defaults synchronize]; // 即時反映

// 現在時刻をセーブ
NSString *ld = [defaults stringForKey: @"date_data"];
NSLog(@"%@",ld);

// iconバッジを付ける。
UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 1;

}else{
NSLog(@"no dateSave");
UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 0;
}
[inputDateFormatter release];
}


な感じ。
これで、ゲームを起動させて、ホームボタンで戻って、アプリをバックグラウンド状態にして。
600秒(10分)放置すれば、アイコンに①が表示される。

フォアグラウンド(ゲームを再起動)させた時に、同じところ(icon)を見にいって、
アイコンバッジが付いてたら、アイコンバッジを消す。みたいな事をしてますよ。
manekineco games.のアプリはだいたい以下のような構成で出来ています。

*ViewController.h
*ViewController.m
player.h
player.m
counter.h
counter.m
coin.h
coin.m
enemy.h
enemy.m

色々やって、自分なりにたどり着いた答えがこれで。
titleViewControllerとかは、画面遷移とかがわからないのでやめました。*ViewControllerの中でタイトルをUIViewで作って、表示したり非表示にしたりして対応。
画面戻ったり行ったりしたときにメモリがどーたらとか考えるのが面倒臭くて。

player.h(m)は、
-(void)create
-(void)born
-(void)move
-(void)anime
-(void)dead
みたいなので構成されています。createでとりあえず *ViewController上に必要分だけ作り置きしておいて、bornで表示させて、生きてる奴だけをmoveで動かすような。
animeは、moveの中から一定間隔で呼び出す的な?
他の、counter も、coin, enemyもほぼ同じ。

*ViewController.h(m)は、
-(void)createGameView
-(void)createTitleView
-(void)createResultView
とUIViewを、最初に全部画面を作り置きしておいて
それぞれ [titleView setalpha:0]とかで、隠したり出したり。かっこうわるいでしょ?笑。


-(void)move:(NSTimer *)timer
とかでゲーム本編を回したり、止めたり。

備忘録でした。
なんちゃら.h
CAEmitterLayer *emitterLayer;

と準備しておいて。

なんちゃら.m
のどこかに以下のようなものをかいてみる。
emitterLayer = [CAEmitterLayer layer];
CGSize size = self.view.bounds.size;
emitterLayer.emitterPosition = CGPointMake(size.width / 2, size.height / 2);
emitterLayer.renderMode = kCAEmitterLayerAdditive;
[self.view.layer addSublayer:emitterLayer];

↑のでパーティクルエフェクト出す用のlayerを作って、self.view.layerに追加。
この時点では何もでませーん。

さらに、以下のでそこに乗せるパーティクルの絵(とたくさんでる仕組み)を作って
CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
emitterCell.contents = (id)[UIImage imageNamed:@"tw.png"].CGImage;
emitterCell.emissionLongitude = M_PI * 2;
emitterCell.emissionRange = M_PI * 2;
emitterCell.birthRate = 80;
emitterCell.lifetimeRange = 1.2;
emitterCell.velocity = 240;
emitterCell.name = @"test";

で。この時点で動かしても、何もでませーん。
さらにこの下の所で、emitterLayerの、emitterCellsって所に、いまほど作ったemitterCell(名前がほぼ同じなのでややこしいけど、上で作ったもの)を登録する。
emitterLayer.emitterCells = @[emitterCell];

と、やっとこさぶわーっと表示されちゃうみたい。

1秒後に止まってほしかったら、以下のように後で作る emitterStop(自作)に時間がきたら飛ばすようにして、
[NSTimer scheduledTimerWithTimeInterval:1.00 target:self
selector:@selector(emitterStop) userInfo:nil repeats:NO];


以下みたいなのを作っておけば。ストップしちゃうのさ。
-(void)emitterStop
{
[emitterLayer setValue:@0 forKeyPath:@"emitterCells.test.birthRate"];
}


ちなみに setValue@0は、0個出るようにするから死んだみたいに見えるけど、生きていて、この後でも100とかまた同じように与えてあげれば動き出すみたいよ。


いやー。なんとなく意味がわかってきてよかった。
CAEmitterLayer が、パーティクル専用の透明な板。
CAEmitterCell が、出すパーティクルの絵とぶわーっと出る仕組み。
CAEmitterLayerのemitterCellsに、登録してあげることで出る。
って感じなのかもしれない!
ふーん。