Почему игрок падает после перемещения своей позиции? - PullRequest
3 голосов
/ 14 июня 2019

Я создал стакан с отражением. Идея состоит в том, когда игрок приближается к окну, чтобы увидеть отражение игрока, как игрок смотрит в окно.

Стеклянное отражение работает, и оно отключено в Иерархии. Позже в игре я включаю отражение стекла.

Это скриншот стекла, когда оно включено: Я поместил стекло в окно:

Glass

Это скриншот игрока. У игрока есть дочернее имя NAVI. NAVI расположен немного впереди игрока: У игрока есть твердое тело. На скриншоте слева объект NAVI и справа настройки Инспектора плеера:

Player

И этот скрипт прикреплен к окну не к стеклу, а к окну:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemAction : MonoBehaviour
{
    public RotateCamera rotatecamera;
    public GameObject glass;
    public GameObject player;

    public void Init()
    {
        player.transform.localPosition = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);
        glass.SetActive(true);
    }
}

Это скриншот окна с прикрепленным к нему скриптом:

Window

Идея состоит в том, что когда кто-то в игре, когда он вызывает метод Init, он помещает игрока как можно ближе к окну, чтобы увидеть отражение игрока на стекле.

Но вместо этого игрок падает сквозь пол и продолжает падать без перерыва.

1 Ответ

4 голосов
/ 14 июня 2019

Вы используете локальную позицию окна, чтобы установить локальную позицию игрока.Вместо этого используйте 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;

Однако даже это работает, только если стекло идеально вертикально.Если стекло не всегда вертикальное, то вы можете найти пересечение линий горизонтальной плоскости на высоте игрока и плоскости заполнения, а затем установить позицию игрока на ближайшую точку на этой линии

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