最終課題のTanksゲームについて2つ質問があります。
・TanksゲームにHome画面を追加し、スタートボタンを設置して"HomeManager"スクリプトをアタッチしました。スタートボタンをクリックすると、シーン遷移してROUNDが始まります。再生した時点でTankのインスタンスは生成したいのですが、スタートボタンを押すまでTankを操作できないようにするにはどうしたら良いでしょうか? 現在スタートボタンを押す前にTankを動かせてしまいます…
・今回「ボタンを押したらシーン遷移する」しかイメージできなかったのでHomeSceneを追加したのですが、ボタンを押さなくてもシーン遷移する方法はありますか? 例えば「どちらかが2ラウンド先取したら違うシーンに遷移する」という風にしたいときは、どうしたら良いでしょうか?
アドバイスいただけると助かります。よろしくお願いいたします。
まず1つ目のものの解説をします。Tankの動きはTankMovement.csで管理しており、特にFixedUpdate()の中身が毎回呼ばれることで動く仕組みです。
なのでこの内容を「ボタンを押したら」呼ばれる、というように書き換えると制御ができます。(以下添付画像)
ボタンを押したかどうかを判定するにはbool変数等を使うと書きやすいです。
https://squmarigames.com/2018/11/18/unity-beginner-bool/
2つ目ですが
PhotonManagerにあるOnClickGameStartButton()等、遷移に使われる関数がpublic型なので外のスクリプトがら呼ぶことができます。
GameManagerなどのスクリプトで2ラウンド先取を感知した場合に、PhotonManagerの遷移に使われる関数を呼び出すという方法で実装ができます。
1つ目について、ボタンを押したかどうかを判定するbool変数をHomeManager.csに書いて、それをTankMovement.csで取得するのかなと思ったのですが、色々調べてみてもどのように書いたらいいか分かりませんでした。
このような考え方で合っているのか、またどういうスクリプトを書いたらいいのか、教えていただけると幸いです。よろしくお願いいたします。
Instantiateしたオブジェクトは最初からSceneに存在していないのでアタッチができません。
そのためGameObject.Find()を使って、Scene上のオブジェクトを探します。
詳しく書かれているサイトを以下に添付します。
https://tech.pjin.jp/blog/2020/12/29/unity_csharp_gameobjectfind
これでHomeManager.csが付いているオブジェクトをTankMovement.csから参照、そのあとスクリプトをGetComponentすればbool変数を参照することができます。
返信いただきありがとうございました。大変助かりました。
スクリプトを変更(赤矢印部分)して再生したら、STARTボタンを押すまでタンクは動かず、無事シーン遷移もできたのですが、今度はシーン遷移後にタンクが動かなくなってしまいました。度々申し訳ありませんが、アドバイスをいたけると幸いです。
コンソールを見ると98行目でエラーが発生していて、それが"homeManagerのコンポーネントが参照できない"、"homeManager自体が参照できない"という内容です。
コンソールのエラーの簡単な見方を参考画像として添付します。
遷移先のSceneにそもそもHomeManagerオブジェクトがあるか(大文字小文字も注意)、HomeManagerオブジェクトにスクリプトは付いているか、確認してみてください。
返信ありがとうございました。遷移先の‟Main Scene”にHomeManagerオブジェクトがありませんでした。
そもそも遷移先のMainSceneにはGameManagerスクリプトをアタッチしたGameManagerオブジェクトを置いていて、HomeSceneにはHomeManagerスクリプト(GameManagerスクリプトから必要箇所だけコピペしてシーン遷移を追記したもの)をアタッチしたHomeManagerオブジェクトを置いていました。
それはNGで、どちらのシーンにもGameManagerスクリプトをアタッチしたGameManagerオブジェクトを置くのでしょうか?
そのようにやってみたところ、やはりシーン遷移後にタンクが動きませんでした。度々申し訳ありませんが、どうやったら直せるか教えていただけると幸いです。よろしくお願いいたします。
gameManagerが無い状態なのですね。
このコードではgameManagerの状態によって動けるかどうかを判断しているのでgameManagerが無いと動けません。Sceneによって読み込ませたいスクリプトが違う場合は、参照したかったGameObjectが無かった場合にもう一方の参照したいGameObjectを読み込ませるための条件分岐を与えます。
if(○○ == null)によって指定の変数にオブジェクトやコンポーネントが付いているかどうかを判定することができます。(以下参考リンク)
https://unitygeek.hatenablog.com/entry/2013/09/07/110829
参考画のようにGetComponent<>()をする前にオブジェクトがあるかどうかの条件分岐を挟むとエラーが発生しません。