注:当ブログでは広告を利用しています。

Unity他スクリプトの関数を参照して効率化を図るコツ

おはよう。ここでは何度かUnityの最適化について触れている。

検索の多い「他スクリプトの参照と使い方」を中心に、
参照していかに使うかについて、色々書いていきたい。

 

最適化のおさらい:定義(キャッシュ)せよ

const

まずはキャッシュだ。Start関数の前にint,float,stringなど、
次々と型番と変数、値があれば入力していく。

特にstring系の参照型はキャッシュするかどうかで、Unityの効率化が大きくはかどる。
stringはColissionやCompareTagなどいたるところで使うので、
面倒くさくてもキャッシュしていこう。

またGameObject,Transformもキャッシュしておくと、早く動く。

こちらにキャッシュについて詳しい情報を書いている。

 

他スクリプト参照の基本:インスペクターアタッチ

[SerializeField] BGManager bgms;
[SerializeField] protected SoundManager ses;
public CanonBall canons;

他スクリプト参照の基本はアタッチだ。
三つのどれかを使うと、インスペクター上から直接アタッチできる。

ただしアタッチできる対象はヒエラルキーにあるゲームオブジェクト
Assetsに貼るゲームオブジェクトファイルのみだ。

ゲームオブジェクトをドラッグし直接入力するか、
◎部分をクリックして対象のオブジェクトを探すか。

GetComponent軽量化1

アタッチ以外にもやり方はある(後述)。

アタッチは直接取得できるので最も楽なやり方だ。
ただしアタッチがちょいと面倒くさい。

 

別の方法1:FindWithTag

GameObject gb = GameObject.FindWithTag("Finish");
GameObject[] gbt = GameObject.FindGameObjectsWithTag("Player");

別の方法として該当タグから検索する方法がある。
ヒエラルキーに同じタグがあるものにおいて、普通は一つのみ取得する。

[]があると複数取得する。ただしこちらで取得するものはGameObjectだ。
スクリプトを参照する場合、

private Weapons weapon;
weapon = gb.GetComponent<Weapons>();

GetComponentを使わなければ取得できない。

 

別の方法2:子や孫のGetComponent

private Weapons weapons;
weapon = GetComponentInChildren<Weapons>();

自分の子オブジェクトにスクリプトをつけている場合、
上記の形で親スクリプトから参照できる。

反対に子から親を取得するときは

weapon = transform.parent.gameObject.GetComponent<Weapons>();

parentを使って取得すればいい。一気に取得する場合は配列を使う。

GameObject[] doj = GameObject.FindGameObjectsWithTag(objTag);//ヒエラルキーから
for(int i1 = 0; i1 < doj.Length; i1 ++){
GameObject obj = doj[i1];//配列を一個ずつ取り出す
}

他のやり方もある。

 

静的staticを使う

//GameManager.csにて
public static int hp = 5;//publicをつけると別スクリプトでも参照可能
praivate static int mp = 6;//praivateだと他スクリプト参照不可能。
//一方でこれをつけたスクリプトのみ、至る関数で自由に扱える

//別スクリプトにて
int gran;
gran = GameManager.hp;

staticはほかのスクリプトアタッチをやらずとも直接代入できる。

さらにstaticはintやstringといった個数だけでなく、関数も扱える。

public static bool saveon;
public static void AutoSave(){ //シーン移動後の保存
saveon = true;
int x = 3;
}

関数の場合、中身をpublic staticにしないと使えない。
static関数を使う時、privateは使えないので注意してほしい。

私はstaticを使って目的のboolのみを判定し、
Update関数にて目的のbool=trueなら起動する。

起動先の関数はpublic void XXX(){//起動時のプログラム}を使えばいい。

 

参照はpublicしか使えない

public int arrangeID = 1;
[System.NonSerialized]public int enemyIDs = 10;

public void Erase(){//特定のファイルをすべて消す
save = new SaveLists();
string jsonData = JsonUtility.ToJson(save);//このstringはprivate修飾子
StreamWriter streamWriter = new StreamWriter(PathS, false); //falseは上書き、trueは追記
streamWriter.WriteLine(jsonData);
streamWriter.Flush();
streamWriter.Close();
return;
}

参照先はpublicのついたものしかできない。
privateでも使いたいなと思ったら関数を利用しよう。

public void XY(){//ここならprivate変数を入れてもOK}

別のスクリプトで使う場合、インスペクター上にアタッチしたうえで、

//BgmManager.cs

public void PlayBGM(int clipNo){//Stageが違う時のBGM
clip = clipNo; //clipはprivate int変数
clipold = clip; //clipoldは private static int変数
bgms = bgmData.bgm[clip];
audioC = bgms.BgmClip;
sameMiddleStart = 0;//初期化
if(!loopOn) audioB.loop = !audioB.loop;//Loop停止にチェックを変える
audioB.clip = audioC;//GameManagerプレハブをoffにしてたらエラーが起きる
audioB.time = middleStart;
if (audioB.time < audioB.clip.length && audioC != null)audioB.Play();
}

//----------------------

//別スクリプトで
[SerializeField] BgmManager bgm;

void Start(){
bgm.PlayBGM(2);
}

上記のやり方を参考にしながらやれば、いくらでも参照できる。

他スクリプトの参照はpublicをつけた関数が一番簡単かもしれない。

お願い

めがびちゃんからお知らせ♪

お知らせ

megabe-0へ訪問した"本当"の理由

まさか記事の書き形一つでこうなるとは…

お願い1

Writer軽い自己紹介

ティラノスクリプトや小説家になろう、ピクシブ他で物語を書きながら、 「私が気になった事件」の裏側を作家の視点で書いているおっさん。

プロフィール画像は自画像でなく、Megabe-0ブログのマスコット、めがびちゃん。

 

雷が苦手で、光を見ると頭が固まる(元から固い)。 月初めは墓参りと神社参拝を行い、賽銭箱へ1万円を入れた際、とても気持ちがすっきりした。

 

■ 簡単な自分史 ■

0歳:釧路のある病院で生まれる。暇さえあれば母乳を吸って、ご飯を4膳食べても体重が落ちるほど、母のダイエットにものすごく貢献したらしい

 

3歳:行方不明になり、全裸で海を泳ごうとしたところ、いとこのお姉さんに発見され、この世へ留まる

 

8歳:自分のお金でおもちゃのカードを初めて買い、経済を知る。なぜか父親に怒られ、家出するがすぐに見つかる。

 

12歳:学校で給食委員長になる。委員長として初めて全校生徒の前にて演説する際、原稿用紙を忘れてアドリブで笑いを誘いながらも何とかやり過ごし、多くの生徒に名前と顔を覚えてもらう。また、運動会の騎馬戦では変なアドリブを行い、多くの笑いを誘った。

 

18歳:初めて好きな人ができたけれど、告白が恥ずかしくてついにできず、別れたことを今でも根に持っている(妻となる人にははっきり言えてよかった)

 

21歳:大学在学中、アルバイトを始める。人手不足かつとても忙しい日々を過ごしながら「どうせなら自分から楽しいことをしていきたいなあ⇒起業って選択肢があるのか」働き方の選択肢を見つける

 

27歳:自分で作った会社がうまくいかず、一度たたんで都落ち。実家でとことん自分を責める日が続く。「何をやっても駄目だな、お前は」など。自分を責めても自殺ができず、体中から毒素があふれ出て苦しい日々を送る。寝るのも怖かった日々。

 

28歳:「このままじゃいけない」決心を決め、小学校からの勉強をやり直す。高校の勉強で躓きながらも、学び直すうちに「自分は何もわかっていなかったんだなあ」大切な教えに気づかされる。 加えて、小説やイラストなど「今までの自分が手を出さなかった分野」に手を伸ばしてみた。

 

29歳:「定義」と「自己肯定」こそが生き方を決めると気づかされ、不安な日々が起きても、心が強くなったと感じる。でも子供の誘惑にはめっぽう弱くなる。

 

35歳:人生初の交通事故(物損)に出会う。冬道の運転で車を上下に大回転(スピンではない)を体型氏、何とか命を取り留め、なぜ生きているのかわからない状態に陥る。

自分の生き方はすべて自分が握っている。わずかな瞬間にしか現れない「自分の真実」を表に引きずり出し、ピンチからチャンスを生み出す発想や視点をブログやメルマガ他で提供中。