原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Particleにポリゴンを使ってもいいじゃない。

Unity1週間ゲームジャム

前回の記事でも紹介しましたが、unityroomの1週間ゲームジャムに参加して「倉庫番系」のパズルゲームを投稿しました。PCなら誰でも遊ぶことができるので、是非、下のリンク先から遊んでみてください。

 

unityroom.com

この1週間ゲームジャムに参加すると締め切り日の二週間後にユーザ評価ランキングが発表され、その時初めて自分のゲームの評価点(楽しさ・絵作り・サウンド・操作性・雰囲気・斬新さ)が分かる仕組みなのですが、上のゲームはどの項目も3.5点前後という、至極平均的でなんとも言い難い評価を頂いております。ありがとうございます。

 

実質3日で作り上げたゲームとしてはこれでも上出来な結果とは思いますが、お祭りの中での評価点なので下駄を履かせてもらったのかなぁ、という気がしないでもない。
上位にランクされているゲームと比べてみると、自分の作品の至らなさばかりが気になってしまいネガティブな気分にもなりますが、この反省を生かして次のゲーム作りに励んでいきたいと思います。

 

反省文は早々に、本編

で、このゲームは各色のGEMを周囲のパネルを足し引きしながら同じ色のHOLEのところまで運ぶ、というパズルゲームなのですが、GEMと呼ぶオブジェクトは一般的な3Dモデルを使用するではなく、パーティクルを使って表示しています。

 

f:id:Karvan:20190716221151g:plain

パネル上のクルクル廻っているのがGEM

 

なぜ3Dモデルでなくパーティクルを使ったのか、というと

  • GEMはホログラムっぽく半透明で表示したい
  • GEMはずっとグルグル回っていて欲しい
  • GEMに当たり判定は必要ない
  • パネルを動かして移動するするので、GEM自体を動かすことはない

と、ここら辺の構想を実現するのに最適だと判断したからです。

 

もちろん、普通に3Dモデルを使ってホログラムっぽいシェーダーを用意しても良いのですが、UnityのParticleシステムなら既に用意されているシェーダー(Particles/Standard Surface)を使えば良いし、オブジェクトを回転させるのも簡単ですぐに実装できます。

 

パーティクルをポリゴンで

やり方をざっくり説明すると、ParticleシステムのRenderのRenderModeをMeshに変更し、そこに表示したいメッシュを指定するだけです。

 

f:id:Karvan:20190716221409p:plain

上の図の矢印の箇所

 

表示したい形状が立方体や球ならUnityにてプリセットされているメッシュを指定します、今回の場合は下の図のような四角鋲型のメッシュを用意して使用しました。

f:id:Karvan:20190716221434p:plain

 

ただ、これだけだとモデルにはColor over LifetimeやColor By Speedで指定した単一に塗られた色でしか表示できません。
なので前述のシェーダー(Particles/Standard Surface)にテクスチャを設定したマテリアルを作成し、RenderのMaterialにそれを指定しました。

 

f:id:Karvan:20190716221459p:plain

パーティクル用のマテリアル

 

マテリアルのBlending OptionsのRendering Modeに「Additive(加算)」を指定し、Mapsの項目に緑色のテクスチャを指定します。
テクスチャの模様をハッキリと表示させたい場合にはEmissonの項目にもテクスチャを指定すればよいです。

 

逆にParticleシステム側のColor over Lifetimeに白色の設定を行います。

f:id:Karvan:20190716221536p:plain

 

Particleを廻す

GEMはその場でグルグル廻ってほしいので、ParticleシステムのStart Speedには0を指定し、Rotation over LifetimeとEmissionの項目でパーティクルが回転するように設定を行います。

 

f:id:Karvan:20190716221648p:plain

 

以上、ざっくりとした説明でしたがポリゴンを使ったParticleの説明でした。
需要があるかどうかは微妙ですが、まぁこれも一つの手法ということで。。。

 

 

【Unity】締め切りに追われた一週間ゲームジャム

1週間ゲームジャム

先週(7/1~7/8)はunityroom主催で「1週間ゲームジャム」というイベントが行われていました。


これは文字通りUnityを使って1週間でゲームを作るイベントで今回で12回目の開催となります。


私も前々からこのイベントの存在は知っていて「面白そうだなぁ」とは思っていたものの、「一週間で作成するは無理だなぁ・・・」と尻込みしてしまい参加することはありませんでした。

 

ただ今年のゴールデンウィークにroom6主催のゲームジャムに参加して、ギリギリではあるものの何とか締め切り内にゲームを完成させることができたので、今回はこちらのゲームジャムにもチャレンジしてみることにしました。

 

まぁ、結果として期限の20時には間に合わなかったのですが、特に締め切られることなく無事に投稿することができました。

 

こんな感じのゲーム

パネルを使って同じ色のGEMを集めるパズルゲームです。

f:id:Karvan:20190709215700g:plain

 

難易度的には簡単な部類のパズルだと思うので是非遊んでください。

下のリンクから飛ぶことができます。

unityroom.com

 

振り返るよ

上の動画でもお分かりいただけると思うのですが、出来上がったゲームは非常に単純な内容でプレイ時間も短いゲームなんです。

 

とは言え、やっぱり1つの作品ができる上がるまでには色んな苦労がありました。 

今回はそれらを振り返った記事になります。

 

・月曜日(7/1)

朝、出勤途中にTwitterをチェックして「1週間ゲームジャム」が「あつめる」というお題で開催されたことを知る。


なので日中は仕事半分、ゲーム構想半分で過ごし、「絡まった糸をほどいて中央にリングを集める」という企画を頭の中でまとめる。

 

早速帰宅後にプロトタイプの作成に取り掛かる。色々と熱中し過ぎて深夜3時近くまで作業する。

 

・火曜日(7/2)

平日は6時半過ぎには起床しなくてはいけないので糞眠い。
日中は仕事半分、睡眠半分で過ごす。いや、1:2ぐらいかも。

 

帰宅後にプロトタイプの完成を急ぐが前日の無理が祟ったのか作業中に寝落ちする。
目を開けたら既に3時を廻っていたので、これ以上の作業を諦めて床に就く

 

・水曜日(7/3)

この日も帰宅早々からプロトタイプ作りに励む、そして深夜二時ぐらいになってあることにハッキリと気づく。明確な確信。それは。。。

 

f:id:Karvan:20190709221258p:plain

 

 行列計算とか駆使しないといけない事が分かって頭の悪い私には全く無理ゲーだった。

なので当初予定していた「絡まった糸をほどいて・・・」でのゲームは断念する。


つまり既に3日経過しているのに進捗は0、これから別のアイデアでのゲーム制作をしなくてはいけない。

 

f:id:Karvan:20190507220439p:plain

 

とはいえ、眠気には勝てないので明日きっと良いアイデアが浮かぶことを期待して就寝する。

 

 ・木曜日(7/4)

一からアイデアを練り直すにしても時間がないので、ゲームのジャンルを一番作業工数が少なそうなパズルゲームに絞る。期間内に出来上がることを優先しての決断

 

一口にパズルゲームとはいっても、ルールが複雑だったり、いろんなイベントが発生するようなものは時間が掛かるので、本当に単純で簡単にできそうなパズルゲームにしないといけない。とはいえ、ゲームとして不出来なものは作りたくないし、少しは個性を出したものに仕上げたい。

f:id:Karvan:20190507220034p:plain

 

とりあえず色々素材を並べて、それっぽい画面を作ってみる。

で、その画面を見ながらパズルのルールとかギミックとかを考えることに。

 

f:id:Karvan:20190709222944p:plain

結局、完成予想図として上のような画面で落ち着く。気がつけばやっぱりこの日も二時過ぎまで作業をしていた。

 

・金曜日(7/5)

この日から本格的に作業に取り掛かる。パズルのルールは半透明のGEMが乗ったパネルを押したり引いたりしてゴールまで運ぶという、いわゆる「倉庫番系」ゲーム

 

上・左ボタンを押すとその列にパネルが追加され、既存のパネルが押し出される。

下・右ボタンを押すと一番端のパネルが削除され、既存のパネルが引き寄せられる。

 ただし、端から連結されていないパネルは動ない

 

たったこれだけのルールなので少ない残り日数でも完成できるはず。明日は休みだし、徹夜でもすれば遅れを取り戻せるし、絶対間に合う。

そんな楽観的予測を胸に抱いたもの、前日までの深夜作業の影響なのか23時を過ぎたあたりから急激に眠くなり気が付けばベットの中。。。

 

この日はボタンを押してパネルが列に並ぶところまでしか完成しなかった。

 

・土曜日(7/6)

朝から作業を進めていくが思いのほかバグが多くて進捗が進まない。

一度パネルを連結した後に他の列のパネルを動かして連結状態を解除したはずなのに、なぜか一緒に動いてしまう。

一列全てをパネルで埋めた後、その列のパネルを全部消そうとすると、端のパネルだけ残ってしまう。

一日中ゲーム作りをすると誓ったはずなのに、なぜかサッカーを観るためにスタジアムへ出かけてしまう。。等々

何故か色々な問題が発生し、思うように進みませんでした。それでも明日という日に全てを掛けようと、明日こそは一日中ゲーム作りをしようと、そう心に誓っていた私は衝撃の事実を知ってしまったのです。

 

それは・・・

f:id:Karvan:20190709234820p:plain

 

 

f:id:Karvan:20190709235622p:plain

 

「え?20時締め切り・・・」

 

 

f:id:Karvan:20190709221258p:plain

(二度目)

 

 ・日曜日(7/7)

最終日となったものの完成にはほど遠く、積み残しの作業をざっと並べてみると

  • GEMがゴールに到達した判定
  • そもそもステージクリアの判定がない
  • っていうことはステージクリア⇒次ステージの処理もない
  • いや、その前にステージデータを読込む処理がない
  • 音楽、SEもない
  • ってか音を鳴らす処理がない
  • あ、あとUIもない

f:id:Karvan:20190710000422p:plain

もうこんな気分

 

とはいえギリギリまでは頑張ってみようと、休日なのに早朝に起床して作業に取り掛かる。

音を鳴らす処理は他のプロジェクトのソースをコピペして作成、ステージデータのCSVファイルを読み込む処理はネットから拾って、こちらもコピー&ペーストで作成。UIの素材やら音楽、SEもネットから。GEMの到達判定からステージのクリア等々へ続いていく処理は気合と勘と開き直りでコーディングする。バグ取りとか何それ?美味しいの?という感じで、作ったステージは一回PlayしてOKならそれでいいや、ってことにして、アイコン作ってビルドセッティングしてビルドをGO!!

 

・・・そうしてビルドが完了したのが20時06分

あとはこれをunityroomへアップして・・・・

f:id:Karvan:20190710001843p:plain

アップロード完了!!!

f:id:Karvan:20190710001905p:plain

 

どうもありがとうございました。

 

感想

room6のゲームジャムに参加した時もそうだったのですが、限られた時間で一つの作品を作り上げる、ということは非常にゲーム作りの勉強になりました。

 

ゲームを作っているとアレコレ要素を付け足したくなるものですが、時間に制約があると必要なものを優先して作らなくてはいけなくなるので、逆に何が必要なのかを見極める力がついたような気がします。

 

反省点としてはスケジュール管理をちゃんとしよう、ということですかね。今回の場合は途中で仕様を変えたことが原因ですが。

 

【Unity】ロックオンした敵を捉える、ロックオンを解除する

2019年上半期終了

早いもので2019年の上半期が終了し、今年も残り半年となってしまいました。

 

振り返ってみるとインディゲーム界隈では「World for two」がアプリランク1位となり、Bitsummitの盛況ぶりがマスコミで話題になるなど、インディゲームという分野の盛り上がりを感じた半年でしたが、個人的な振り返りをすれば、ゲームアプリをリリースするも特に市場にインパクトを残すことなくストアの山に埋もれてしまい、加えてAdmobのアカウントが停止されたり、GooglePlayからアプリがBanされるなど、散々な出来事しかなかった半年でした。

 

ヨルシカが「所詮、売れないなら全部が無駄だ」という歌詞を歌っていますが、まさにその通りであることを現在、実感しています。ゲームアプリの制作には苦労が多く、色々な努力を必要としますが、結果が出ないならそれらは全部無駄です。

 

とりあえず主機をつくる

とはいえ他にやることもないので、前回の記事でお知らせしたように、次回作は3D(2.5D)シューティングゲームの方向で試行版を作成しています。

 

そして最近の作業は、Playerの操る主機どうするか、ということに頭を痛めていました。

 

シューティングゲームということで、オーソドックスに戦闘機型のスペースシップを探してUnityのアセットストアを眺めていましたが、ローポリのものからハイエンドなものまで数多くの3Dモデルアセットが揃っており、色々と目移りして中々決められませんでした。

 

そうこうして時間ばかりが過ぎていくうちに頭が沸騰してきたのか、「格好いい戦闘機が主役のシューティングはストアに溢れている=同じことをしても目立たない=逆にシンプルなデザインの方がウケるかも」みたいなトチ狂った考えが湧き上がってきて、「とにかくシンプルに!無駄な装飾は全部削除!必要最小限の要素で最大公約数の機能を!」という仕事の出来ないSEが叫んでいそうな号令が頭の中で響く中、プリミティブなオブジェクトを組み上げて出来上がったのがこんな感じ。

 

ドン!!

f:id:Karvan:20190702205738p:plain

 

中抜きし過ぎたミニ四駆みたいですが、エリマキみたいなウィングもあるし戦闘機に見えなくもない。


名前は決めていないんですがとりあえず「ジラース」と呼んでいます。
(ジラースを知らない良い子はお父さんに聞いてみよう)

 

 ロックオンした敵を捉える

シューティングゲームということで、敵をロックオンして攻撃する、なんて機能を実現したいです。
その為には当然ながらロックオンした敵の方向へ弾丸を発射する必要があるので、自機を移動させながらもロックオンした敵の方向へ自機を向ける処理を実装しました。

 

オブジェクトを特定のオブジェクトの方向へ向けるメジャーな方法としてtransformコンポーネントのLookAtを使う手法があります。

 

this.transform.LookAt(targetObject.transform,Vector3.up);

 

こんな感じで指定すると、オブジェクトのZ軸方向(forward)をtargetObjectの方向へ向けることできます。


第二引数には上方ベクトルを指定しますがデフォルト引数がVector3.upとなっているので省略可能です。
もし、Z軸方向以外の方向へ向けたい場合は、この第二引数を変更する必要があります。

 

ロックオンを解除する

上記のようにロックオンした敵の方向に向く処理の実装は簡単なのですが、とはいえ、ずっとロックしておく訳にもいきません。
敵が画面の範囲外に移動してしまったり、敵と自機との距離があまりに離れてしまった場合には自動でロックを解除する必要があります。

 

今回の場合は、自機の進行方向と自機の向きとの角度を求めて、それが閾値以上になった場合にはロック解除する、とします。

 

図解するとこんな感じ、点線のベクトル(自機の向き)と実線のベクトル(進行方向)の角度を求めます。

f:id:Karvan:20190702211440p:plain

 

2つのベクトルの角度を求めるにはVector3.Angleを使います
自機の進行方向は常にZ方向なので、敵方向を向いた自機の向きベクトルを計算すればベクトルの角度が計算できます。

  

void Update()
{
	// ロック中の場合
	if(isLockOn)
	{
		// 敵方向を向くベクトル
		Vector3 diff = targetObject.transform.position - this.transform.position;

		// ロックターゲットとの角度計算
		var axisAngle = Vector3.Angle(new Vector3(0.0f, 0.0f, 1.0f), diff);

		 // 閾値以上の場合
		if (axisAngle > ThresholdAngle)
		{
			// ロックを解除する
			isLockOn = false;
		}
		else
		{
			// 敵の方向を向く
			this.transform.forward = diff;
		}
	}
}

 

敵の方向を向く処理には、先ほどはLookAtを使って説明しましたが、上のコードでは敵方向に向くベクトルを求めているで、それを利用してtransform.forwardに直接指定しています。

 

これらを使って実際に動作せるとこんな感じなりました。
敵をロックオンした後、敵との角度が急角度になると自動的にロックを解除しています。

f:id:Karvan:20190702211640g:plain

 

後は弾を打つだけなんですがねぇ。。。。

 

【Unity】ロックオンターゲットをパーティクルで作成する

試行錯誤

次回作についてアレコレ試行錯誤をしていく中で、『(知る人ぞ知る名作ゲーム)DATA WINGっぽいゲームを作ってみよう』などと、おこがましい考えが頭をよぎったのですが、案の定、早々に挫折してしまい、今のところ3Dシューティングゲームの方向でプロトタイプ版を作成している最中です。

 

f:id:Karvan:20190625235025p:plain

 

シューティングゲームなので銃弾を発射するのは当たり前なのですが、他のシューティングゲームでもそうであるように、ただ弾丸が前方に飛ぶだけでなく、敵をロックして誘導弾を発射するといったロックオンシステムも実装しよう、と思うわけです。

 

ここで敵をロックする、ということはそれがプレイヤー側に分かるようにロックオンターゲットを表示する必要があるわけで、今回はこのロックオンターゲットを表示する手法についてのお話

 

ロックオンターゲットの表示

ロックオンターゲットを表示する手法は色々あるのですが、代表的なものとしては

  • uGUIにてターゲットを表示する
  • Spriteでターゲットを表示する

といったような手法があります。

 

どちらの手法でもメリット・デメリットがあり、uGUIを使う場合、ターゲットアイコンはスクリーン上にあるので絶えず同じ形で表示できますが、ロックしたオブジェクトが動くたびにスクリーン上の座標を求めて追従させる必要があります。

 

また、Spriteを使う場合はターゲットアイコンをロックオブジェクトの子オブジェクトにすれば追従させる必要がないので手軽に実装できますが、親オブジェクトの向きに影響されてしまうので、絶えずスクリーンの方を向いて表示させようとするとちょっと面倒くさいです。

 

なので、これらのデメリットを解消するためにParticleSystemを使ってロックオンターゲットを表示させることにしました。

 

参照したのは以下の記事です。

qiita.com

 

ターゲットのアニメーション設定

ParticleSystemでもSpriteのようなアニメーションを設定することが出来ます。
今回はコマ割り画像を連続表示させてターゲットがグリグリ廻るアニメーションを作ります。

 

1.アニメのコマ割り画像を並べて一枚の大きな画像(Texture)を作る。

今回はこんな画像を作りました。

f:id:Karvan:20190625233131p:plain

 

2.そのTextureを指定したマテリアルを作る。

Particles/Additiveなどのシェーダを使ったマテリアルに先程のTextureを指定します。

f:id:Karvan:20190625233215p:plain

見づらいけどTextureに先ほどの画像を指定しています。

 

3.Particle SystemのTexture Sheet Animationでアニメーションを設定する

f:id:Karvan:20190625233338p:plain

 

ModeをGridに指定すると、Tilesと言う項目が現れます。

これは『TestureをX/Yのそれぞれに対して何分割するか』を設定しています。


これに加えてAnimationにWholeSheetを設定することで、テクスチャシート全体を順にアニメーションさせるようにします。

 

その他の設定

上記の設定でターゲットのアニメーションはできました。
次にParticleSystemを以下のように設定していきます。

 

f:id:Karvan:20190625233842p:plain

・LoopingのチェックをONにする

・PreWarmをONにして起動と同時に発生するように

・StartSpeedを0にしてその場に留まるようにする

 

f:id:Karvan:20190625234052p:plain

・RenderのRenderModeをBillboardに設定、併せてRender AlignmentにViewを設定

Billboardに設定することで、ターゲットのParticleは絶えずカメラ方向を向いて表示されるようになります。

 

あとはこのParticleSystemをロックオンしたオブジェクトの子オブジェクトに設定すればロックオンターゲットの完成となります。

 

f:id:Karvan:20190625234138g:plain

ロックオンしたオブジェクトにターゲットParticle表示

 

注意事項と追加

LoopingのチェックをONにしているので、Particleの生成を停止(=Stop)しただけではターゲットは消えません。


ターゲットを非表示にするにはStopコール時に生成済みパーティクルを全消去するオプションを設定するか、ParticleSystem自体のSetActiveをfalseにする必要があります。

 

ロックオンターゲットとしてはこれで十分なのですが、ちょっとコレだけでは地味なので、ターゲットのParticle表示前にロックオン発生のParticleを追加してみました。

 

こんな感じ

f:id:Karvan:20190625234314g:plain

わかりますかね?

ロックオンターゲット表示前に六角形が収縮するParticleを表示しています。

 

なとなくシューティングゲームっぽくなってきた気がしますが、未だ銃弾を撃てないんですよね。。。

 

【Unity】Alipay SDKについての続報

前回からの続報

前回の記事でAlipay SDKの使用を理由にGooglePlayからBANされた場合の対処法を記載しました。

www.karvan1230.com

その記事での紹介した対処法は

現在の回避策は、IAPを使用していない場合はUntiyChannel.libを削除し、Xiaomi Store SDKを追加しないようにすることです。

というものでしたが、当該トピックスに関するUnityForumでの議論は未だ続いているようです。

 

https://forum.unity.com/threads/google-bans-app-due-alipay-sdk.687451/

 

前回記事からの追加の情報としては、

IAPを使用していない、またはXiaomi Game Center SDKを使用していないにもかかわらずこの問題の影響を受けている場合は、Android Studioを使用してBuild / Analyze APK ...を選択し、APKを表示してプロジェクトのルートにあるAndroidManifestを確認し、XiaomiまたはAliPayへの参照を探します。参照が表示されない場合は、ゲームをGoogle Playに再送信しても問題ありません。

と言う返信がUnity Technologiesから上がっています。

 

GooglePlayから同じような理由でBANされていて、プロジェクトフォルダのPulginフォルダ内に「UnityChannel」が見当たらない、と言う方は、上記のように一度、Android Studioを使用してAndroidManifestを確認することをお勧めします。

 

進捗が無い・・・

ここ最近は次回作についてアレコレ試行錯誤して時間を過ごすばかりで、コレといった進捗がありません。

 

そもそも葦名の国でラスボスを倒したけどそのまま二週目を始めちゃってUnity起動してない、って話もありますけど、とりあえず夏までには簡易なプロトタイプ版をunityroomなりに公開できるように頑張りたい・・・と思います。

 

【Unity】GooglePlayにアプリをBan(削除)された話

人生Bluetooth

これまでゲームアプリを2本リリースするもコレといって話題にならず、ダウンロード数も伸びず、InideGameFestivalの審査にも落ち、アプリ宣伝用の資金も尽きたので、ゲーム開発者として底辺から這い上がるすべが全く見つからない現状なのに、以前から注目していたお顔がバカリズムにそっくりな平野センセイは5ちゃんねるにスレッドが4つも立つほどの大ブレイクを果たし、同期の友人は結婚して、フォロワーのツイートがバズる等、私の廻りではうらやましいことばかりが起こって、人生の世知辛さを身をもって体験している今日この頃、とりあえずモー娘。の新曲でも「どうでも良いような場面からヒント掴むから上に立つ」「待ってるときは来ないのに無意識なれば現れる」と唄っているので、それを信じて時が来るのを待ちたちと思います。

f:id:Karvan:20190611231053p:plain

 

ある日突然・・・

 

Gmailが一通のメッセージを受信しました。

 Hi Developers at Stab of Bee Project,
After review, Dull Things No Life,  has been removed from Google Play due to a policy violation.

(ハーイ、Stab of Bee Projectの開発者、ポリシー違反が見つかったから君たちのアプリ、"Dull Things No Life"はGoogle Playから削除したよ。)

なんともアメリカンらしい軽い口調で絶望的な内容を送ってくる、しかも英語で。

"ハーイ"じゃねぇよ、ヘーベルハウスか。

 

つい3ヶ月前にもAdMobの広告停止の通知が送られてきたことがありましたが、そのときも事前通告無く、一方的にAdMobアカウントが停止されましたね。

 

Googleさん、何か処分する前にちょっと確認するとか、是正を求める通知を出すとか、少しぐらい救済措置を考慮しても良いんじゃないですかね?そりゃトランプが大統領になるわ。

 

AdMobの広告停止の件に関しては私にも心当たりがあったので素直に反省したのですが、今回ばかりは身に覚えの無い罪を被せられた気持ちで、こっちとしては冤罪を訴えたい気持ちです。

 

なんせBanの理由が 

We've identified that your app is using Alipay SDK or library, which facilitates the transmission of phone number information without meeting the prominent disclosure guidlines.
(君のアプリがAlipay SDKまたはライブラリを使用していることが分かったんだ。これを使うとさぁ、ガイドライン?何それ?って感じで電話番号情報の収集が簡単になっちゃうんだよねぇ。)

いや、Alipay SDKとか知らんし、そんなSDK導入した覚えないし、むしろはじめて聞いたわ、そんなSDK 

Prior to the collection and transmission, it must prominently highlight how the user data will be used, describe the tyep of data being collected and have the user provide affirmative consent for such use.
(そんな情報を収集するんなら、ちゃんとデータの使用目的とか、データの種類とか説明する必要があるし、ユーザーとの同意も必要でしょ。)

 

If necessary, you can consult your SDK provider(s) for further information, or please upgrade AliPay SDK version to 15.5.5 or higher.
(もし必要なら、SDKプロバイダに問い合わせるか、AliPay SDKバージョンを15.5.5以降にアップグレードしてね。)

 

 Good Luck!とかでも言いたげな軽い文章。こちらとしては身が震える想いなんですがね。

 

そもそも全く導入した覚えの無いSDKの名前を挙げられても「SDKプロバイダに問い合わせる」とか「SDKバージョンをアップグレードする」とか無理ゲーじゃないですか。

 

「AliPay SDK」とか検索しても怪しげな中国語のページしかヒットしないし、Twitterを確認しても中華系アカウントのツイートしか上がっていないし、お手上げ状態。もう最後の望みでUnityのフォーラムを覗いてみると・・・あった!

 

Untiyフォーラムでの議論

Untiyフォーラムで、同様の理由でGoogle Playからアプリを削除された方のスレッドが上がっていました。

https://forum.unity.com/threads/google-bans-app-due-alipay-sdk.687451/

 

全編英語なので、スレッドのやり取りを掻い摘んで説明すると

スレ主:AliPay SDKを使用してるからって理由でアプリを削除されたんだけど、そんなSDK使ってないよ

 

スレ主:Unity Teamに連絡したらUnityChannelというプラグインにXiaomi SDKがデフォルトで含まれていて、このSDKの中にAlipay SDKが含まれているみたい

 

スレ主:IAP購入サービスを有効にするとこのSDKが含まれてしまうから、UnityChannel.aarを手動で修正するしかないね。

 ということらしい。


この"IAP購入サービス"ってアプリ内課金用のサービスことだと思うのですが、Dull Things No Lifeでは課金処理は実装していません。サービスウィンドウを開いて確認しても In-App Purchasingの欄はOFFになっています。

 

f:id:Karvan:20190507220034p:plain

ん~・・・

 

返信1:Xiaomi Mi Game CenterのSDKが問題だと思います。それらを削除する必要があります。

 

返信2:Build SettingsでXiaomi Mi Game CenterのSDKを追加している?それを削除しましょう。

f:id:Karvan:20190611233326p:plain

 

 返信3:私のアプリも同じ理由でGooglePlayから削除されました。でも、Xiaomi Mi Game CenterのSDKは追加していません。

 

私もBuild Settingsを確認しましたが、Xiaomi Mi Game CenterのSDKは追加していませんでした。(ADDボタンなんて押してない)

 

ただ、後で思い出したのですが Dull Things No Life開発段階でアプリ内課金の実装を検討していて、途中でIn-App PurchasingをONにしていた時期がありました。(現在はOFFにしています)

 

ここで物事が面白くなるところです。

返信4:現在、IAPを使用していなくても、過去に有効にしていた場合はUntiyChannel.aarライブラリは存在し、Alipay SDKがパッケージ化されます。Xiaomi Store SDKが含まれている場合も同様です。

 

!!!

つまり、一度でもIn-App PurchasingをONにしてビルドしている場合は、その後、設定をOFFにしてビルドしてもUntiyChannel.libはデフォルトでパッケージに含まれてしまう=Alipay SDKも含まれる、ということで、なんだそれ。なんの罠だよ。

  

返信4(つづき):現在の回避策は、IAPを使用していない場合はUntiyChannel.libを削除し、Xiaomi Store SDKを追加しないようにすることです。

あ~なるほど、では早速その回避策を試してみましょう。

 

UntiyChannelの削除

プロジェクトのフォルダを確認するとPulginsフォルダの下にUntiyChannelというフォルダがあることが確認できます。

そしてその中にはXiaomi Supportなるディレクトリがあるのがわかります。

f:id:Karvan:20190611234212p:plain


エクスプローラーで確認するとこんな感じ

f:id:Karvan:20190611234243p:plain

 

ちなみにPackageManagerで確認するとUntiyChannelと言う項目は表示されません。

f:id:Karvan:20190611234500p:plain

 

前述のようにDull Things No LifeではIAPを使用しない(アプリ内課金を実装していない)ので、UntiyChannelは不要だと判断して、このフォルダごと削除しました。

 

プロジェクトの再ビルドが掛かりますが、特にエラーがでることはありませんでした。
そのままBuild SettingsからAPKファイルを作成⇒GooglePlayにアップロード。


しばらく経つと、GooglePlayにDull Things No Lifeが再リリースされているのを確認できました。

bit.lyこのリンクでアプリページに飛べるはず

 

今のところ再BANは無い模様

UntiyChannel削除版をGooglePlayにアップロードして3日経過していますが、今のところ再BANされていません。


AdMobの広告も問題なく表示されているので、UntiyChannelを削除する対応で間違っていないようです。

 

ちなみにIAPを使用している場合の回避策も同じ返信の中に書かれています。

返信4(つづき):アプリにIAP Unity Serviceが必要な場合は、Unity側の対応を待ってアップデートするか、IAP Unity Serviceを削除後、プロジェクトをエクスポートしてAndroid StudioのプロジェクトにIAPをネイティブ追加する対応を行ってください。

「Unity側の対応を待つ」とか中々シビアな対応だと思うのですが、ただ、今回の問題ってUntiyを使用している殆どのアプリが対象になるのに、Twitter上で同じような報告が全く上がっていないのが非常に不思議で仕方ありません。

 

それともこれから同様のケースが増えてくのでしょうか?状況を注視していく必要がありますね。

 

【Unity】オブジェクトをHEX(六角形)座標系に沿って並べる

インディゲームイベント・・・って楽しそう

先週末はインディゲームの一大イベント"BitSummit"が京都で開催されたそうで、Twitter等にはイベントの盛況が数多く投稿されていました。

私もいずれはそんな大きなイベントに参加できるようになりたいのですが、現状ではお金も時間もコミュ力もないし、互いをハンドルネームで呼び合う文化にも慣れていないので、今は力を蓄える時期だと考えて頑張りたいと思います。

 

六角形にロマンを感じる

まぁそんなことはさておき、大戦略や三国志等にはまった世代の嗜好として、どんなジャンルのゲーム画面でも継ぎ目の無い綺麗な世界(マップ)を見たときより、六角形のタイルで敷き詰められたマップを目にしたときの方がワクワクするというか、なんとなくロマンを感じます。

 

f:id:Karvan:20190604220037p:plain

こんな感じのマップとか、六角形のタイルが並んでいるだけで面白そうに感じる。

 

なので、次回作ではHEX(六角形)マップを取り入れたゲームにしたい=オブジェクトをHEX(六角形)座標系に沿って並べる必要がある、ということで、HEX(六角形)マップでの座標の計算にチャレンジしてみました。

 

HEX座標を直交座標に変換する

HEXマップの基本的な考えとして、隣接する各HEX同士の距離は必ず等しくなります。

 

f:id:Karvan:20190604220231p:plain

 

ということは、上図の場合だとX方向に並んだHEXはHEXの幅の等間隔で並んでいるのでX方向の座標計算は難しくないですね。

 

ただ、Y方向の座標は三角関数を使って計算する必要があります。
また、Y方向に並んだHEXは互い違いにX方向にズレて並ぶので、そのズレも計算する必要があります。

 

f:id:Karvan:20190604220311p:plain

 

まぁ、高校レベルの数学の知識があれば難しい話しではないのでしょうが、ただ、直交座標系から見えればY方向のHEXはジグザグに並んでいるので、前述したX方向のズレは一つおきに考慮する必要があります。面倒くさい。

 

f:id:Karvan:20190604220419p:plain

 

上図の考えをコーディングするとこんな感じ

 

    /// <summary>
    /// HexGrid座標からローカル座標へ変換
    /// </summary>
    /// <param name="hexPos"> HexGrid座標</param>
    /// <returns>ローカル座標</returns>
    public Vector3 Cal_HexPosToViewLocalPos(Vector2 hexPos)
    {
    	// Y方向高さ
        Hex_Height = Hex_Width * Mathf.Sin(60.0f * Mathf.Deg2Rad);
        
    	// X方向のずれ
        Hex_Adjust = Hex_Width * Mathf.Cos(60.0f * Mathf.Deg2Rad);
        
        float grid_X = Hex_Width * hexPos.x + Hex_Adjust * Mathf.Abs(hexPos.y % 2);
        float grid_Y = Hex_Height * hexPos.y;

        return new Vector3(grid_X, grid_Y, 0.0f);
    }

 

では、実際にこの関数を使って六角形のオブジェクトを並べてみよう。

 

f:id:Karvan:20190604221536g:plain

おお、案外上手くいっている!
あとはコレをどうやってゲームに落とし込むかで。。。

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。