Tankの課題で、自身で解決できず、困っております。。
1. 足したい機能
Itemを取ると、UI右下のPower:が"Now Power Up!"と変わり、Shellが3方向に出るようにする。
2. やったこと
(1) TankMovement.csに OnTriggerEnterを追加し、Itemを取得したかどうかを確認させようとした。
(2)Tank Shooting.csにFire2()を追加し、Update関数中で使用。
Itemを取ったときに、Shellを3方向に出させようとした。
3. 解決できていないこと
(1)Itemを取得すると、m_PowerUpStatus.textが"Now Power Up!"になり、
UIの表示も変わるようにしたい。
しかし、UI中のText(PowerUpText)を追加できない。
(2)TankMovement.cs中のBool値m_FirePowerを使って、Tank_Shooting.csの砲弾の切り替え(Fire->Fire2)を行いたいが、スクリプトを跨いだ変数の渡し方が分からない。
(3)Fire2が所望のとおり機能しておらず、連射していくと、Shellの発射位置がTankから離れていく。
- GameObject.Findを使用して、最初にPowerUpTextをm_PowerUpStatusに格納すれば、1の問題を解決できます。ただし、Findの処理が重いため、Updateなどでは使用しない方がいいです。
- m_FirePowerを使ってFire1とFire2を切り替えるのに、アイテムをゲットする時、ゲットしタンクのm_FirePowerをtrueにし、本来Fireを呼び出すところにifを使用して、m_FirePowerで呼び出せばいけると思います。
- 3方向の発射処理にいくつか問題があります。
- 画像1のように書いたと思いますが、このやり方は打てば打つほど発射位置がずれる原因です(直接transformを格納するのではなく、positionやrotationなどを取り出して格納しないと、Translateなどで本来のm_FireTransformもパラメータが変化してしまう)
- angleの設定がちょっとおかしかったです。位置的には(1.0f, -10.0f), (0.0f, 0.0f), (-1.0f, 10.0f)に変更すべきです。
- 3方向の処理がちょっと複雑なので、サンプルコード書きました。コメントも付けたので、参考にしてください。
- 画像3のOnTriggerEnterのm_PowerUpStatus.text = "Now Power Up!"を最初のタグチェックするif分に入れた方がいいです。そうしないと、敵からの弾を受けてもこの処理が実行されてしまいます。
修正を試みたのですが、まだ一部うまく行かないところがあります。
TankShooting.csに、
TankMovement TankMovementA;
という変数を追加し、
Start()中には、
TankMovementA = FindObjectOfType<TankMovement>();
を追加しました。
Update関数中にある
TankMovementA.m_FirePower
で、Itemを取得したかどうかを判別しようとしたのですが、
常にFalseになってしまい、
Itemをとっても、Fire2でなく、Fireが選択されてしまい、困っています。。
Itemを取得したかどうかならOntriggerenterでアイテムを取得した際何からの変数の値を変更した方が簡単です。
例えば、tankmovementのontriggerenterでアイテムに触れたらそこでGetcompoment<tankshooting>().gotitem=trueにするなど、findを使う必要がないと思います。