unity3d 查找点的分块索引-在分割为分块的无限2D平面上

gab6jxml  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(143)

我试图将我的游戏世界划分为扇区/瓦片。并根据玩家/对象的位置确定玩家/对象所在的瓦片。我没有限制世界大小,因此世界可以是任何大小。瓦片大小是定义的且恒定的。因此,整个世界被划分为给定维度的正方形瓦片。

    • 示例**:如果我把我的世界分成大小相等的方块,比如300x300。
  • 如果玩家在位置(0,0)到(300,300)之间,则牌号应为(0,0)
  • 如果玩家在位置(0,0)到(300,-300)之间,则牌号应为(0,-1)
  • 如果玩家在位置(-300,0)到(-600,300)之间,则牌号应为(-2,-0)
    • 更多示例输入和输出:**
  • 玩家位置为(10,10),牌号应为(0,0)
  • 玩家位置为(-1,0,1,0),牌号应为(-1,0)
  • 玩家位置为(10,-10),牌号应为(0,-1)
  • 玩家位置为(-10,-10),牌号应为(-1,-1)
  • 玩家位置为(1,1),牌号应为(0,0)
  • 玩家位置为(1,-1),牌号应为(0,-1)
  • 玩家位置为(-1,1),牌号应为(-1,0)
  • 玩家位置为(-1,-1),牌号应为(-1,-1)
  • 玩家位置为(-450,100),牌号应为(-2,0)
  • 玩家位置为(450,100),牌号应为(1,0)
  • 玩家位置为(-450,-100),牌号应为(-2,-1)
  • 玩家位置为(450,-100),牌号应为(1,-1)

我有下面的代码,它似乎只有在X/Z为正时才能正确工作。一旦它在X/Z的负侧,我不确定我如何计算位置。

public static Sector GetCurrentSector(Vector3 p_position)
{
    int x = Mathf.FloorToInt(p_position.x / cellSize);
    int z = Mathf.FloorToInt(p_position.z / cellSize);

    return new Sector(x, z);
}

注:我也不知道这个问题叫什么!所以,它给我的搜索带来了很大的困难。我的搜索把我带到了多个与圆、半径、圆内点等有关的地方,

qnzebej0

qnzebej01#

我建议您使用int而不是FloorToInt,并使用整数除法:

public static Sector GetCurrentSector(Vector3 p_position)
{
    int x = (int)p_position.x / (int)cellSize;
    int z = (int)p_position.z / (int)cellSize;

    return new Sector(x, z);
}

我的答案是不正确的,你的方法是正确的使用matf。floorInt是更好的整数除法为负数。

相关问题