クラスにクラス (ボクセル) の配列があります。次のメソッドを使用して、配列への追加と配列からの削除を行います。memento パターンは、各メソッドのアクションを保存するために使用されるため、いつでも元に戻す/やり直すことができます。
public void AddVoxel(int x, int y, int z)
{
int index = z * width * height + y * width + x;
frames[currentFrame].Voxels[index] = new Voxel();
// Undo/Redo history
undoRedoHistories[currentFrame].Do(new AddMemento(index));
}
public void RemoveVoxel(int x, int y, int z)
{
int index = z * width * height + y * width + x;
// Undo/Redo history
undoRedoHistories[currentFrame].Do(new RemoveMemento(index, frames[currentFrame].Voxels[index]));
frames[currentFrame].Voxels[index] = null; // Does not update 'voxelSelected' reference
}
別のクラスで、上記のクラスが保持するボクセルの配列内の特定のボクセルへの参照が必要です。
private Voxel voxelSelected = null;
参照型として、この値が「指す」配列の部分がボクセルを保持するか、null であるかを自動的に認識できるようにしたいと考えています。これは、元に戻すコマンドを使用する場合に重要です。これは、ボクセルが配列から削除されてヌルになる、またはその逆になる可能性があるためです。
配列からボクセルを取得するには、次のメソッドを使用します。
public Voxel GetVoxel(int x, int y, int z)
{
return frames[currentFrame].Voxels[z * width * height + y * width + x];
}
次に、ボクセルへの参照を次のように設定します。
public void SetVoxelSelected(ref Voxel voxel)
{
voxelSelected = voxel;
}
voxelMeshEditor.AddVoxel(0, 0, 0);
var voxel = voxelMeshEditor.GetVoxel(0, 0, 0); // Copies rather than references?
SetVoxelSelected(ref voxel);
Console.WriteLine(voxelSelected == null); // False
voxelMeshEditor.RemoveVoxel(0, 0, 0);
Console.WriteLine(voxelSelected == null); // False (Incorrect intended behaviour)
配列が更新されると voxelSelected 値が自動的に更新されるように、配列内のボクセルを正しく参照するにはどうすればよいですか。