前回のUnity Gems記事に続いて、Unityメモリ管理「Staticクラス」について翻訳を紹介する:
-------
http://unitygems.com/memorymanagement/October 21, 2012
Staticクラス
Staticクラスはオブジェクトのインスタンス化ができないクラスでありStaticクラスのオブジェクトを作ることは出来ない。
実行すると1つのインスタンスしかない。先ほどインスタンス化ができないと書いたばかりなので混乱したかもしれないが、要はプログラムがこのオブジェクトをヒープに割り当てて、ユーザによるインスタンス化は許可しないということだ。
Staticオブジェクトは最初のコール時に作成されて、プログラムの終了時に破棄される。(あるいはクラッシュ時・・・)
public static class GameManager{ public static int score; public static float amountOfTime; }Game Managerというオブジェクトの型を宣言することは出来ない。
GameManager GM = new GameManager();これはエラーを返す。
Staticクラスのメンバにアクセスするには単に:
GameManager.score = 10;これはゲームのどの箇所からもどんなタイミングでもアクセスできます。Staticなクラスまはメンバは全てのファイルが有効範囲であり、プログラム全体が生存期間となる。
Staticクラスの使用例
新しいシーンをロードしたとき、前のシーンの全ての変数は破棄される。もしある変数を保持したい場合、例えばスコアを残す場いい、次のように記す:
DontDestroyOnLoad(score);Staticクラスの便利なところは生存期間にある。なくなることがないため、シーンのロードのときも保持させたい場合はStaticクラスを使用すれば良い。レベル終了時に値をStaticメンバに渡し、新しいシーン開始時にその値を取得する。
DontDestroyOnLoad(score); if(newLevel){ GameManager.score = tempScore; Application.LoadLevel(nextLevel); }
DontDestroyOnLoad(score); また新しいシーンのスクリプトには: void Start(){ scoreTemp = gameManager.score; }ちょっとしたテクニックとして、GameManager.scoreはギリギリ最後まで使用を控えることだ。
例えばレベルが10個あって、レベルごとに最大200点獲得できるとする。
さらに別のプレイヤーがゲームを終えるまでに何度もリプレイした後に5000点獲得したとする。
二人目のプレイヤーは一人目ほどのスコアでなかっが、それでもより多くの点を獲得できたのは、書くレベルを何度もリプレイをして得点を積み重ねたためだ。次のレベルロードを待ってStatic変数の地点をスキップする場合、リトライによってそのレベルでの得点の積み重ねはキャンセルされます。
ゲームを中断するとき、Staticクラスのデータはセーブすることが出来る。
StaticクラスおよびStatic変数はプログラム実行で初めて登場したときに割り当てられます。Staticクラスは実際にそのクラスの変数またはメソッドにアクセスするまで作成されることは絶対にない。
-------
Unityメモリ管理の基礎を積み重ねていこうぜ!
0 件のコメント:
コメントを投稿