概述:
IComparable 表示类能够去比较。
IComparer 是比较器,能够去比较两个实例的大小。
鸡蛋和鸡蛋间本身无法比较哪个重,电子称可以分辨两个鸡蛋(或其他物体)谁更重,所以 电子称可以看作是IComparer
人可以通过掰手腕,比出那个人力气大,所以人可以看作是IComparable 可以相互间比较的。
比较器实例:
using System;
using UnityEngine;
using System.Collections.Generic;
public class UnrealDistanceComparer:Comparer<GameObject>
{
private Vector3 _zeroPoint = Vector3.zero;
//首先保存距离,若存在则取,否则重新计算
private Dictionary<GameObject,float> dic_GoToZeroDistance = new Dictionary<GameObject, float> ();
public UnrealDistanceComparer (Vector3 zeroPoint)
{
this._zeroPoint = zeroPoint;
}
public override int Compare (GameObject go1, GameObject go2)
{
if (go1 == null && go2 == null) {
return 0;
}
if (go1 == null) {
return -1;
}
if (go2 == null) {
return 1;
}
float distance1;
float distance2;
if (dic_GoToZeroDistance.ContainsKey (go1)) {
distance1 = dic_GoToZeroDistance [go1];
} else {
distance1 = Vector3.Distance (go1.transform.position, _zeroPoint);
}
if (dic_GoToZeroDistance.ContainsKey (go2)) {
distance2 = dic_GoToZeroDistance [go2];
} else {
distance2 = Vector3.Distance (go2.transform.position, _zeroPoint);
}
if (distance1 < distance2) {
return -1;
}
if (distance1 > distance2) {
return 1;
}
return 0;
}
}
使用方法:allEnemies是一个list类型
allEnemies.Sort (new UnrealDistanceComparer (transform.position));
使用前