#public staticに至った経緯
Unityでゲームを作っているときにほぼ必須のGetcomponent。
自分はスクリプトの変数を違うスクリプトから取得したいときによく使うのですが、毎回GetComponent<>()とかを使って、<>←これの中にはクラス名をいれて...などとしていては、とても面倒ですし他にやり方がないものか、と思っていたら、シングルトン1であるならば、public staticで直接他のスクリプトから変数を取得できるやり方があるらしいです。
#書いてみた
public class Player : MonoBehaviour
{
public static Player player; //public staticして、クラスの名前を書いて、適当な変数(ここではplayerとする)を宣言
public int playerHp = 100;
void Start(){
player = this;
}
}
このスクリプトのplayerHpを他のスクリプト(ここでは敵スクリプト)から取得したい場合、
public class Enemy : MonoBehaviour
{
void Start(){
Player.player.playerHp--;//クラス名.変数名.変数で、Playerクラスの変数を取得できる。Playerで宣言したこと(int playerHp等)がplayerに入っているイメージ
}
}
スクリプトの内容は、Startが呼び出されたときにplayerHpから1引くという処理になります。
この場合、Playerの中身が入っているplayerの中のplayerHpを取得したいので . ←をつけています。
ただ、class Playerのスクリプトに**player = this;**という記述があります。
これは何なのかというと、playerという変数をインスタンス化しているようです。もともとPlayerというクラスで宣言したことは設計図のような状態なので、他のスクリプトがその設計図を取得したい場合はインスタンス化をする必要があり、thisという自分自身のインスタンスを表すものをplayerに代入して、設計図からインスタンス化をさせているわけですね。
#注意点
public staticはとても便利ですが、似ているクラス名(enemy1 enemy2など)をpublic staticしてしまうと、いざ使ってみようと思った時に検索候補で訳がわからなくなってしまうので、クラス名は間違えにくい名前を付けましょう。
#終わり
拙い記事ですが読んでいただきありがとうございました。
-
シングルトンとはクラスのインスタンスが一つだけになるように設計すること ↩