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
何かご存知の方がいればまたご教示願います。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/05 18:06
2017/06/06 20:51