我在我的游戏中使用了基于网格的碰撞检测,除了一件事外,其他一切都在运行,当玩家在瓷砖上向左移动时,他从瓷砖中跌落。之所以会发生这种情况,是因为当向左然后向右移动时,网格点更新得更快,因为玩家的网格位置基于坐标移动。例如:如果玩家在100,他将不会更新,直到他达到150,单元格范围是100-150(单元格大小是50),但如果你向左移动,你将在99,其中包括在50-100单元格区域。这里有一张图片可以帮助你更好地解释
注意:红色代表玩家网格位置,粉红色矩形是播放玩家动画的位置,因此粉红色应该不能穿过平铺。
这是我的球员关于坠落的最新消息
public void checkFall(Vector3 positionToCheck) {
if (positionToCheck != null) {
if (this.position.y <= positionToCheck.y + MapGrid.CELL_SIZE && positionToCheck.z == -1)
canFall = false;
}else
canFall = true;
}
这是坠落碰撞检测
public Vector3 updateFall() {
/* ================================== */
/* ====*Exclusively for falling*===== */
/* ================================== */
if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
entity.getPosition().x + 1 >= entity.getGridPosition().x)) {
p.x = (int) ((entity.getGridPosition().x) * MapGrid.CELL_SIZE);
p.y = (int) ((entity.getGridPosition().y) * MapGrid.CELL_SIZE);
p.z = -1;
return p;
}
return null;
}
如果你好奇,这里是如何检查的
player.checkFall(collisionHandler.updateFall());
向量3的z方向是这样的,当它返回p时,它不会得到“UpdateMoverRight”的信息
我试着检查右侧是否为真,而实际位置为假,但是除非你挖了2个点,否则你就不会摔倒,这不是我想要的。我希望玩家能够紧密配合(1个瓷砖宽)游戏中的所有内容都是1个瓷砖宽。
任何帮助都非常感谢!
你在逻辑上描述的是,只有当粉红色矩形的两侧都在网格位置(即孔)上方时,你才能摔倒。因此,您必须在方法中检查两个单独的网格位置,而不仅仅是一个。
如果您使用幅值距离更改了条件,您应该能够检查左侧或右侧,因此:
而不是:
if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
entity.getPosition().x + 1 >= entity.getGridPosition().x)) {
更改为:
if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 1 ) {
如果对象每帧移动超过2个像素,则可以将数字1更改为更大。
如果在中输入一个较大的值,则在检测到实体后,始终可以将其移动到正确的位置,这样就不会因设置位置而偏移几个像素,如下所示:
if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 10 ) {
entity.setPositionX(entity.getGridPosition().x);
还有原因:
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y]
进去两次?
有人对如何处理Unity中缺少碰撞的快速移动物体有任何建议吗?我正在为移动设备创建一个突破游戏,发现当桨移动得非常快时,它会错过与球的碰撞。我将碰撞更改为连续检测,但这会引发奇怪的行为,例如碰撞时桨被推倒。 我还尝试使用dontgothrough脚本使其适用于2D碰撞器,但没有成功。有人有什么建议吗?
如果我想每秒移动一个物体40像素,并且我有以下场景,我如何有效地检测到发生了碰撞? 假设两个对象都是 10 x 10 个正方形 2秒时移动物体的起点: 40, 100 移动物体在3秒时的终点: 80, 100 停滞物体在60,100 如果我只移动移动物体一次(从40到80之间没有任何移动),我怎么知道它们之间有一个物体? 这显然是我正在做的事情的简化版本,但我希望它易于理解。 我唯一能想到的是检查
我有一个玩家类,是一个马里奥角色。当我向左走时,我调用一个方法来启动左动画并设置速度。 现在我的问题是:如何为玩家制作碰撞矩形?这是我的矩形:
为了计算x和y速度,我求解了一个动量守恒和动能守恒方程组。 顺便说一下,这些方程没有考虑圆的“形状”。 所以我通过求两个圆相交的切线来计算回弹角。 现在我有两个不同的最终速度方向:一个是用动量定律计算的,一个是用回弹计算的。 我不知道怎么把两种速度结合起来才能得到最后一种
有人能帮我在我的精灵中添加碰撞点吗?我过去有一个代码,我在图像上分层位图,但是同样的代码不能很好地集成到物理画线上,而不是检测图像上的黑/灰位置。 如果有人能帮助我或为我指出正确的方向,我会很高兴。
我有这个骑士角色,有一把剑和一个攻击动画。我想检查剑是否与敌人相撞,然后降低敌人的生命值。我设法做到了这一点,但每次sowrd的对撞机击中敌人的对撞机时,我都有互动。显然我不想那样,但互动应该只在玩家进攻时发生。我尝试了不同的approahces: 通过在字符脚本中执行此操作,使用布尔值检查攻击 这是敌人的剧本 使用而不是 到目前为止似乎没有什么工作,我知道我错过了一些愚蠢的东西,当你们告诉我,请