我有一个Unity项目,其中各种 Cords 在各种 Hooks 之间拉伸。玩家可以从其钩子抓住绳子的一端,携带它并将其连接到另一端。作为此功能的一部分,挂钩需要跟踪哪些绳索连接到它,并且当玩家试图连接新的绳索时,检查这样做是否会“消失”绳索(即它们不是将两端钩住到同一个地方,并且通过连接到两端的相同钩子,绳子不会与另一个绳子合并。)
每个Cord
对象都有start
和end
个属性,这些属性引用它所附加的Hook
个。目前,我一直在跟踪List
:
public class Hook : MonoBehaviour {
List<Cord> attached = new List<Cord>();
public void Attach(Cord c) {
if (!ConflictTest(c))
attached.Add(c);
}
public void Detach(Cord c) {
attached.Remove(c);
}
bool ConflictTest(Cord toAttach) {
foreach (Cord c in attached) {
// canonically, a cord is grabbed by its 'end', so we only check its 'start'
if (c.start == toAttach.start || c.end == toAttach.start)
return true;
}
return false;
}
}
我意识到ConflictTest()
中的这种线性搜索实际上在OnMouseEnter()
和OnMouseDown()
处执行并不理想。我想将attached
的数据结构更改为HashSet
,但有没有办法可以设置,所以我可以根据HashSet的Contains()
方法进行测试(即。attached.Contains(toAttach.start)
)?由于我需要引用集合中每个成员的start
和end
属性,似乎我需要为每个属性设置一个单独的集合(但是如何协调添加和删除?)或者以某种方式允许属性成为键。有什么想法吗?
答案 0 :(得分:1)
执行此操作的一种方法是将List<Cord>
扩展为Dictionary<Hook, Cord>
,其中键代表值Hook
的{{1}}端点,而不是当前值一。记录的Cord
保证是唯一的,因为Hook
最多只有一个Hook
有效地将其与另一个Cord
相关联。以下是这可能的样子(为了清晰起见,额外评论):
Hook
希望这有帮助!如果您有任何问题,请告诉我。