Unityの入門書を一冊写経したので、復習の為、忘れそうなことなどを記録。
背景色の変更
Main Camera.Camera.Background
スクリプトファイル
実行するには必ず何らかのGameObjectにアタッチする必要がある。
プロパティ、メソッドをpublic
宣言することで、ヒエラルキーウィンドや他ファイルからassetsのセットやメソッドの実行が行える。
スクリプトからGameObjectの取得
GameObject.Find("GameObject名");
Controllerファイル
主に動きがあるGameObjectにアタッチする。
アタッチしているGameObjectに動きを与えるにはtransform
でアクセスできる。
transformはGameObjectの現在地点と角度を基準にして動きを加える。
UI
GameObjectの一種。コンポーネントに各UIパーツを持っている。
Directorファイル
主にUIを触ったり、ゲームの進行を管理したりする。
スクリプトからUIを触る場合は
using UnityEngine.UI;
が必要。 UIへのアクセスは、
GameObject go = GameObject.Find("UIを持つGameObject"); go.GetComponent<Text>().text = "ラベル文字の変更";
のような感じ。
また、Directorファイルを実行するにはempty GameObjectにアタッチする必要がある。
AudioSource
音を鳴らすには対象のGameObjectにAudioSourceコンポーネントをアタッチする。
AudioSourceにAudioClipを渡し、再生メソッドで音を鳴らす。
2DゲームのZ座標
Order in Layer
で管理する。値が大きいほど前面にくる。
操作中にオブジェクトが消えたりするのは、背景と対象のオブジェクトのOrder in Layerが同一の場合起こることがある。
オブジェクトの現在座標
transform.position
Prefab
GameObjectの複製する仕組み。
ヒエラルキーウィンドウに配置してあるGameObjectをプロジェクトウィンドウにドラッグすることで作成できる。
複製ルールには主にGeneratorファイルに記述する。
Generatorファイル
Prefabを生成するルールを記述する。
実行はempty objectにアタッチする。
元となるprefabの指定は、
public GameObject prefab;
と記述し、ヒエラルキウィンドウから対象のprefabをoutlet設定すればよい。
生成と配置は
GameObject go = Instantiate(prefab) as GameObject go.transform.position = new Vector3( 0, 0, 0 );
のように記述する。
特に1Prefab1ファイルでなくても良いので、ルールに沿ってファイルを作成すれば良い。
アンカーポイント
UI配置には基点とする座標を選べるアンカーポイントを選べる。
通常は中央だが、上下左右斜めを加えた9箇所した地点を選択可能。
画面サイズを気にせずに隅からマージンを取りたい時などに利用する。
Filled
UIのImageを切り取る仕組み。
Fill Amountで何割残すか?を指定する。1.0が10割。
HPゲージなんかに利用すればよい。
スクリプトから他スクリプトを呼び出す
GameObject go = GameObject.Find("アタッチされているGameObject名");
go.GetComponent<アタッチしているファイル名>();
物理エンジン
物理挙動を行うオブジェクトにPhysicsコンポーネントをアタッチする。2Dの場合はPhysics2D。
Rigidbody
主に重力、摩擦。
Body Type.Kinematicで、重力や外部からの力の影響を受けなくする。
Constraints.Freeze Rotation で回転を禁止する軸を指定できる。2DだとZ軸の回転を防ぐ設定にする。
Collider
衝突、当たり判定
Colliderはオブジェクトに対しての位置と大きさを設定できる。
Colliderはオブジェクトに対して複数アタッチでき、ある程度、オブジェクトに沿った形に設定できる。
is Triggerは衝突のみを検知し、オブジェクトはすり抜けていく。
Collider同士の衝突は、ColliderをアタッチしたGameObjectで
//collisionモード void OnCollisionEnter2D(){} //triggerモード void OnTriggerEnter2D(){}
を開始として通知される。
Rigidbodyに対して力を加える
GetComponent<Rigid2D>().AddForce( new Vector3(0, 0, 0) );
オブジェクトの反転
GameObjectを反転させる。
負の数値指定で逆方向に。-1で等倍のオブジェクトとなる。
transform.localScale = new Vector3(-1, 1, 1);
アニメーション
アニメーションさせる対象のオブジェクトを選択した状態でツールバーのWindow - Animationを選択。
パラパラ漫画の場合、PropertyをSprite Render.Spriteに指定。
プロジェクトウィンドウからパラパラさせる画像をドラッグ指定する。
アニメーションの時間長は最終画像からの経過秒数を含めた位置を選択し、Add Keyframeを押下し設定できる。
アニメーション速度は
GetComponent<Animator>().speed = 2.0f;
として設定変更できる。
1つのGameObjectに複数のアニメーションを設定することができる。
アニメーション名とドロップダウンからCreate New Clipで新たなタイムラインを登録できる。
Animation Controller
アニメーションを作成すると自動的に作成される。
複数のアニメーションを制御するには、Animation Controller内で、Enter - アニメーション1 - アニメーション2というように次にどのアニメーションを再生するかを繋げていく必要がある。
Has Exit Time : 自動で別のアニメーションに遷移
アニメーションの変更triggerを作成するには、Parameters - + - Triggerで生成できる。Animationウィンドウ左上の分かりづらい場所にある。作成したtriggerは、Animation Controllerで作成した矢印にConditionsとしてアタッチできる。
アタッチしたtriggerは、スクリプトファイルから
GetComponent<Animator>().SetTrigger("トリガー名");
としてキックできる。つまりアニメーション変更の契機となる。
カメラの移動
カメラもGameObjectなので、Controllerファイルをアタッチしてtransformで動きを与えることができる。
シーン遷移
シーン遷移は
using UnityEngine.SceneManagement; SceneManager.LoadScene("シーン名");
で行える。
ビルド時に全シーンを指定することを忘れずに。
ゲームをやり直す際、ロード中のSceneを再度ロードするようなこともできる。
Terrain
3DのGameObjectの一種。地形作成に利用する。いろんなテクスチャをや草や木なんかを作成できる。便利。
Terrainを配置する軸は左下が原点になるのでGameObjectの感覚で配置すると見切れたりするので注意。
Raise/Lower Terrainアイコン : Terrainに起伏のつける。Shiftを押しながらドラッグで起伏を下げる。マイナスにはならない。
Paint Textureアイコン : テクスチャを使用する。Edit Texturesをクリックして利用するtextureをselectより選択する。選択後、Addを押下。
最初に選択したテクスチャは全面を塗りつぶす。
Place Treeアイコン : 木を配置する。Edit Trees - Add Treeで木オブジェクトとなるprefabを選択できる。
テクスチャの追加
ツールバー - Assets -> Import Package - Environment から。
いっぱいありすぎて何がなんだか...
パーティクル
GameObjectのAdd Component - Effects - Particle Systemから設定。
Renderer - Material : パーティクルの指定
Shape : 放出形状
Emission - Rate over Time : フレームごとに生成する数(多分)
Emission - Bursts : 一定間隔で放出する設定
Duration : エフェクトの再生時間
Start Lifetime : パーティクルの表示時間
Size over Lifetime : パーティクルサイズの時間に対する変化(徐々に小さくなど)
Looping : 繰り返し再生するか?
Play On Awake : オブジェクトがアクティブになると自動で再生するか?
スクリプトから再生する場合は
GetComponent<ParticleSystem>().play();
のように記述する。
Ray
カメラからタップされた3D空間へと向かうベクトル。
directionでカメラからの方向を取得できる。
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Vector3 direction = ray.direction;
またRayはColliderとの衝突を検知できる。つまりColliderオブジェクトと衝突した座標がわかる。
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Physics.Raycast(ray, out hit, Mathf.Infinity);
でhit.point.x, y, zで座標を取得できる。
ライトの設定
光源の位置や角度、強弱を設定できる。
Intensity : ライトの強弱
ツールバー - Edit - Project Setting - Quality - Shadow Distance : 影の調整
次はこれをやってみます。