Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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# 十六进制网格A*寻路。。。类型参数错误_C#_Path Finding_A Star_Generic Type Argument_Hexagonal Tiles - Fatal编程技术网

C# 十六进制网格A*寻路。。。类型参数错误

C# 十六进制网格A*寻路。。。类型参数错误,c#,path-finding,a-star,generic-type-argument,hexagonal-tiles,C#,Path Finding,A Star,Generic Type Argument,Hexagonal Tiles,我是一个初露头角的编程爱好者和游戏设计师,正在攻读我的学位,因此在编程界还是一个新手。我已经做了大量的JavaScript(实际上是UnityScript),现在我正尝试涉足C#。我一直在学习hakimio关于在Unity中制作基于回合的RPG的教程,该教程基于使用*寻路的六边形网格。(http://tbswithunity3d.wordpress.com/) 我的问题是,我已经按照他的教程一步一步地完成了A*寻路脚本和资源,但是在Unity中遇到了错误: “错误CS0308:非泛型类型'iHa

我是一个初露头角的编程爱好者和游戏设计师,正在攻读我的学位,因此在编程界还是一个新手。我已经做了大量的JavaScript(实际上是UnityScript),现在我正尝试涉足C#。我一直在学习hakimio关于在Unity中制作基于回合的RPG的教程,该教程基于使用*寻路的六边形网格。(http://tbswithunity3d.wordpress.com/)

我的问题是,我已经按照他的教程一步一步地完成了A*寻路脚本和资源,但是在Unity中遇到了错误:

“错误CS0308:非泛型类型'iHasNeights'不能与类型参数一起使用”

这是触发错误消息的代码,在
公共类Tile:GridObject,ihasnights
行上:

使用System.Collections.Generic;
使用制度;
使用System.Linq;
使用UnityEngine;
公共类磁贴:GridObject,iHasNeights
{
公共场所可通行;
公共地砖(整块x,整块y)
:底座(x,y)
{
可通过=正确;
}
公共IEnumerable所有邻居{get;set;}
公共邻居们
{
获取{returnallneights.Where(o=>o.Passable);}
}
公共静态列表邻居移位
{
得到
{
返回新列表
{
新点(0,1),
新点(1,0),
新点(1,-1),
新点(0,-1),
新点(-1,0),
新点(-1,1),
};
}
}
public void FindNeighbours(字典板、矢量2板尺寸、布尔等值线长度)
{
列表邻居=新列表();
foreach(邻域中的点shift)
{
int neighbourX=X+点X;
int neighbourY=Y+点Y;
//特定于直轴坐标的x坐标偏移
int xOffset=neighbourY/2;
//如果第二个六边形行的六边形数少于第一个六边形行,那么在讨论最后一个六边形行时,请跳过它
if(neighbourY%2!=0&&!equallinelength&&neighbourX+xOffset==BoardSize.x-1)
继续;
//检查以确定当前处理的坐标是否仍在电路板限制内
如果(邻域x>=0-xOffset&&
邻接x<(int)BoardSize.x-xOffset&&
neighbourY>=0&&neighbourY<(int)BoardSize.y)
添加(板[新点(邻里,邻里)];
}
所有邻居=邻居;
}
}
任何关于如何克服此错误的帮助或见解都将不胜感激,在过去几天中,我一直在努力使此脚本正常工作,因此无法继续教程(以及我的项目)中的错误

提前谢谢大家


Aaron:)

问题在于iHasNeights不是一个通用接口,因此不能像传递Tile类那样将类传递给它


您需要修改iHasNeights接口以使其成为通用接口,或者需要在它之后删除对Tile类的引用。解决方案将取决于您需要代码执行的操作。:)

问题在于iHasNeights不是通用接口,因此不能像传递Tile类那样将类传递给它


您需要修改iHasNeights接口以使其成为通用接口,或者需要在它之后删除对Tile类的引用。解决方案将取决于您需要代码执行的操作。:)

你好,亚伦。我只是简单地说一下,我编辑了你的文章,以解决你评论的需要空间来处理
的问题。在工具栏上发布时,您应该会看到一个“代码”按钮。这会将文本标记为代码,并确保它显示所有文本并对其进行格式化。你已经将它用于主批量,但它也可以用于内联。嗨,亚伦。我只是简单地说一下,我编辑了你的文章,以解决你评论的需要空间来处理
的问题。在工具栏上发布时,您应该会看到一个“代码”按钮。这会将文本标记为代码,并确保它显示所有文本并对其进行格式化。您已将其用于主批量,但也可以用于内联。感谢您的快速回复@Chris,但我仍然不确定如何解决此问题。我尝试删除“”,然后它开始使用IEnumerator(*IEnumerable)列出相同类型的其他错误。我只是没有足够的知识来解决这个问题……好吧,看看这个错误,如果删除
解决了它(使用backticks`标记代码的东西),那么你的界面不是通用的。您可能需要阅读泛型,了解它们是什么,何时需要它们,何时应该使用泛型类型参数(例如
)。例如,
allneights
neights
可能希望成为
IEnumerable
而不是普通的
IEnumerable
。如果这是来自您的接口,那么您的解决方案可能是将您的接口修改为通用的(发布代码,我们可以看一看)。在查看了更多内容后,我发现Aron Granberg的a*寻路包可以修改为在十六进制网格上使用(由“John”编写),此外,我还可以将其应用于移动平台,使用触摸控制代替鼠标点击,这非常适合我的需要。谢谢你的帮助,克里斯:)谢谢你的快速回复@Chris,但我仍然不确定如何解决这个问题。我尝试删除“”,然后它开始使用IEnumerator(*IEnumerable)列出相同类型的其他错误。我只是没有足够的知识来解决这个问题……好吧,看看这个错误,如果删除
解决了它(使用backticks`标记代码的东西),那么你的界面不是通用的。您可能需要阅读泛型,了解它们是什么,何时需要它们,何时应该使用泛型类型参数(例如using System.Collections.Generic; using System; using System.Linq; using UnityEngine; public class Tile: GridObject, IHasNeighbours<Tile> { public bool Passable; public Tile(int x, int y) : base(x, y) { Passable = true; } public IEnumerable AllNeighbours { get; set; } public IEnumerable Neighbours { get { return AllNeighbours.Where(o => o.Passable); } } public static List<Point> NeighbourShift { get { return new List<Point> { new Point(0, 1), new Point(1, 0), new Point(1, -1), new Point(0, -1), new Point(-1, 0), new Point(-1, 1), }; } } public void FindNeighbours(Dictionary<Point, Tile> Board, Vector2 BoardSize, bool EqualLineLengths) { List<Tile> neighbours = new List<Tile>(); foreach (Point point in NeighbourShift) { int neighbourX = X + point.X; int neighbourY = Y + point.Y; //x coordinate offset specific to straight axis coordinates int xOffset = neighbourY / 2; //if every second hexagon row has less hexagons than the first one, just skip the last one when we come to it if (neighbourY % 2 != 0 && !EqualLineLengths && neighbourX + xOffset == BoardSize.x - 1) continue; //check to determine if currently processed coordinate is still inside the board limits if (neighbourX >= 0 - xOffset && neighbourX < (int)BoardSize.x - xOffset && neighbourY >= 0 && neighbourY < (int)BoardSize.y) neighbours.Add(Board[new Point(neighbourX, neighbourY)]); } AllNeighbours = neighbours; } }