2015-03-03 59 views
0

我想标记访问对象的列表。我是C#和编程的初学者。 因此,我正在迭代对象列表,检查它们与飞机的距离,然后保存它们。但我需要检查,如果该对象已被访问或无..添加访问列表

的问题是在visitedTrees,我需要保存他们那里,这样,当我访问过的所有树对象我退出。

HashSet<Vector3> visitedTrees = new HashSet<Vector3>(); 
var stripes = new Dictionary<int, List<Transform>>(); 
int stripeNumber = 0; 

cameraPlane.SetNormalAndPosition(normal, view.camera.transform.position + normal * minDistance); 

int visited = 0; 

while (true) 
{ 
    bool reachedFarTree = false; 

    foreach (var gameObject in trees) 
    { 
     float distance = cameraPlane.GetDistanceToPoint(gameObject.transform.position); 
     Debug.Log("distances " + Mathf.Abs(distance)); 
     if (Mathf.Abs(distance) < 20) 
     { 
      List<Transform> treeStripes; 
      if (!stripes.TryGetValue(stripeNumber, out treeStripes)) 
      { 
       treeStripes = new List<Transform>(); 
       stripes[stripeNumber] = treeStripes; 
      } 

      treeStripes.Add(gameObject.transform); 
      if (!visitedTrees.Contains(gameObject.transform)) 
      { 
       visitedTrees.Add(gameObject.transform.position); 
       visited++; 
      } 
     } 

     if (visited == visitedTrees.Count) 
     { 
      reachedFarTree = true; 
     } 
    } 
    offset += 20; 
    cameraPlane.SetNormalAndPosition(normal, view.camera.transform.position + normal * offset); 
    stripeNumber++; 
    if(reachedFarTree) 
     break;   
} 
+0

它看起来像你将它们添加到'visitedTrees'当你访问,所以你只需要知道是否访问过树'包含一个节点?这只是'.Contains' - 你已经在使用。所以我很困惑:你究竟需要做什么,你还没有? – Rup 2015-03-03 11:23:48

+0

Rup,是的但包含不起作用,它给出了编译错误 – ragia 2015-03-03 11:32:14

+1

isnt gameObject.transform矩阵而不是vector3? – 2015-03-03 11:37:49

回答

1

的问题是你实例:

HashSet<Vector3> visitedTrees = new HashSet<Vector3>(); 

,然后尝试查找:

if (!visitedTrees.Contains(gameObject.transform)) 

其中作为gameObject.Transform是类型的变换(矩阵)和HashSet的只能包含Vector3对象。

相反实例化:

HashSet<Transform> visitedTrees = new HashSet<Transform>(); 

OR

if (!visitedTrees.Contains(gameObject.transform.position)) 
{ 
     visitedTrees.Add(gameObject.transform.position); 
     visited++; 
} 

编辑

HashSet<Vector3> visitedTrees = new HashSet<Vector3>(); 
    var stripes = new Dictionary<int, List<Transform>>(); 
    int stripeNumber = 0; 

    cameraPlane.SetNormalAndPosition(normal, view.camera.transform.position + normal * minDistance); 

    int visited = 0; 

    while (true) 
    { 
     bool reachedFarTree = false; 

     foreach (var gameObject in trees) 
     { 
      float distance = cameraPlane.GetDistanceToPoint(gameObject.transform.position); 
      Debug.Log("distances " + Mathf.Abs(distance)); 
      if (Mathf.Abs(distance) < 20 + offset) 
      { 
       List<Transform> treeStripes; 
       if (!stripes.TryGetValue(stripeNumber, out treeStripes)) 
       { 
        treeStripes = new List<Transform>(); 
        stripes[stripeNumber] = treeStripes; 
       } 

       treeStripes.Add(gameObject.transform); 
       if (!visitedTrees.Contains(gameObject.transform.position)) 
       { 
        visitedTrees.Add(gameObject.transform.position); 
        visited++; 
       } 
      } 


     } 
     if (trees.Count >= visited) 
     { 
      reachedFarTree = true; 
     } 

     offset += 20; // may try for a smaller value 
     cameraPlane.SetNormalAndPosition(normal, view.camera.transform.position + normal * offset); 
      stripeNumber++; 
     if (reachedFarTree) 
      break; 
    } 
+0

将包含工作并真正检查我是否已经基于vector3访问了该树? – ragia 2015-03-03 11:56:02

+0

我不知道如何在统一检查的平等,但在托管DirectX的Vector3它不正确......想你必须尝试...如果不是我们要深入探讨我们的 – 2015-03-03 11:58:03

+0

它可能不是技巧的盒子=).. 。http://answers.unity3d.com/questions/395513/vector3-comparison-efficiency-and-float-precision.html – 2015-03-03 12:01:52