前提・実現したいこと
Unityを勉強中なのですが、よく分からないことがあって質問させていただきました。以下のサイトの"2d-shooting-game"のチュートリアルに沿ってゲームを製作しているのですが、第10回のソースコードによく分からない箇所があります。
2d-shooting-game 第10回 タイトルをつける
分からないこと
質問したいところは「10.3 他のスクリプトからマネージャーを呼び出す」のPlayer.cs の FindObjectOfType<Manager>().GameOver(); の箇所です。
lang
1using UnityEngine; 2using System.Collections; 3 4public class Player : MonoBehaviour 5{ 6 7~中略~ 8 9// ぶつかった瞬間に呼び出される 10 void OnTriggerEnter2D (Collider2D c) 11 { 12 // レイヤー名を取得 13 string layerName = LayerMask.LayerToName(c.gameObject.layer); 14 15 // レイヤー名がBullet (Enemy)の時は弾を削除 16 if( layerName == "Bullet (Enemy)") 17 { 18 // 弾の削除 19 Destroy(c.gameObject); 20 } 21 22 // レイヤー名がBullet (Enemy)またはEnemyの場合は爆発 23 if( layerName == "Bullet (Enemy)" || layerName == "Enemy") 24 { 25 // Managerコンポーネントをシーン内から探して取得し、GameOverメソッドを呼び出す 26 FindObjectOfType<Manager>().GameOver(); 27 28 // 爆発する 29 spaceship.Explosion(); 30 31 // プレイヤーを削除 32 Destroy (gameObject); 33 } 34 } 35} 36
Managerゲームオブジェクトには Manager.cs というスクリプトがアタッチされており、内容は以下のようなものとなります。
lang
1using UnityEngine; 2 3public class Manager : MonoBehaviour 4{ 5 // Playerプレハブ 6 public GameObject player; 7 8 // タイトル 9 private GameObject title; 10 11 void Start () 12 { 13 // Titleゲームオブジェクトを検索し取得する 14 title = GameObject.Find ("Title"); 15 } 16 17 ~中略~ 18 19 public void GameOver () 20 { 21 // ゲームオーバー時に、タイトルを表示する 22 title.SetActive (true); 23 } 24}
Playerというゲームオブジェクトにアタッチされたスクリプトから、別のManagerというゲームオブジェクトにアタッチされたスクリプト内のメソッドを実行しようとしているところです。Unityリファレンスを調べてみたところFindObjectOfType<>()の返り値はObject型とのことでしたが、ManagerはGameObject型なので今回はGameObject型のインスタンスが返ってきていると思います。
GameOverメソッドは今回勝手に作ったものですので、当然GameObjectクラスには定義されておりません。それにも関わらずFindObjectOfType<Manager>().GameOver();と書けてしまうのはなぜなのでしょうか。私としては以下のように書かなければならないように感じます。
lang
1FindObjectOfType<Manager>().GetComponent<Manager>().GameOver();
実際はどちらで書いた場合も見かけ上動作に違いはありませんでした。ネットで調べてみたところ、このような場合にはGetComponentを使用するのが一般的なようでした。
GetComponentなしで直接メソッドにアクセスできる理由を教えていただけないでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/17 11:06