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

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

ただいまの
回答率

90.51%

  • C#

    7124questions

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

  • Unity2D

    884questions

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 320

sukiyakigozens

score 14

アンドロイドと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はほぼ毎回必ず、この問題が起きます。
内容が少し変わってしまい、申し訳ありません。
ご教授よろしくおねがいいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

Rigidbody 2D

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/04 02: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の設定の問題ではないようです。

    ご指摘ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7124questions

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

  • Unity2D

    884questions

  • トップ
  • C#に関する質問
  • オブジェクトをDestroyする時、PC上ではDestroyされるが、実機上で完全にDestroyされない。