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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

2823閲覧

実機でデバッグをするとゲームが進行しなくなります

ponju

総合スコア13

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/06/04 12:58

編集2017/06/07 03:50

Unityでゲーム制作をしています。
製作過程を友達に見せようと実機にインストールしてみましたが、途中でゲームの進行が止まってしまいます。Unity上では問題なく動いております。
実機の機種はSH-03Gです。他の機種では試せていません。

実機でこのような現象に至る原因として、初心者がやりがちなものはありますでしょうか?
以下詳細ですが、コードはどの部分を載せていいのかわからないので、ひとまず状況だけ説明いたします。

トランプの『戦争』のように両方が事前に決めた行動に基づく行動をするゲームを作っています。

該当する部分では今のところ、「行動しているプレイヤーがおらず、まだ行動していないキャラクターがいるとき、一定時間経過後にそのキャラクターに行動をさせる(弾を発射するなど攻撃エフェクトを出す)」というような処理をしています。

しかしいくら待っても未行動のキャラクターの攻撃エフェクトが出ません。すべてのキャラクターが行動を終えていることを次のターンに移る条件にしているので、そこでゲームの進行が停止してしまいます。
繰り返しになりますが、Unity上では正しく動き、キャラクターが行動し、次のターンへ移行します。

またUIとしていくつかボタンを配置しているのですが、実機で進行がとまったときでも、ボタンを押したときの点滅はありますし、「アプリが動作を停止しました」などのメッセージは出ていませんので、アプリとしては動いているようです。

もし解決策をご存知の方がいらっしゃいましたらよろしくお願いいたします。

「コードのこういうところを見た方がいいんじゃないか/載せてくれないか」という指示をいただければなるべく早急に対応します。もしよろしければコメントどうぞよろしくお願いいたします。

(追記)
「行動しているプレイヤーがおらず、まだ行動していないキャラクターがいるとき、一定時間経過後にそのキャラクターに行動をさせる(弾を発射するなど攻撃エフェクトを出す)」
ここの部分では「一定時間」を変数にし、そこからTime.deltaTimeを引いています。そして0より小さくなった時にキャラクターの状態を遷移させ、行動を起こさせていますが、どうやらここの部分がうまくないようです。
ちなみにカウントダウンではなくTime.deltaTimeを足すカウントアップでも試してみましたがやはり上手くいっていません。

Time.deltaTimeを引いている変数が、Unity上ではきちんと引かれていますが、実機のログでは引かれていません。
値型などを変えてみましたが(Unity上では動いているので当然ですが)変化ありませんでした。
Time.deltaTime自体もログ出力してみましたが、こちらはきちんと表示されています。
(値もUnity上のものもSH03Gのものもそれほど変わりませんでした)

(追記その2)
場面をStepというStateパターン(もどき)で実装しています。
プレイヤーの状態についてもまた別のStateパターンで実装しています。
そのコードです。

C#

1using com.hops.p.EnergyStone.phase.combat.step; 2using UnityEngine; 3using com.hops.p.EnergyStone; 4using com.hops.p.EnergyStone.player; 5using System.Collections.Generic; 6using com.hops.p.EnergyStone.player.state; 7 8namespace com.hops.p.EnergyStone.phase.combat.step 9{ 10 public class ActionStep : Step 11 { 12 List<Player> Players = GameManager.instance.charactors; 13 public const float STEPNULLTIME=1.5f; 14 public float stepNullTime = 0; 15 public override void Update() 16 { 17 base.Update(); 18 19 for (int i = 0; i < Players.Count; i++) 20 { 21 Player player = Players[i]; 22 player.Execute(); 23 Debug.Log(player.name + "-state:" + player.state); 24 } 25 if(Players.TrueForAll(p=>p.state is StateStay||p.state is StateCharging)) stepNullTime += Time.deltaTime; 26 27 if (stepNullTime > STEPNULLTIME) 28 { 29 if (Players.TrueForAll(p => p.actionFlag)) { 30 ((CombatPhase)Phase.instance).currentStep = new EndStep(); 31 } 32 else 33 { 34 for (int i = 0; i < Players.Count; i++) 35 { 36 if (!Players[i].actionFlag) 37 { 38 Players[i].DoAction(); 39 stepNullTime = 0; 40 } 41 } 42 } 43 } 44 } 45 } 46}

あと関連するところとしては攻撃の前にキャラクターが回転するStateがあるのですが、そこからキャラクターがアイドル状態のstateに変わっていないようです。回転は次のメソッドで行っています。

C#

1 public void Turn2() 2 { 3 if (transform.rotation != destinationAngle2) 4 { 5 transform.rotation = Quaternion.RotateTowards(transform.rotation, destinationAngle2, Time.deltaTime * speed*50.0f); 6 } 7 else 8 { 9 this.state = new StateStay(this); 10 turn2Flag = true; 11 } 12 } 13

何かご存知の方がいればまたご教示願います。

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

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

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

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

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

guest

回答3

0

質問を読んだ限りでの私の考えとしては、コードを調べるよりも「進行が止まってしまった時に実機で何が起きているのか」を調べた方が確実で早いと思います。
おそらく実機ではエラーが起きていて、それによりゲームの進行が止まっているのではないかと推測しています。
制作中には Unity 上でデバッグ実行していますよね。その時にコンソールにログが出ますが、普段はそれを見てトラブルシュートしたりしていることと思います。それと同じことを実機に対しても行ってみてはいかがでしょうか。

Android 上で Unity が出力するログを見るにはいろいろな方法があります。Unity のバージョンにもよるのですが Unity のバージョンに依らない方法を紹介しておきます。

IDEを起動せずにAndroid実機ログを見る方法
http://qiita.com/sea_mountain/items/c8f87386ceafea4a757e

投稿2017/06/04 23:57

bboydaisuke

総合スコア5275

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

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

ponju

2017/06/05 18:06

ご回答ありがとうございます。 Android Device Monitorでログを確認することができました。 当該場面にてログの赤字のエラーは出ませんでした。しかしながらアプリケーション起動時に E/Unity(26809): Unable to find AudioPluginMsHRTF E/Unity(26809): Unable to find AudioPluginOculusSpatializer E/Unity(26809): Unable to find libAudioPluginOculusSpatializer という3つのエラーをはいています。これが原因なのでしょうか?一応このエラーを解決する方向でやってみています
ponju

2017/06/06 20:51

ありがとうございます。 現在ログ出力のコードを追加して教えていただいた方法を使って調査を続けています。 少し調査が進んだのでまた本文を読んでいただければ幸いです
guest

0

ベストアンサー

アプリが強制終了していないのであれば、まずは処理結果が求めるものになっているかを調べるのがいいと思います。

結果的にPlayer.DoAction()が呼ばれてほしいのに呼ばれないということでしたら、そもそも「**(stepNullTime > STEPNULLTIME)がtrueになっているか」「(Players.TrueForAll(p => p.actionFlag))**がfalseになっているか」を調べるべきでしょう。

ですが、質問的にこの条件式がそもそも呼ばれていないのはすでにわかっているようなので、であれば一つ前の条件式の**(Players.TrueForAll(p=>p.state is StateStay||p.state is StateCharging))**がtrueになっているのかが気になります。

また、Turn2()の**(transform.rotation != destinationAngle2)がtrueになっているかも気になりますが、要するにstepNullTime += Time.deltaTime**を実行するための条件式がそもそもfalseになっていないかを知りたいです。

あくまでも質問文を見た限りではですが、実機の方でstepNullTimeの値についてログを出すなどして検証してみたようでうが、そもそも加算処理が行われているかどうかがわからないので一応聞きたいです。

投稿2017/06/07 06:46

t_s

総合スコア50

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

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

ponju

2017/06/07 10:05

ご回答ありがとうございます。 >(Players.TrueForAll(p=>p.state is StateStay||p.state is StateCharging)) ここはfalseになっていました。そしてstateは、Turn2()を呼び出す別のstateで止まっていました。 そこでおっしゃる通りやはり問題だったのがtransform.rotation!=destinationAngle2で、 キャラクターの向き(current)とむけたい向き(destinationAngle2)をログ出力してみたところ、 (0.0, -0.3, 0.0, -1.0)(current):(0.0, 0.3, 0.0, 1.0)(destinationAngle2) と値が反転したようなQuaternionで止まっていました。 destinationAngle2は インスペクタから指定してるわけではなく スクリプトからdestinationAngle2=Quaternion.Euler(0,0,0)と初期化しています。
t_s

2017/06/07 10:40 編集

**Quaternion.RotateTowards**を使ったことがなかったので手元で試してみたんですが、どうやらあくまでも数値を近づけるのではなく向きを近づけていくメソッドのようですね。 ``` public class Test : MonoBehaviour { private Quaternion targetQuat = Quaternion.Euler(0, 180, 0); // 更新処理 private void FixedUpdate () { this.transform.localRotation = Quaternion.RotateTowards(this.transform.localRotation, this.targetQuat, 0.1f); } } ``` 回転量(0, 180, 0)を目指すとき、回転する方向は対象となるオブジェクトからみて最小の回転量となる向きに回るみたいです。 おそらく、元の向きが(0, 0, 0)のときどちらに回るかはUnityの気分次第で、その挙動がUnityEditerと実機で違うのでしょう。 あくまでも推測なので鵜呑みにしないでいただきたいのですが、個人的には別の回転方法を考えたほうが懸命な気がします。 (追記) 一応ですが、数字があっているならMathf.Absとか使ってむりやり符号を一致させたりもできるので、今のやりかたでできないわけではないということだけ補足しておきます。 あくまでも個人的な感想としてはQuaternion.RotateTowards()は向いていないのでは、というだけです。
ponju

2017/06/07 13:25

RotateTowards()に関して詳細な情報をありがとうございます。 RotateTowardsを使わない場合の実装としては例えばどのようなことが考えられますか?なにかうまい方法があれば教えてくださると嬉しいです。 やはりAngleAxisやFromToRotationを使い、回転途中の角度を逐次指定していくしかないでしょうか?
ponju

2017/06/07 13:52

ひとまずは次のようにif文の中身を変えてみたところ解決しました! public void Turn2() { if (Quaternion.Angle(transform.rotation, destinationAngle2) > Time.deltaTime * speed * 50.0f) { transform.rotation = Quaternion.RotateTowards(transform.rotation, destinationAngle2, Time.deltaTime * speed*50.0f); Debug.Log(this.ToString() +"->"+ transform.rotation + "(current):" + destinationAngle2 + "(destinationAngle2)"); } else { transform.rotation = destinationAngle2; this.state = new StateStay(this); turn2Flag = true; } } 迷いましたがt_sさんの回答をベストアンサーにさせていただきます。
guest

0

実機でなんらかの初期化に失敗してTime.timeScaleが0になっていませんか?

投稿2017/06/07 11:46

tmp

総合スコア277

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

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

ponju

2017/06/07 13:26

ご回答ありがとうございます。 timescaleについては、他のオブジェクトが動いていることから問題ないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問