UnityC# Listの使い方

Listクラスとはの画像 Unity C#入門講座
Listクラスは配列を便利にしたもの。


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回はインターフェースとポリモーフィズムについて学びましたが、今回の記事ではListについて解説していきます。

前回の記事:

UnityC#のインターフェースの使い方・ポリモーフィズムの考え方
今回の記事ではオブジェクト指向の重要な機能であるインターフェースとポリモーフィズムについて解説していきます。 インターフェイスを使いこなせるようになるとプログラム全体の管理がしやすくなります。また、Unityなどフレームワークやライブラリ...

Listは配列をより使いやすくしたコレクションの一つになります。


【Unity入門の森の最新ゲーム開発講座もお届け】

配列より便利なListクラスとは

Listクラスについての画像

Listクラスは基本的な使い方は配列と同じだが、要素の追加・削除ができる。

Listクラスは配列と似たものになります。各要素にアクセスする時に添字を使用するのも同じです。

Listクラスは配列を便利にしたもので、大きな違いとしては以下のものがあります。

  • 要素数の追加ができる。List.Addメソッド、List.Insertメソッドなど
  • 要素の削減ができる。List.RemoveAtメソッドなど
  • 要素数の確認。Countプロパティを使用する。(Lengthではない)

また、通常のクラスとは異なりテンプレートと呼ばれるC#の機能を利用しています。

テンプレートは強力な機能で実装する際には色々と注意点がありますが、利用する際には型名の後に<>の中に型を指定したものを書くだけでいいです。

テンプレートの使い方の例:new List<int>(), new List<float>()

Listのサイズと実際に確保している要素数について

ListクラスではCountプロパティが要素数を表していますが、実際に確保している個数はそれより多い場合があります。

リストは配列とは異なり要素数が使用していく内に変化する可能性があるのですが、その都度毎回要素を確保することはコンピュータ的に負荷が高い処理になります。この問題を回避するためにListクラスでは一度の要素確保の際にCountプロパティの値以上を確保する場合があります。

実際に確保されている要素数を確認する際はCapacityプロパティを使用してください。

また、CountプロパティとCapacityプロパティの値を一致させたい時はTrimExcessメソッドを使用してください。

Listクラスが継承しているインターフェースについて

Listクラスは次のインターフェースを継承しています。基本的にC#の標準ライブラリが提供するコレクション型を表すものになります。これらのインターフェースが所属する名前空間はSystem.CollectionsおよびSysten.Collections.Genericになります。

  • IList
  • IList<T>
  • IReadOnlyList<T>
  • ICollection
  • ICollection<T>
  • IReadOnlyCollection<T>
  • IEnumerable
  • IEnumerable<T>

Listクラスに対してどんなメソッドやプロパティが実装されているかはこのインターフェースを見ればわかります。

また、必要があれば機能のオーバーライドを行うこともできますね。

デリゲートを引数に渡すメソッドについて

Listクラスおよび多くのC#のクラスでは、デリゲート(※)という「メソッドを表す値」を引数に取るメソッドが数多く定義されています。

(※デリゲートについては「UnityC# デリゲートとイベントとUnityActionの使い方」で詳しく解説します。デリゲートにはクラスのメソッドやラムダ関数、無名関数などが使用できます。)

それらのメソッドでは呼び出し元がそのメソッドが行う処理を部分的にカスタマイズできます。カスタマイズできる部分をデリゲートとして渡します。

また、デリゲートとして渡すメソッドは引数としてリストにある要素一つを渡し、それに応じて戻り値を返すものが多いです。

Listクラスでは次のメソッドにデリゲートを渡すことができます。

  • Exists:デリゲートに渡したメソッドがtrueを返す要素があるか確認する。
  • Find:デリゲートに渡したメソッドがtrueを返す要素を返す。複数ある場合は最初に見つかったものを返す。
  • FindIndex:デリゲートに渡したメソッドがtrueを返す要素の添字を返す。複数ある場合は初めに見つかったものを返す。
  • FindAll:デリゲートに渡したメソッドがtrueを返す要素を全て返す。
  • RemoveAll:デリゲートに渡したメソッドがtrueを返す要素を全て削除する。
  • ForEach:全ての要素をデリゲートに渡したメソッドに渡して処理する。foreach文の古い書き方。
  • ConvertAll:全ての要素に対してデリゲートに渡したメソッドを使って値を変換する。

ここで紹介したListクラスのメソッドをより便利にしたものとしてLinqと呼ばれるC#の機能があります。Linqについては「UnityC#のLinq・属性・拡張メソッド・クラスの部分定義の使い方」で解説していきます。

【実践】Unityで実際にListを使ってみる

サンプル実行例の画像

サンプルを実行するとPrefabに設定したGameObjectを横一列に複製される。Startメソッド内でListクラスのMeshesに複製したものを追加している部分に注目。

それでは実際にUnityでListクラスを使ってみましょう!

今回のサンプルコードではListクラスに複数のMeshRendererを設定することができます。

ListクラスはUnityエディタのInspector表示に対応しているので、Unityエディターからシーン上にある好きなMeshRendererを設定できます。

ただし、自分自身を複製すると、無限ループに陥ってしまいUnityが停止してしまうので注意してください。

また、配列との違いを表すため、Startメソッド内でListクラスのAddメソッドを使用し、スクリプト上からGameObjectを作成しています。

GameObject作成部分ではUnityEngine.Object.Instantiateメソッドを使用して、Prefabフィールドに設定されたGameObjectを複製しています。

Prefabフィールドにはプレハブ(Prefab)というUnity特有のアセットも使用できますが、それについては他の記事でご紹介したいと思います。

まとめ

今回の記事ではListについて解説してきました。

簡単にまとめますと以下のようになります。

  • Listクラスは配列を便利にしたもの。
  • C#のテンプレート機能を利用している。
  • 基本的な使い方は配列と同じ。
  • 配列とは違い要素の追加・削除ができる。
  • 要素数の確認にはCountプロパティを利用する。
  • コンピュータの都合からCountプロパティ以上の要素数を確保している場合がある。
  • 実際に確保している要素数を確認したい時はCapacityプロパティを利用する。
  • CountとCapacityプロパティの個数を一致させたい時はTrimExcessメソッドを使用する。

それでは次の記事に行ってみましょう!

UnityC# 辞書(ディクショナリー)の使い方 キーと値でデータを指定する
今回の記事では辞書型(ディクショナリー、Dictionary)について解説します。 辞書型も前回扱ったListクラスと同じくコレクションの一種になります。 前回の記事: 簡単にデータにアクセスできる辞書型(ディクショナリー)って何...

初心者向けUnityC#入門講座に戻る>>


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

タイトルとURLをコピーしました