じゆうけんきゅうの時間

好きなことだけにひたすら向き合う...そんなひととき

<C#, Unity> class単位のログを取得する(参照渡しで渡さない方法)

C#でclass内のすべてのメンバ変数のログを取得したいと思い単純に以下のようにList型のオブジェクトでログを取得しようとしましたが,Listの中身が一番最後のデータですべて埋め尽くされました.classは参照渡しをされるため,メモリ空間をそのまま渡すことはしていないんですね.

class単位のログの取得に失敗した例

//ログを取得する対象となるclass
public class Point {
	float m_x;
	float m_y;
	float m_z;

	public void AddOne() {
		m_x += 1.0f;
		m_y += 1.0f;
		m_z += 1.0f;
	}
}

//ループを回してログを取得する側
public class MainClass {
	Point m_Point = new Point();
	List<Point> m_Log = new List<Point>();

	void Loop() {
		m_Point.AddOne();

		//classは参照渡しとして渡されるため,
		//最後のデータでログが埋め尽くされる
		m_Log.Add(m_Point);
	}
}


そこで,"MemberwiseClone"を使うと新たにメモリを確保しclassを複製することが出来ます.これを使用した例は以下の通りです.

class単位のログの取得に成功した例

//ログを取得する対象となるclass
public class Point : ICloneable {
	float m_x;
	float m_y;
	float m_z;

	public void AddOne() {
		m_x += 1.0f;
		m_y += 1.0f;
		m_z += 1.0f;
	}

	public object Clone(){
		return MemberwiseClone();
	}
}

//ループを回してログを取得する側
public class MainClass {
	Point m_Point = new Point();
	List<Point> m_Log = new List<Point>();

	void Loop() {
		m_Point.AddOne();

		// classのクローンを作ることでログの取得が可能になる
		m_Log.Add((Point)m_Point.Clone());
	}
}