UnityのAndroid課金PluginであるPrime31 In App Billingを使用していた時に
発生した問題とその対応方法を書き残しておく。
つい此間まで、課金処理のイベントで購入後
purchaseSucceededEventが返ってきていたのに
purchaseCompleteAwaitingVerificationEventが返ってきてしまうようになっていました。
prime31のドキュメントもソースコードのコメントも、いまいちニュアンスがつかめず
何の認証を待っているのかわかりませんでした。
色々試しましたが、その中でおそらくこれが対策として良いものであると言えそうなものを
挙げておきます。
1.
Google Play Consoleの振込先口座の設定状態を見直す。
登録中ならさっさと登録を済ませて完了させておく。
2.
GoogleIAB.init(publicKey);のあとに
GoogleIAB.setAutoVerifySignatures(true);
を追加しておく。
これが何の認証かよくわからない、だいたいサンプルはこれを使っていない。
3.
これは、アンチパターンだけれども
purchaseCompleteAwaitingVerificationEvent内には何も処理を書かない。
最初、purchaseSucceededEventが来ないなら同じ処理をよびだしちゃえと思って
purchaseSucceededEvent内の処理を呼び出していたけど何故かNullReferenceが
発生していました。
なので、purchaseCompleteAwaitingVerificationEventは引数をデバッグ出力する
記述しか残していません。
おそらく2.の記述により、
purchaseCompleteAwaitingVerificationEventが発生するけれども
そのあとにちゃんとpurchaseSucceededEventが発生するようになりました。
しかし、誰もpurchaseCompleteAwaitingVerificationEventが発生したことがないのか
ネット上では対策が見つけられなかった。
それともみんな、setAutoVerifySignaturesを設定するのがデフォルトなことになって
いるのでしょうか。
2014年10月20日月曜日
2014年7月16日水曜日
[Unity]アプリのファイルパス一覧
Unityでのファイルパスの指定が、AndroidとiOSでどこになるかよく忘れるのでメモ
http://qiita.com/bokkuri_orz/items/c37b2fd543458a189d4d
iOSでは、Application.persistentDataPathにアプリの内部データを保存すると規約違反でリジェクトされるようです。
対策は、
https://developer.apple.com/jp/devcenter/ios/library/documentation/FileSystemProgrammingGuide.pdf
上記リンクのiOSのファイルシステムについてを読んだ感じだと
Application.temporaryCachePath.Replace("Caches", "Application Support")で
/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Library/Application Supportに変更すると良いようです。
http://qiita.com/bokkuri_orz/items/c37b2fd543458a189d4d
iOSでは、Application.persistentDataPathにアプリの内部データを保存すると規約違反でリジェクトされるようです。
対策は、
https://developer.apple.com/jp/devcenter/ios/library/documentation/FileSystemProgrammingGuide.pdf
上記リンクのiOSのファイルシステムについてを読んだ感じだと
Application.temporaryCachePath.Replace("Caches", "Application Support")で
/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Library/Application Supportに変更すると良いようです。
2014年5月19日月曜日
[Unity]回転するオブジェクトを見た目だけ回転しないようにする方法
なんかタイトル読むと何なのかわかりづらいですが……
Unity4.3以降の2Dスプライトで使用した内容です。
例を挙げると、Circle Collider2DとRigidBody2Dをもつオブジェクトで壁などに衝突したときに反射しますが、デフォルトのFixed Angleにチェックが入っていないと回転するため入射角と同じ反射角で跳ね返ります。Fixed Angleにチェックを入れていると、オブジェクトが回転しないからなのか反射角が0°で跳ね返ります。
しかしこのときオブジェクト自身が回転しています。
上下左右が区別のつくスプライトを使用している場合、見た目がクルクル回転しているように見えます。この回転をしてるように見えなくする方法です。
1.Rigidbody2Dが入っているオブジェクトにスクリプトを追加します。
2.Update()に、gameObject.transform.rotation = Quaternion.Euler(0, 0, 0);を追加します。
上記手順で、見た目回転しなくなります。
Unity4.3以降の2Dスプライトで使用した内容です。
例を挙げると、Circle Collider2DとRigidBody2Dをもつオブジェクトで壁などに衝突したときに反射しますが、デフォルトのFixed Angleにチェックが入っていないと回転するため入射角と同じ反射角で跳ね返ります。Fixed Angleにチェックを入れていると、オブジェクトが回転しないからなのか反射角が0°で跳ね返ります。
しかしこのときオブジェクト自身が回転しています。
上下左右が区別のつくスプライトを使用している場合、見た目がクルクル回転しているように見えます。この回転をしてるように見えなくする方法です。
1.Rigidbody2Dが入っているオブジェクトにスクリプトを追加します。
2.Update()に、gameObject.transform.rotation = Quaternion.Euler(0, 0, 0);を追加します。
上記手順で、見た目回転しなくなります。
2014年4月23日水曜日
[Unity]子オブジェクトを取得する
Unityで現在のオブジェクトから子オブジェクトを取得したいときは
下記のようなコードになります。
1. GameObject child1 = gameObject.Find("Child").gameObject;
2. GameObject child2 = gameObject.GetChild(0).gameObject;
1番目は、Childという名前の子オブジェクトを取得しています。
2番目は、インデックスに基づいて子オブジェクトを取得しています。親オブジェクトのchildCountより小さい値を指定する必要があります。
下記のようなコードになります。
1. GameObject child1 = gameObject.Find("Child").gameObject;
2. GameObject child2 = gameObject.GetChild(0).gameObject;
1番目は、Childという名前の子オブジェクトを取得しています。
2番目は、インデックスに基づいて子オブジェクトを取得しています。親オブジェクトのchildCountより小さい値を指定する必要があります。
2014年4月11日金曜日
[Unity]特定のオブジェクトだけ衝突判定を無視する方法
標題の方法ですが、四方を壁に囲まれた空間で特定のオブジェクトは一方向の壁には当たらずそのまますり抜けていきたいときにとった方法です。他のオブジェクトは跳ね返ります。
すり抜ける壁のレイヤーをBottomWallと名付けます。
すり抜けていくオブジェクトをEnemyと名付けます。
そして、ソースコードに
int layer1 = LayerMask.NameToLayer("BottomWall");
int layer2 = LayerMask.NameToLayer("Enemy");
Physics2D.IgnoreLayerCollision(layer1, layer2);
を追加すれば、BottomWallとEnemyをレイヤーに設定したオブジェクトは衝突判定を無視します。
上記はPhysics2Dで行っているが、Physicsでも同様にできます。
Physicsには、IgnoreCollisionでCollider同士の衝突判定もあるのだが、2Dにはそれがないのが謎です。
[Unity]衝突判定無視して貫通弾を作る
アルカノイドタイプのブロック崩しのようなゲームやシューティングゲームで使用するような貫通する弾を作った際の設定です。
貫通弾のColliderのIsTriggerフラグをON(true)にして、
OnTriggerStay2D
OnTriggerEnter2D
OnTriggerExit2D
上記の関数のどれかで当たったオブジェクトをDestroyして消していけば貫通しているように見えるかも。
貫通弾のColliderのIsTriggerフラグをON(true)にして、
OnTriggerStay2D
OnTriggerEnter2D
OnTriggerExit2D
上記の関数のどれかで当たったオブジェクトをDestroyして消していけば貫通しているように見えるかも。
2014年4月10日木曜日
[Unity]コルーチンとyieldの処理
基本は、
Unityスクリプトリファレンス Coroutineの解説
Unityスクリプトリファレンス StartCoroutineの解説
で解説されている通りで、何フレーム、何秒か待って処理をしたり非同期に処理をしたい場合
に使用するものです。
public class CoroutineTest : MonoBehaviour
{
void Start()
{
StartCoroutine(waitTime(1.0f));
StartCoroutine(waitTime, 1.0f);
StartCoroutine("waitTime", 1.0f);
StartCoroutine(waitFrame());
StartCoroutine(waitFrame);
StartCoroutine("waitFrame");
}
IEnumerator waitTime(float time)
{
// time秒待ってからprintを実行する
yield return new WaitForSeconds(time);
print("waitTime = "+time+" second");
}
IEnumerator waitFrame()
{
// 1フレーム待ってからprintを実行する
yield return null;
print("waitFrame 1frame");
}
}
Unityスクリプトリファレンス Coroutineの解説
Unityスクリプトリファレンス StartCoroutineの解説
で解説されている通りで、何フレーム、何秒か待って処理をしたり非同期に処理をしたい場合
に使用するものです。
public class CoroutineTest : MonoBehaviour
{
void Start()
{
StartCoroutine(waitTime(1.0f));
StartCoroutine(waitTime, 1.0f);
StartCoroutine("waitTime", 1.0f);
StartCoroutine(waitFrame());
StartCoroutine(waitFrame);
StartCoroutine("waitFrame");
}
IEnumerator waitTime(float time)
{
// time秒待ってからprintを実行する
yield return new WaitForSeconds(time);
print("waitTime = "+time+" second");
}
IEnumerator waitFrame()
{
// 1フレーム待ってからprintを実行する
yield return null;
print("waitFrame 1frame");
}
}
登録:
投稿 (Atom)