如何通过引用添加到队列而不会意外地更改引用?

时间:2018-04-26 22:04:38

标签: c# unity3d

我有一系列方法点是类。它们继承单声道行为,因此它们不能是结构体,加上它们的行为取决于派生类型的路径点。

我将每个航路点添加一个AI访问队列,这样他们就不会回到以前访问过的路径。

然而,如果我现在将AI的CurrentWaypoint更改为他到达的下一个,这会更改队列中的那个。所以我最终得到了一个所有相同航路点参考的队列。

我如何防止这种情况但仍能通过参考检查检查队列中是否存在CurrentWaypoint?我相信如果我只是使用副本,那么参考检查将失败,因此也不好。

我的两种方法是:

private bool HasVisited(Waypoint wp)
{
    if (_previousVisits.Contains(wp))
    {
        return true;
    }

    return false;
}

private void AddVisited(Waypoint wp)
{
    // we only need the last 2 wp's visited
    if (_previousConnections.Count > 1)
    {
        _previousConnections.Dequeue();
    }
    _previousVisits.Enqueue(wp);
}

这个问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:3)

为此,我将围绕Waypoint构建一个包装类,以提供我自己的比较,例如:

public class WaypointWrapper
{
    private readonly Vector3D _waypointPosition;

    public WaypointWrapper(Waypoint waypoint)
    {
          /* Assuming the Waypoint class has a position property that is a Vector3D struct */
          _waypointPosition = waypoint.position;
    }

    public override Equals(object obj)
    {
         var otherWaypointWrapper  = obj as WaypointWrapper;

         if(otherWaypointWrapper == null)
             return false;

         return otherWaypointWrapper._waypointPosition.Equals(_waypointPosition);
    }

    public override int GetHashCode()
    {
         return _waypointPosition.GetHashCode();
    }
}