Unity

アセットストア

ウィンドウタブのアセットストアをクリックすると、アセットストアが出てきて、
検索を行うことで、アセットを検索しダウンロードすることができる。

オブジェクトを動かしたり回転させる

オブジェクトを選択し、左上に出る回転マークや十字マークを選択することで、
そのオブジェクトにどういう編集を行いたいか選べる。

カメラ追従

ヒエラルキーウィンドウのメインカメラを、追従させたい対象にD&Dすれば、カメラが対象の子オブジェクトになって追従を行う。

メッシュ

ポリゴンの集まり。オブジェクトの表面。
メッシュには、テクスチャなどを貼り付けることができる。

シェーダー

画像を描画する機能。基本的にUnityに最初から用意されているスタンダードシェーダーが使われる。
シェーダーはマテリアルが保持している。インスペクターウィンドウのマテリアルの部分に、どのシェーダーが使われているかの記述がある。

バッチング

同じマテリアルを使ったオブジェクトがある場合、バッチングと呼ばれる、同じマテリアルを使ったものをまとめる処理が行われ、描画処理が軽くなる。
ただし、オブジェクトの頂点数によってバッチングができない場合もあるらしい。
シェーダーによってその条件も変わるらしい。
同じマテリアルを使ったものをまとめて、1回のドローコールで描画できる?

Set Pass ドローコール

1フレームの描画を行う際、CPUからGPUに何度命令が行われるかを表すもの。
Set Passが少ないほど高いFPSを維持できる。

Atlas

画像を1つにまとめて、1回のドローコールで描画することでSetPassを少なくできる。

Collider

オブジェクトが物理的にぶつかる処理を行うためのもの。
Colliderは目に見えないので、実際のオブジェクトの形状と同じにする必要はない。

コライダーには、メッシュコライダーとプリミティブコライダーがある。
メッシュコライダーは、メッシュにつける当たり判定?
プリミティブコライダーは、おおざっぱにつける当たり判定らしい。
当たり判定用のboxやsphereを用意して、それをオブジェクトに当てはめて当たり判定に使う。
オブジェクトを動かしているときはメッシュコライダーは使えない。

IsTrigger

Colliderオブジェクトの1つ。
オブジェクトに、当たり判定をなくして、何かがオブジェクトに触れたら処理を行うために使うもの。
IsTriggerをtrueにした物体は、他の物体から物理的に動かされない。当たっても透ける。
オブジェクトを選択し、インスペクターウィンドウの、IsTriggerにチェックを入れると、そのオブジェクトのIsTriggerがtrueになる。

スクリプト上で、当たり判定の処理を行うメソッドは
public OnTriggerEnter(Collider other){}
引数のotherは、当たったオブジェクトを示す。

上記のメソッドは、IsTriggerがオンになったオブジェクトの当たり判定。
IsTriggerがオフ同士のオブジェクトの当たり判定は
public OnCollisionEnter(Collider other){}

オブジェクトの活性非活性

ゲームオブジェクト.activeSelf
というメソッドで、そのオブジェクトが活性か非活性かbool値で取得できる。
ゲームオブジェクト.activeHierarchy
だと、ヒエラルキー上の親がfalseだと自身がtrueでもfalseを返す。

Canvas

UnityのテキストやボタンなどのUIは、すべてCanvasというオブジェクトの子オブジェクトとして作られる。
Canvasを作ると、大きな四角が出てきて、その中でボタンとかテキストの移動を行えた。
その四角は画面全体を表すらしく、その四角の中心にボタンを置くと、画面の中心にボタンが表示された。

インスペクタータグのそれぞれの名前の横のチェックボックスをオフにすることで非表示にできる。
コードから表示非表示を操作したい場合は、
変数名.SetActive(true)で、表示に、falseにしたら非表示にできる。

インスペクターウィンドウのSprite Renderのレイヤーの順序から数字を設定すれば、画像の前面・背面を設定できる。数字が高いほど前面に出る。

ボタン

ボタンのインスペクターウィンドウの、クリック時()の部分で+を押し、オブジェクトに何らかのオブジェクトを入れると、その横のScriptのウィンドウに、そのオブジェクトのスクリプトの一覧を表示できるようになる。
そこで選んだスクリプトを、ボタン押下時の処理にできる。

マウスの処理ごとの色を、インスペクターウィンドウから設定できる。
ハイライト時の色は、マウスオーバー時の色。
押下時の色は、クリックしたときの色。

Script(プログラミングコード)

アセットウィンドウで、Scriptsというフォルダを作り、その中でC#スクリプトを作成すると、C#のコードを書くことができる。たぶんScriptsというフォルダはなくてもいい。

public static int 変数名;
と書くと、クラスで1つだけ(インスタンスごとに作られない)の変数となり、他のスクリプトから、クラス名.変数名で取得できるようになる。

クラスの配列を作成する際
public クラス名[] 変数名 = new クラス名[3];としただけじゃ定義されない。
変数名[0] = new クラス名();と一つ一つインスタンスを作らなきゃいけない。

メソッドでオプション引数を使う場合
void メソッド名(int 変数名=1){}と書けば、引数を省略できる。省略した場合、初期値は指定した値(左の記述だと1)になる。

GameObject

GameObjectという型の変数を作ることで、それをオブジェクトを参照するための変数にできる。
public GameObject Player;
public GameObject Item;
など。
変数に格納したオブジェクトの名前を取得したい場合は、
player.name、Item.nameと書けばいい。

作成したスクリプトを、ヒエラルキーウィンドウのオブジェクトにD&Dすることで、そのコードをオブジェクトに付けることができる。
そのオブジェクトを選択し、インスペクターのスクリプト部分から、GameObjectの変数に入れ込むオブジェクトを決められる。

スクリプトからGameObjectにオブジェクトを入れ込む場合は
ゲームオブジェクト名 = GameObject.Find(“入れ込むオブジェクト名”);
と書く。

getComponent

ゲームオブジェクトのコンポーネントを取得できる関数。
コンポーネントとは、オブジェクトに付く属性。
変数.getComponent<Text>().text = “代入したい文字列”;
と書けば、指定した変数のTextコンポーネントの、text属性に指定した文字列を入れることができる。

変数名を指定せずにgetComponent<コンポーネント名>()と書くと
そのスクリプトがつけられているゲームオブジェクトのコンポーネントを取得する。

using Unity.Engine.UI;を書かないといけない。

マテリアル

オブジェクトの見た目を設定するもの。色とか質感。
オブジェクトを作ったら、デフォルトマテリアルが自動で設定される。
デフォルトマテリアルはインスペクターウィンドウから設定することはできない。
それがしたい場合は、新しくマテリアルを作って、それをオブジェクトに装着する必要がある。
新しくマテリアルを作って、アセットウィンドウのマテリアルを、ヒエラルキーウィンドウのオブジェクトにD&Dすれば、マテリアルを設定できる。

マテリアルのShaderを、Unlit/Transparentに設定し、
インスペクターウィンドウのテクスチャ部分に、プロジェクトウィンドウに入れ込んだ画像をD&Dすれば、マテリアルに画像を設定することができる。

物理マテリアル

物体に物理的な処理を加えるためのマテリアル。
インスペクターウィンドウから値を変更できる。
Dynamic Friction 動的摩擦係数
Static Friction 静的摩擦係数
Bounciness 反発係数

プレハブ

プレハブというものにオブジェクトを入れることで、そのオブジェクトを使いまわせる。
ヒエラルキーウィンドウのオブジェクトを、プロジェクトウィンドウにD&Dすればプレハブ化できる。
わかりやすく、プロジェクトウィンドウにプレハブというフォルダを作って、そこに入れるといいかも。

Transform

オブジェクトの大きさや位置を扱うクラス。
スクリプトでは、
変数名.Transform.position.x;
変数名.Transform.Translate(1,0,0);
と、参照したり値を変更したりできる。
Translateとは、指定した値だけオブジェクトを移動するメソッド。
Translate(x座標,y座標,z座標)で指定する。

C#ではtransform.position.x = 10;と値を直接いじることはできないらしい。
Vector3 aaaa = transform.position;
aaaa.x = 10;
transform.position = aaaa;
として、一度Vector3の形で取得すればいい。

SceneManager

シーンを遷移したりできるクラス。
シーンとはUnity上の1つの場面。
オブジェクトの座標や、オブジェクトのコンポーネント情報はシーンにまとめて保存される。
SceneManagerを使う場合、using UnityEngine.SceneManagement;とインポートする必要がある。

SceneManager.LoadScene(“読み込みたいシーンの名前”);
と書けば、指定したシーンに遷移できる。
Scene aaaa = SceneManager.getActiveScene();
と書けば、現在のシーンを、aaaaという変数として取得できる。
SceneManager.LoadScene(aaaa.name);と書けば、現在のシーンを再読み込みできる。

Unityで複数のシーンを作る場合、編集しないシーンは、ヒエラルキーウィンドウのシーンを右クリックでシーンのアンロードを選べばいい。そうじゃないとすべてのシーンが混ざった状態になる。

Time.deltaTime

そのフレームで何秒かかったかを返すメソッド。
毎フレームTime.deltaTimeを制限時間から引くことで、時間制限のある処理を行える。

静的 static

オブジェクトのインスペクターウィンドウの一番上に、静的(static)という項目がある。
これはそのオブジェクトが動かないことをUnityに知らせる。
そうすることで、いろいろ処理が軽くなったりするらしい。

ナビゲーションシステム

ゲームの世界を自動で動くオブジェクトを作ることができるシステム。
ウィンドウタブのAI、ナビゲーションからナビゲーションウィンドウを出せる。

NavMeshが、オブジェクトが自動で動く範囲。自動的に障害物などを避けて目的地まで移動する処理を行える。

オブジェクトのインスペクターから、コンポーネントを追加、ナビゲーション、ナビメッシュエージェントと選択することで、オブジェクトを自動で動けるようにできる。
自動で動くオブジェクトを、エージェントという。

public NavMeshAgent 変数名;
変数名.destination = 対象;
と書くことで、エージェントの目的地を、指定した対象に設定することができる。

NavMeshObstacle
このコンポーネントをオブジェクトに追加すると、ナビメッシュエージェントは、そのオブジェクトを避けて移動するようになる。

エージェントの動きを止める場合は、
エージェントのオブジェクト.GetComponent<NavMeshAgent>.isStopped=true;
と書けばいい。そのとき、using UnityEngine.AI;の記述が必要。

MonoBehaviour

Unityのオブジェクトが継承している大元の何からしい。

Animatorコンポーネント

シーン内のゲームオブジェクトが、どのようなアニメーションを行うのかを管理するコンポーネント。

ゲームの解像度変更

ゲームウィンドウのタブから解像度を選べる。自分でサイズを設定することも可能。
シーンウィンドウの2D/3Dというボタンから、3Dか2Dの設定も行える。

Vector3

位置や方向を操作するのに使う。
Vector3.distance(a,b)
aとbの距離を取得。transformの値でaとbを設定。

Ray レイキャスト

透明な線を伸ばし、その当たり判定を取得できる。
Pysics.Raycast(発射位置,方向,out hit,Meshf.Infinity);
Meshf.Infinityは伸びる距離?

レイキャストは、コライダーで当たり判定を行っているらしく、レイキャストで取得したいオブジェクトにはコライダーを付ける必要がある。

Rigidbody

オブジェクトに物理的な影響を与えるもの。
重力や空気抵抗などを与えて動きをリアルにできたりする。

IsKinematic
IsKinematicをtrueにすると、物体に物理的な力を与えないようにする。
スクリプトから物体の動きを行いたいときに使用する。

AddForceメソッド
Rigidbody rb = this.getComponent<Rigidbody>();
rb.AddForce(new Vector3(0.0f,0.0f,0.1f));
と書くと、指定した方向に力を与えられる。

velocityメソッド
rb.velocity = new Vector3(0f,0f,0.1f);
と書くと、指定した方向にオブジェクトを動かせる。AddForceはオブジェクトの質量などを反映させて動かすけど、velocityはそれをしないので非現実的な動きになる。

Invoke

指定した時間後に処理を行える関数。
Invoke(関数,秒数)
Invoke(“aaaa”,0.5)と書いたら、0.5秒後にaaaaという関数の処理を行う。

ParticleSystem エフェクト

ヒエラルキーウィンドウからParticleSystemをクリエイトすると、エフェクトのオブジェクトを作成できる。
インスペクターウィンドウから、エフェクトの速度や量などの設定を行える。
レンダラーのマテリアルタグで、マテリアルを設定すればエフェクトの画像や色を設定できる。

override

継承先のクラスで、メソッドを書き換えること。
継承元のクラスで
public virtual void メソッド名(){}
と書くと、オーバーライド可能なメソッドになる。
継承先のクラスで
public override void メソッド名(){}
と書けばオーバーライドを行える。

RequieComponent

スクリプトに
[RequireComponent(typeof(Rigidbody))]
と書くと、そのスクリプトをアタッチしたオブジェクトに、Rigidbodyのオブジェクトが自動的に入る。その場合、Rigidbodyは外せなくなる。
Rigidbody以外のコンポーネントでもok。

コルーチン

メイン処理と並行して別の処理を行うときに使用する。非同期処理。
Public IEnumerator メソッド名(){
yield return new WaitForSeconds(秒数);
}
とメソッドを定義する。
yield return new WaitForSeconds(秒数)で、処理を中断し、メイン処理を行う時間を設定する。
yield return nullと書いたら1フレームになる。

StartCoroutine(“メソッド名”)
と書くことで、非同期処理を呼び出せる。

Resource.Load

public GameObject cube = (GameObject)Resource.Load(“Prefabs/Cube”);
と書いたら、Resourceというフォルダの中にあるPrefabsフォルダの中のCubeというゲームオブジェクトを、cubeに格納する。

Instantiate

オブジェクトを作成するメソッド。
Instantiate(オブジェクト名,座標,回転)
と書くことで、指定したオブジェクトを指定した座標に指定した角度で生成できる。
この時作られたオブジェクトをクローンと呼ぶらしい。

Instantiate(オブジェクト名,new Vector3(0.0f,0.0f,0.0f), Quaternion.identity);
Quaternion.identityは、回転なしという意味らしい。
Instantiate(オブジェクト名)とだけ書けば、そのプレハブに設定されている座標、回転のままで生成する?

Random

Random.InitState(数値);
乱数のシードを決める。
Random.InitState(System.DateTime.Now.Millisecond);

Random.Range(x,y)
x~y-1までの値をランダムで返す。
if(Random.Range(0,10) == 1){}
と書くと、10分の1の確率で行う処理を実装できる(10は出ない)。

スプライト

2Dの画像データを表示するときのオブジェクト。
Unityには、自分で画像を用意する以外に、デフォルトで使用できるスプライトがある。
四角形や三角形など。

スクリプトから、スプライトのアルファ値を変えて、画像を透明にするには
オブジェクト名.GetComponent<SpriteRenderer>().color = new Color(1,1,1,0); としたら透明になる。最後の0を1にしたら表示される。

色を変更したい場合は
オブジェクト名.GetComponent<SpriteRenderer>().color = new Color(155.0f/255.0f,255.0f/255.0f,255.0f/255.0f);
と書けばいい。引数には1未満の値にしなきゃいけない。 new Color(1,1,1);としたら、(255,255,255)となり白色になる。

スプライトエディター

1つの画像を複数に分けて使用する場合に使う。
スプライトのインスペクターウィンドウの、スプライトモードを複数に選択。
インスペクターウィンドウのSprite Editorをクリック。
スプライトエディターのスライスから、画像を分けられる。

Animator

Animatorコンポーネントをオブジェクトにアタッチ。
Animator Controller
Animatorはアニメーションを管理するもの、Animationはアニメーションそのもの。

シーンウィンドウでオブジェクトを選択した状態で、ウィンドウタブ、アニメーターを選択すると、アニメーターを作ることができる。

オレンジ色のバーが、デフォルトのアニメーション。

デフォルトのバーを選択し、右クリック、遷移を作成を選択し、出てきた矢印を、遷移させたいアニメーションに持っていく。
その矢印をクリックすると、インスペクターウィンドウで遷移のオプションを設定できる。

インスペクターウィンドウのHas Exit Timeは、アニメーションがすべて終わった後で遷移するかどうかという意味。

アニメーターウィンドウのパラメータタブをクリックすると、アニメーションが遷移するときの条件を作成できる。
bool型のConditionsを作成したら、trueだったら遷移、falseだったら遷移などが定められる。
遷移の矢印のインスペクターから、Conditionsにパラメータタブで作成したConditionsを追加することでアニメーションの条件を設定できる。

スクリプトから、Animator.SetBool(“変数名”,true);と書いたら、パラメータタブで作った変数を変更できる。

Input

キーの入力情報などを得る。

Input.GetAxis(“Horizontal”);
と書くと、Unityの編集タブ、プロジェクトの設定、Input情報、水平方向にある情報を得られる。

float aaaa = Input.GetAxis(“Horizontal”);
と書くと、正方向のキーが押されたら+の値、負方向のキーが押されたら-の値が変数に入る。
そうすることで、キーの入力を取得できる。
Input.GetKey(“left”);でキーの入力を取得することもできるけど、汎用性がないらしい。
キーの入力方法が変わったときなどにそのまま使えるから?

2Dの画面サイズ

カメラのインスペクターウィンドウの投影方法を、並行投影にして、サイズを、設定したい画面サイズの縦サイズの半分の値にする。

そしてインポートした画像ファイルのインポート設定を、ユニットごとのピクセル数を1にすればいい。

foreach

コレクションの要素をすべて参照する。
int[] array = {0,1,2,3};

foreach(int i in array){
if(i==1) continue;
else if(i==2) break;
Debug.Log(i);
}
continueと書くと、そのあとの処理を無視して次のループに入る。
breakと書くと、そこでforeach文の処理を終わる。
上の文は、0だけが出力される。

画像などのUIをクリックしたときの処理

メインカメラに、Physics 2D Raycastを追加。

オブジェクトのインスペクターウィンドウから、Add Component、イベント、EventTrigger。
新しいイベントタイプを追加で、それぞれクリックなどの処理を行ったときの設定ができる。
PointerDown ボタンを押したとき、PointerUpボタンを押して離したとき。
オブジェクトにコライダーを追加。

音を鳴らす SE BGM

音を出したいオブジェクトに、Audio Sourceをアタッチする。

public AudioSource 変数名;
AudioSource = オブジェクト名.GetComponent<AudioSource>();
としてAudioSourceのコンポーネントを取得
public AudioClip 音声名;
で、インスペクターウィンドウから鳴らしたい音声を、変数にアタッチする。
AudioSourceのオブジェクト名.PlayOneShot(音声名);
で音を鳴らすことができる。

PlayOneShot()は1回だけ鳴らす。

編集画面
タイトルとURLをコピーしました