Unityを勉強し始めて数か月経ちました。色々な教材やサイトを見ながら学習していますが、ちゃんと理解できているか不安です。
人は記憶したことを1時間後には50%忘れ、24時間後には70%忘れ、1か月後にはほとんど覚えていないという研究結果があります。ですので、自分が学んだことをメモしていくことにしました。
同じく初心者の方にも役立ててもらえるよう、ブログ記事として情報をシェアしていきたいと思います。
目次
C#関係
プログラミングにおいては、しばしば省略された表現が使われることがあります。これは、コードを短く、わかりやすくするための手法です。しかし、初心者にとっては、この省略が理解しにくい場合があります。特に、中級者向けの教材では、省略された表現が頻繁に使われ、説明もないままに進むことがあります。その結果、理解していないと、何が何やらわからなくなってしまうこともあります。
属性
SerializeField属性
SerializeField属性は、Unityのスクリプトで使用される属性の1つで、変数の前に付けることで、その変数がインスペクター上で編集可能になります。主に、プライベートな状態で変数を保ちつつ、外部からのアクセスを制限しつつ、値を手動で設定したい場合に使用されます。
[SerializeField]
private int Speed;
Header属性
インスペクター上に記述した文字が表示されるようになります。
日本語でコメントをつけられるため、その変数がなんの数値なのか変更する時にわかりやすくなります。
[Header("移動速度")]
public float Speed;
RequireComponent属性
スクリプトをアタッチしたオブジェクトに指定したコンポーネントを自動的に追加することができる。
コンポーネントのつけ忘れ防止や複数のオブジェクトに同じスクリプトを使用する場合などに使えます。
// この場合Rigidbody2Dが自動的にアタッチされる。
[RequireComponent(typeof(Rigidbody2D))]
public class PlayerController : MonoBehaviour {
関数
Destroy メソッド
指定したゲームオブジェクトを破壊することができます。
また何秒後に破壊といったこともできます。
// 5秒後にこのスクリプトがアタッチされているゲームオブジェクトを破壊する
Destroy(gameObject, 5f);
Instantiateメソッド
指定したPrefabを生成するためのメソッドです。
public GameObject prefabToSpawn;
public Transform spawnPoint;
void Start()
{
// プレハブから新しいインスタンスを生成し、指定された位置と回転で配置する
Instantiate(prefabToSpawn, spawnPoint.position, spawnPoint.rotation);
}
TryGetComponent
TryGetComponentは、GetComponentとnullチェックを一度に行ってくれる便利な書き方です。これによって、冗長なコードを省くことができます。
Target target = col.gameObject.GetComponent<Target>();
// target 変数に Target コンポーネントが代入されているなら
if (target != null) {
DestroyEnemy(target);
}
↓これがこうなる
if (col.gameObject.TryGetComponent(out Target target)) {
DestroyEnemy(target);
}
Mathf
Mathfは、数学的な演算を行うためのユーティリティクラスです。主に、ベクトル、角度、三角関数、ランダムな数値生成などの操作に使用されます。
Unityで数学的な操作を行う際に非常に便利です。Mathfを使用することで、数学的な計算を簡単に行うことができ、ゲームやアプリケーションの開発を効率的に行うことができます。
Mathf.Clampメソッド
制御したい指定値 = Mathf.Clamp(制御したい指定値, 最小値, 最大値);
Mathf.Clampメソッドは、指定した値を最小値と最大値の範囲内に制限します。これによって、例えばHPの値が指定範囲外にならないように制御できます。
例えば、HPの最小値と最大値を指定した場合、ダメージを受け、HPが0以下になった時にはマイナス表記にならず、回復した時はHPの最大値を越える表記などもしなくなる。
これをif文で書くと面倒なので覚えておくとすごく便利。
Transform.SetParentメソッド
Transform.SetParentメソッドは、Unityにおいてゲームオブジェクトの親子関係を変更するためのメソッドです。これを使うと、あるゲームオブジェクトを別のゲームオブジェクトの子オブジェクトに設定することができます。
例えば、プレイヤーキャラクターの手に武器を持たせたい場合など、親子関係を作る必要があります。その際にTransform.SetParentメソッドを使用します。
Staticクラス
Static(静的)クラスは、通常のクラスとは異なり、MonoBehaviourクラスを継承しないため、ゲームオブジェクトにアタッチできません。その代わり、ゲーム実行と同時にインスタンスが作成され、他のスクリプトから参照可能です。
Staticクラスは常に唯一のインスタンスを持ち、変数への代入が不要でありながら、自由にアクセスできる特性があります。これにより、ゲームオブジェクトに依存せずに命令を実行できます。
プロパティ
プロパティは、オブジェクト内のデータにアクセスするための仕組みであり、外部から直接データを読み書きする代わりに、メソッドを介して値を取得または設定します。これにより、データの隠蔽や保護が容易になり、安全で効率的なコードを作成することができます。
デフォルト引数
デフォルト引数は、関数やメソッドの定義時に、引数に初期値を設定することができる機能です。これにより、関数を呼び出す際に、引数を省略することができます。省略された引数には、事前に指定されたデフォルト値が自動的に割り当てられます。この機能により、コードの記述量を減らし、可読性を向上させることができます。
public void SetUpEnemy(bool isBoss = false)
他の引数がある場合書く順番があるので注意。
//エラーにならない場合(省略していない引数を書いた後に省略引数を定義する)
public void SetUpEnemy(int x, GameObject obj, bool isBoss = false)
//エラーになる場合(省略していない引数が省略引数よりも後ろに定義されている)
public void UpdateDisplayScore(int x, bool isBoss = false, GameObject obj)
Coroutine
Coroutineは主に非同期の処理や時間差を持たせた処理を実行する際に使います。ゲーム内の様々な処理に使用されます。例えば、待ち時間を入れたり、非同期処理を行ったり、特定の条件を満たすまでループを回したりする際にも活用されます。ゲーム内のイベントや挙動のタイミングを柔軟に制御するのにCoroutineは非常に便利です。
コルーチン関数は次のような特徴があります:
- 宣言は IEnumerator 型です。
- 関数内には yield return 文が含まれます。これにより、一時停止や待機を行うことができます。
- 呼び出しには StartCoroutine() 関数を使います。
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour
{
void Start()
{
// コルーチンを開始する
StartCoroutine(MyCoroutine());
}
// コルーチン関数
IEnumerator MyCoroutine()
{
Debug.Log("Coroutine 開始");
// 1秒待つ
yield return new WaitForSeconds(1);
Debug.Log("1秒待った後の処理");
// 2秒待つ
yield return new WaitForSeconds(2);
Debug.Log("2秒待った後の処理");
}
}
メソッド・チェーン
メソッドチェーンは、複数のメソッドをつなげて1行で記述している処理。
ピリオドの位置までが1つの処理になっていて、順番に実行される。
// DOTween の DOText メソッドを利用して文字列を1文字ずつ順番に表示
txtGameOver.DOText(txt, 1.5f).SetEase(Ease.Linear);
以上が今回学習中に気になった関数や属性です。わからない単語や概念が出てきたら、積極的に調べて理解を深めることが大切だと思いました。