当サイトではPRを含む商品リンクを使用しております。

UnityC#のGetComponentとは、使い方について

Unity

今回、GameManager.csを更新しました。

ゲーム終了の処理がPlayerControllerにあったので、GameManagerにお引越しさせました。

Cat/Assets/Script/GameManager.cs at main · KidaiRinboku/Cat
meow! Contribute to KidaiRinboku/Cat development by creating an account on GitHub.

GameManagerに書いてある処理は、

Playerタグがついたゲームオブジェクトを探し、そのゲームオブジェクトにアタッチされているSceneController型のコンポーネントを見つける。

GoHome関数では、上で取得したPlayerタグのついたゲームオブジェクトにアタッチされているSceneController型のコンポーネントに入っている関数であるSwitchSceneを呼び出してシーンを切り替える。

という処理になっています。

書いた処理をよく味わう

Startより前のところ

PlayerConroller型の変数を定義しており、PlayerControllerクラスまたはPlayerControllerを継承したクラスを入れることができます。

自作したPlayerControllerに書いた処理を扱える playerControllerという模造品を作っています。

PlayerController playerController;

playerSceneControllerも同様の方法でSceneControllerクラス型で定義しています。

SceneController playerSceneController;

下記は、

public GameObject player;

外部からも参照できる(public)ゲームオブジェクト型(GameObjet)の変数player を定義しています。

シーンで使用していてヒエラルキービューに置かれてるものたち(GameObject)型かつ、外からも参照できるpublicになっているので、

今このソースコードを書いているGameManagerがアタッチされたゲームオブジェクトをヒエラルキービューから選ぶと、

インスペクタービューにてGameManagerコンポーネントにplayerを設定できる項目があります。

今回はプレイヤーキャラクターをそこにドラッグドロップします。

ースコード上でFind()やFindObjectWithTag()というような様々な手段で指定することもできます。

GameObject - Unity スクリプトリファレンス
Base class for all entities in Unity Scenes.

Start中の一処理目

ifとelseのところは今回は関係ありません。(取得に失敗した時用の例外処理です)

その中の下記が今回の一つ目の処理です。

playerSceneController = player.GetComponent<SceneController>();

playerSceneControllerは、SceneController型のものを入れることができます。

今回は、プレイヤーにアタッチされているコンポーネントのSceneControllerを引っ張ってきています。

そうすることで、"プレイヤーにアタッチされ、プレイヤーで呼び出す用にセッティングされたSneceController"の処理を実行することができます。

プレイヤーにアタッチされたSceneコントローラーは、Endという名前のSceneで飛ぶ設定になっているので、playerSneceControllerで関数を実行するとEnd画面に移行します。

オリジナルのSceneControllerはsceneName変数をパブリックで宣言しているだけで何も入れていないため、Sceneコントローラーそのものを呼ぶのではなく、
"プレイヤーにアタッチされ、プレイヤーで呼び出す用にセッティングされたSneceController"
を呼び出すことが大事です。

playerに対してGetComponentすると、アタッチされたコンポーネントにアクセスできます。

Transformにアクセスすれあ移動や回転、大きさを変えたり、SpriteRendererにアクセスすれば画像をいじることができます。

終了画面に飛ぶメソッドを作る

    public void GoHome(){
        if(playerSceneController != null){
            playerSceneController.SwitchScene();
        }else{
            Debug.Log("playerSceneController is null");
        }
    }

このGoHomeオブジェクトはゲームの終了処理で、Endシーンに飛ぶものです。
ゲームコンセプトの都合上GoHomeという名前ですが、体力が0になったら終了動作をする場合はGameOverという名前でもいいかもですね。

ただ、ゲームオーバーなら、終了画面より前にリトライとかタイトルに戻るとかの選択肢がほしい場合もあるので、
その時はシーンを飛ぶではなくCanvas上のUIを表示するとかに変えてもいいかもしれません。

相談事や疑問点がありましたらぜひXでお聞かせください。

コメント

タイトルとURLをコピーしました