Как получить правильную координату в зависимости от того, с какой стороны будет получен луч? - PullRequest
0 голосов
/ 30 ноября 2018

Хорошо, я добавил изображение в это описание, чтобы проблема стала понятнее.

У меня есть Parent Object, который содержит три Blocks.Родитель имеет объединенную сетку из этих трех блоков.

Игрок (синий круг) способен уничтожать блоки.Для этого у меня есть raycast, отправка от игрока в направлении, в котором он стоит, и возврат позиции hit.point.

Когда игрок стоит на Игроке Поз 1, точка попадания может быть что-то вроде X = 0.5 и Z = 0.5 (в этом примере мы игнорируем Y).

Так что мне нужно сделатьчто-то вроде:

float xx = hit.point.x + (1 - (hit.point.x % 1));

затем xx = 1.

я могу сделать то же самое для z.

Но:

Когда игрок находится в Player Pos 2, это не работает.

Тогда xx будет 4, а не 3 (что будет необходимо).

Я думал о том, чтобы просто проверить, меньше или больше transform.position.x игрока, чем hit.point.x, но естьтакже проблема с этим:

, если игрок уничтожает блок при x = 2 z = 1, а затем идет в середине между двумя оставшимися блоками, а затем сталкивается с блоком при x = 1 z= 1 результат будет х = 2, и поэтому он не сможет уничтожить блок с левой стороны.

Если что-то не понятно, мне очень жаль, английский не мойпервый язык.

Надеюсь, кто-нибудь может мне помочь с этим!

enter image description here

1 Ответ

0 голосов
/ 01 декабря 2018

Так что для простоты мы рассматриваем только плоскость XZ и помещаем ваш родительский объект в начало координат, и предполагаем, что размер ваших «блоков» составляет 1 единицу * 1 единицу.
Игрок находится в точке P, а raycastточка попадания - H. Мы добавляем очень маленькое смещение к вектору PH (что-то вроде 0,001 * PH.normalized), чтобы оно попадало внутрь блока.Затем мы используем метод Mathf.FloorToInt, чтобы определить, в какой блок попадает игрок.Код будет выглядеть примерно так:

Vector3Int GetBlock(Vector3 playerPos, Vector3 hitPoint)
{
    var rayVec = hitPoint - playerPos;
    var finalVec = hitPoint + rayVec.normalized * 0.001f;
    return new Vector3Int(Mathf.FloorToInt(finalVec.x), Mathf.FloorToInt(finalVec.y), Mathf.FloorToInt(finalVec.z));
}

Вот графическое объяснение (P - игрок, H - точка попадания, HN - смещение (преувеличено для пояснительной цели)): enter image description here

Однако в этом решении есть небольшие недостатки:
Во-первых, оно не заботится о поворотах, перемещении и масштабировании родительского объекта.Вы должны сделать некоторую математику, чтобы поместить все в локальную систему координат родительского объекта.
Во-вторых, она не работает, когда точка попадания находится вблизи края или стыков блоков (потому что смещение приведет васвне блока), но это действительно редко (при условии, что вы сохраняете разрешение с плавающей запятой в разумном диапазоне).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...