Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by adept22 · May 21, 2012 at 04:10 PM · pathfindingcastinglinqienumerable

Pathfinding Issue casing Ienumerable for Nodes

Hi I am working on pathfinding and having some issues with dealing with ienumerables which handle my neighbour cells. I have a gridcell Class which has below

 public interface IHasNeighbours
 {
     IEnumerable<GridCell> Neighbours { get; }
 }
 
 public class GridCell:IHasNeighbours
 {
     public bool walkable = true; 
     public GridManager.Point position;
     public IEnumerable<GridCell> AllNeighbours { get; set; }
     public IEnumerable<GridCell> Neighbours {
         get {
             FindNeighbours ();
             return AllNeighbours.Where (o => o.walkable);
         }
     }

I have a Searchnode Class which is used by the pathfinder

 public class SearchNode : GridCell
 {
     // Location on the map
     public GridManager.Point Position;
 
     // A reference to the node that transfered this node to
     // the open list.
     public SearchNode Parent;
 
     // Provides an easy way to check if this node
     // is in the open list.
     public bool InOpenList;
 
     // Provides an easy way to check if this node
     // is in the closed list.
     public bool InClosedList;
 
     // The approximate distance from the start node to the
     // goal node if the path goes through this node. (F)
     public float DistanceToGoal;
     
     // Distance traveled from the spawn point. (G)
     public float DistanceTraveled;    
 }

The Problem I have is Part of the pathfinder script below

 IEnumerable<SearchNode> neighs = currentNode.Neighbours.Cast<SearchNode> ();
 for (int i = 0; i < neighs.Count(); i++) {
     SearchNode neighbor = neighs.ToList () [i];

I get the error InvalidCastException: Cannot cast from source type to destination type.

I need to cast the neigbour has a type so i can .tolist to get a list of the gridcells that are neighbours but i dont know how to cast the neighbours to a searchnode ienumerable.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Bunny83 · May 21, 2012 at 05:10 PM

Beside the fact that this code is not very efficient, the Linq function Cast doesn't cast the type itself. See this stackoverflow question. Linq and lambda expresions comes in quite handy, but it's also very easy to write very very uneffective code which is usually not acceptable in games.

It seems you want to iterate through the enumeration, so you can either call MoveNext yourself, or convert it once to a List before the for loop. Just let the type be gridCell, you can cast it inside your loop.

Something like that should work:

 List<GridCell> neighs = currentNode.Neighbours.ToList();
 for (int i = 0; i < neighs.Count(); i++) {
     SearchNode neighbor = (SearchNode)neighs[i];



Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image adept22 · May 22, 2012 at 06:57 AM 0
Share

Hi Bunny83, I tried that previously but i get InvalidCastException: Cannot cast from source type to destination type.

I was trying to use the SearchNode So that i can keep the pathfinding a bit more general so i can change the Nodetype down the line without too much effort but it seems like this is making it worse.

By Being ineffective do you mean by using ienumerables or just the way that i have implemented them? are lists going to be more efficient?

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

5 People are following this question.

avatar image avatar image avatar image avatar image avatar image

Related Questions

Custom pathfinding and node-values 1 Answer

Sorting an array of GameObjects by their position 1 Answer

A* Formations 1 Answer

AI PathState 0 Answers

Is there a limit on how far a navmesh agent can go? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges