C# 十六进制网格A*寻路。。。类型参数错误
我是一个初露头角的编程爱好者和游戏设计师,正在攻读我的学位,因此在编程界还是一个新手。我已经做了大量的JavaScript(实际上是UnityScript),现在我正尝试涉足C#。我一直在学习hakimio关于在Unity中制作基于回合的RPG的教程,该教程基于使用*寻路的六边形网格。(http://tbswithunity3d.wordpress.com/) 我的问题是,我已经按照他的教程一步一步地完成了A*寻路脚本和资源,但是在Unity中遇到了错误: “错误CS0308:非泛型类型'iHasNeights'不能与类型参数一起使用” 这是触发错误消息的代码,在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
公共类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;
}
}