質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1397閲覧

オブジェクトをDestroyする時、PC上ではDestroyされるが、実機上で完全にDestroyされない。

sukiyakigozens

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/10/03 10:27

編集2017/10/04 05:17

アンドロイドとiOS向けにパズルのアプリを制作している初心者です。
(unity5.6使用)

50個のスロット(親)と50個のパズルピース(子)があり、
50個のパズルピース(子)をドラッグドロップで動かして
正解のスロット(親)を探して置くというゲーム内容です。

※50個のスロット(親)は場所固定で、
パズルピース(子)は個々のスロット上へ自由にドラッグドロップできる設定です。

パズルピースを正解のスロット上にドラッグドロップされると、
OnTriggerStay2Dで正解判定をして、正解のスロットなら
スロット(親)とパズルピース(子)の両方がDestroyされるという
動作を目指して制作しております。

問題点
実機確認したところ、下記のコードではDestroyが完全にできず、困っております。
スロット(親)のDestroyのみで、スロット(親)とパズルピース(子)の両方がDestroyされると想定しましたが、
いくつかのスロット(親)とパズルピース(子)がDestroyされずに残ってしまいます。
質問させてください。
(Mac OS上では問題なく動作しております)

//ヒエラルキー上の名前 - スロット(親)は slot_00、パズルピース(子)は pic_00 if (other.gameObject.name == "pic_00") {  GameObject otherSlot = GameObject.Find ("slot_00"); //親のスロットを探す  Destroy(otherSlot, 0.0f); //親のスロットをDestroy }

実機(アンドロイド/iOS端末)での動作
いくつかのパズルピース(子)がたまにDestroyされずに画面上に残ってしまいます。
(毎回ではないですが、50個のパズルピースのうち1個または2個がDestroyされずに残ってしまいます。)
※Destroyされずに残ったパズルピース(子)は親であるスロットも一緒に残っているようです。

試した事
下記のように、スロット(親)とパズルピース(子)の両方をDestroyする命令をいれると、
今度はパズルピース(子)のみが削除された空のスロット(親)が
数個残ってしまいます。(50個中、2個ほどDestroyされずに残ってしまいます。)

if (other.gameObject.name == "pic_00") {  GameObject otherSlot = GameObject.Find ("slot_00"); //親のスロットを探す  Destroy(otherSlot, 0.0f); //親のスロットをDestroy Destroy(other.gameObject, 0.0f); //子のパズルピースをDestroy }

下記のようにDestroyの後、nullを代入というのもしてみましたが、動作に変化はありませんでした。

 Destroy(otherSlot, 0.0f);  otherSlot = null;

また、親と子のDestroyの命令の順番を入れ替えてみましたが、動作に変化はありませんでした。

すいませんが、
ご教授いただけませんでしょうか?
よろしくおねがいいたします。


追記(10月4日午前)
すいません。
10月3日のタイトルに「アンドロイドでは問題なし」と記入しておりましたが、
再度別のアンドロイド端末で実機確認した所、
iOS同様に数個のスロット(親)、パズルピース(子)が残るという問題が起きました。
(全部問題なく削除される時もありますが、削除されない時もあります)
※いくつかのアンドロイド端末上、及びPC(MAC OSX)上では問題なく動作しているようです。
※アンドロイド端末の場合の方が、この問題が起きにくいようです。iOSはほぼ毎回必ず、この問題が起きます。
内容が少し変わってしまい、申し訳ありません。
ご教授よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

すいません。
タイトルにあるDestroyが実行されないという問題ではなく、
意図してない部分でDestroyされてしまっているという問題でした。
書き出したiphoneの画面を動画撮影して、見返してみて何が起こっているのがようやく理解できました。

パズルピースの親と子を入れ替わる時に、
2つのパズルピースがゆっくりと入れ替わる動きを付けてあり、
その際パズルピースが一瞬だけ正解スロットの真上を通過する場合があるのですが、
その通過時にコリジョン判定されてしまい正解と認識されて、
親と子がDestroyされてしまっていたのが、原因でした。

子が残ってしまっていたのではなく、
意図してない時に親と子がDestroyされてしまっていたのが誤作動の原因でした。

解決策
パズルピースが正解スロットの上を
一瞬だけの通過する時は正解と認識させないように修正しました。

ドラッグ終了時の動作の設定に新たにフラグを立てて
コリジョン判定条件にそのフラグを追加し、
パズルピースが移動している間はコリジョン判定を行わないように修正しました。

この問題はPC上では起こらなく、実機上のみ起こる問題でしたので、
早めの定期的な実機確認が必要性を実感しました。

勘違いのタイトルをつけてしまい申し訳ありませんでした。

投稿2017/10/11 02:39

sukiyakigozens

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Rigidbody 2DのSleep ModeがNever SleepになっていなければNever Sleepにして試してみてください。

Rigidbody 2D

投稿2017/10/03 13:18

IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sukiyakigozens

2017/10/03 17:55

ご指摘ありがとうございます。 ご指摘のRigid body 2Dのsleeping Mode Start Awake になっていたので、 Never sleep に変え、iOSに書き出しましたが 結果は同じでした。 (いくつかの親と子がDestroyされずに残ります。) 他に Body type と Collision Detection の設定を変えてみました。 Body Type の設定 - Kinematic (元の設定) - Dynamic に変えましたがパズルピースが上下に勝手に動きだしてしまいました。 Collision Detection の設定 - Continuous(元の設定) - Discrete に変えましたが変化なし おそらくRigid body 2Dの設定の問題ではないようです。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問