Вы используете локальную позицию окна, чтобы установить локальную позицию игрока.Вместо этого используйте position
и измените только компонент х игрока:
float paddingDistance = 1f; // Change this to adjust the padding
player.transform.position = new Vector3(transform.position.x - paddingDistance,
player.transform.position.y,
player.transform.position.z);
Проблема в том, что он работает только для стекла, повернутого точно таким же образом.Если вы хотите выполнить эту работу для любой такой ориентации стекла, вы можете сделать плоскость, параллельную стеклу, но на некотором расстоянии, и переместить игрока к ближайшей точке плоскости.Предполагая, что стекло перпендикулярно направлению transform.left
:
float paddingDistance = 1f; // Change this to adjust the padding
Vector3 paddingPoint = transform.position + transform.left * paddingDistance;
float paddingToPlayerAlongLeft = Vector3.Dot(transform.left,
player.transform.position - paddingPoint);
// closest point to player.transform.position on padding plane
player.transform.position = player.transform.position
- paddingToPlayerAlongLeft * transform.left;
Но даже это работает только для одной стороны стекла.Если вы хотите выполнить эту работу для любой стороны стекла, вам нужно определить, находится игрок на левой стороне или нет (мы можем сделать это, используя Vector3.Dot
), а затем сделать плоскость в соответствующем направлении:
float paddingDistance = 1f;// Change this to adjust the padding
float glassToPlayerAlongLeft = Vector3.Dot(player.transform.position - transform.position,
transform.left);
float paddingLeftMod = glassToPlayerAlongLeft > 0f ? 1f : -1f;
float paddingToPlayerAlongLeft = glassToPlayerAlongLeft - paddingDistance * paddingLeftMod;
// closest point to player.transform.position on padding plane
player.transform.position = player.transform.position
- paddingToPlayerAlongLeft * transform.left;
Однако даже это работает, только если стекло идеально вертикально.Если стекло не всегда вертикальное, то вы можете найти пересечение линий горизонтальной плоскости на высоте игрока и плоскости заполнения, а затем установить позицию игрока на ближайшую точку на этой линии