Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过引用添加到队列中而不意外更改引用?_C#_Unity3d - Fatal编程技术网

C# 如何通过引用添加到队列中而不意外更改引用?

C# 如何通过引用添加到队列中而不意外更改引用?,c#,unity3d,C#,Unity3d,我有一系列的路径点是类。它们继承单体行为,因此不能成为结构,而且它们的行为取决于路径点的派生类型 我将AI访问的每个航路点添加到队列中,这样它们就不会返回到以前访问过的航路点 然而,如果我现在将AI的CurrentWaypoint更改为他到达的下一个航路点,这将更改队列中的航路点。因此,我最终得到了一个包含所有相同航路点参考的队列 如何防止这种情况发生,但仍然能够通过参考检查来检查队列中是否存在CurrentWaypoint?我相信如果我只使用一份副本,那么参考检查将失败,因此这也不好 我的两个

我有一系列的路径点是类。它们继承单体行为,因此不能成为结构,而且它们的行为取决于路径点的派生类型

我将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);
}

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

为此,我将围绕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();
    }
}

克隆航路点怎么样?对于
hasviesited
方法,这是否仍然相同?这通常不是个坏主意吗?然后需要重写Equals和GetHashCode方法。如果您没有访问Waypoint类的权限,那么只需将其包装在您自己的新WaypointWrapper类中。那对你有用吗?