はじめに
テクロスというゲーム会社でエンジニアとしてアルバイトしています。
別の言語を触ってて、久しぶりにUnityを触ると「あれ?これどう書くんだっけ?」となって初歩的なこともいちいち調べないと書けなかったりします。レベルが低いだけ説。。。
なので今回は自分用にレベルの低いチートシートを作ります。基本3Dです。
本文
関数名とクラス名は大文字にしないと注意される。地味に忘れる。
画面遷移
usingUnityEngine.SceneManagement;voidChangeScene(stringsceneName){SceneManager.LoadScene(sceneName);}//呼び出し方の例publicvoidOnClick(){ChangeScene("MainScene");}
OnClick()をボタンに紐づけて、ボタン押したら画面遷移って時に使えます。ボタンに紐づける関数はpublicと明示しないといけないので注意。
ビルドセッティングに遷移先シーンが追加されてないと遷移されないので注意。
GameObject関連(取得、無効化、破壊)
GameObject.Find()はCPUの負荷がちょっと大きいみたいな記事を見たのであまり多用しないようにするべきかも。
取得関連
//ソースコードでgameObjectを取得するGameObjacthoge=GameObject.Find("hoge").gameObject;//enemyタグが付いているgameObjectを複数取得するGameObject[]enemies=GameObject.FindGameObjectsWithTag("enemy");foreach(GameObjectenemyinenemies){//これでenemy一つ一つに処理を施すことができる}//editorからgameObjectを設定する.2通り[SerializeField]privateGameObjecthoge;publicGameObjecthoge;
無効化関連
//gameObjectの無効化GameObject.Find("hoge").gameObject.setActive(false);//gameObjectに付いてるcomponentの無効化GameObject.Find("hoge").GetComponent<HogeController>().enabled=false;
破壊
GameObjecthoge=GameObject.Find("hoge").gameObject;Destroy(hoge);
クラスのインスタンス化
//オブジェクト"Cube"にアタッチしてる"HogeController"内のメソッドを使いたい時HogeControllerhogeController;hogeController=GameObject.Find("Cube").GetComponent<HogeController>();//オブジェクトにアタッチしてない"HogeController"内のメソッドを使いたい時HogeControllerhogeController=newHogeController();
UnityはSceneを実行したときオブジェクトが生成されるので、そのときアタッチされてるクラスも全てインスタンス化される。それを新しくnewでインスタンス化しようとするとエラーになるので注意。
プレハブのインスタンス生成
publicGameObjectprefab;GameObjectinstance=Instantiate(prefab)asGameObject
prefab化させるには、HierarchyビューからProjectビューにドラッグアンドドロップする。それでできたprefabをInspectorビュー上で紐づける。
遅延
void MonoBehaviour.Invoke(string methodname, float time)を使う。
//3秒後にhoge関数を呼び出したい場合privatefloatwaitTime=3.0fInvoke("hoge",waitTime);//関数名はstringで渡すfunchoge(){Debug.Log("hoge");}
数秒ごとに繰り返し
privatefloattimeLeft=5.0f;//例えば5秒ごとに//以下の関数をUpdate()内で呼び出すfuncrepeat(){timeLeft-=Time.deltaTime;if(timeLeft<=0.0f){//繰り返したい処理を書く}}
移動と回転
移動はさすがに忘れないから割愛(基準がわからん)。ただ、tranform.positionを書き換えて移動させるのは瞬間移動なので、壁抜け等が発生します。AddForceやらを状況に応じて使い分けよう。
回転はよく忘れるけど目的によって色々あるので用途によって調べましょう。Unityでオブジェクトを回転させる方法まとめが分かりやすいと思いました。
一応指定した秒数で指定した角度まで回転させるscriptを置いておきます。
privateboolnowRotating=false;//回ってる途中はtrueprivatefloatstartTime;privatefloattimeSpan=3.0f;//何秒かけて回転させるかprivatefloatdiff;voidstartRotation(){startTime=Time.timeSinceLevelLoad;nowRotating=true;}voidrotation(){diff=Time.timeSinceLevelLoad-startTime;if(diff>=timeSpan){nowRotating=false};//timeSpanだけ時間経過したらおしまいvarrate=diff/timeSpan;//カメラをゆっくりx軸周り0度から90度に回転させるfloatangle=Mathf.LerpAngle(0.0f,90.0f,rate);gameObject.transform.eulerAngles=newVector3(angle,0f,0f);}//使用する時はstartRotation()をボタンクリック等に紐つけて、voidUpdate(){if(nowRotating){rotation();}}
親オブジェクトとの位置関係で角度や位置を設定したいとき
地味に大事カモ
childObject.gameObject.transform.parent=parentObject.gameObject.transform;childObject.gameObject.transform.localPosition=newVector3(0.0f,0.0f,5f);//親の真上childObject.gameObject.transform.localEulerAngles=newVector3(0.0f,0f,0f);//親と同じ向き
衝突判定
これは3Dと2Dで使う関数が違うので注意。3Dで慣れてて2D作ってみるとあれ?ってなる。2Dは関数名の後ろに2Dってつきます。
//Playerタグを持ってるオブジェクトとの衝突privatevoidOnCollisionEnter(Collisioncol){if(col.gameObject.CompareTag("Player")){//衝突した時の処理}}
オブジェクトと物理的に衝突するならOnCollisionEnter, isTriggerにチェックが入っていてすり抜けるようにしてるならOnTriggerEnterを使う。
番外編(Editorの使い方)
コンソールボックスの出し方
Window->General->Console
画像の出し方
1.表示したい画像をドラッグアンドドロップでProjectビューに入れる。
2.Texture TypeをSprite(2D and UI)に変える
3.Canvas内にCreate->UI->ImageでImage作成
4.そのImageのSourceImageにさっきの画像をセットして、PreserveAspectにチェック入れて完成。
あとがき
久しぶりに書くと引数の宣言って string name だっけ name:string だっけ みたいなレベルで忘れる。
気を付けなはれや。
いいねがほしいのでいいねください。