List与Vector3.Set()
错误案例
List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));
foreach (Vector3 one in list)
{
one.Set(1f, 1f, 1f);
}
结果:
list = {Vector3(0f, 0f, 0f)}
正确方法
List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));
foreach (Vector3 one in list)
{
one = new Vecor3(1f, 1f, 1f);
}
原因
此处one是一个getter,是原始值的一份复制,而Set方法只会改变getter的值,并不会改变原始值。同理的还有Unity里的transform.position。
List<Vector3>.Contains()
错误案例
List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));
bool containsVal = list.Contains(new Vector3(0f, 0f, 0f));
结果:
containsVal = false
正确方法
...
public static bool ContainsManially(this List<Vector3> list, Vector3 val)
{
foreach (Vector3 one in list)
{
if (one == val)
return true;
}
return false;
}
bool containsVal = list.ContainsManially(new Vector3(0f, 0f, 0f));
原因
.Contains()使用的是Vector3.Equals(),其实现方法和==的实现方法是不一样的。详见How do I properly use List-Vector3-.Contains()?。