Почему мой плеер не двигается автоматически? - PullRequest
0 голосов
/ 05 мая 2019

У меня проблемы с поиском ошибки в сценарии автоматического перемещения. Сначала я объясню, что я пытался сделать, чтобы вы лучше поняли. Так что я программирую на C # в единстве. Это для VR. Я создал кнопку, которая работает как триггер, когда вы на нее смотрите. При взгляде на кнопку дверь опускается, и игрок должен двигаться внутри замка (автоматически).

Дверной скрипт работает нормально, но игрок вообще не двигается. Я использовал общедоступный Vector3, где я объявил позицию внутри замка, куда игрок должен двигаться (это только прямое направление).

К сожалению, код выглядит хорошо для меня, и я не могу понять, почему мой плеер не будет двигаться: /.

Поэтому я попытался поиграть с «Векторами», но мне не повезло.

{
    public float speed = 0.5f;
    public Vector3 castlePosition;
    private Vector3 targetPosition;

// Start is called before the first frame update
void Start()
{
    targetPosition = transform.position;
}

// Update is called once per frame
void Update()
{
    RaycastHit hit;

    if (Physics.Raycast(transform.position, transform.forward, out hit))
    {
        if(hit.transform.GetComponent<DoorButton>() != null)
        {
            hit.transform.GetComponent<DoorButton>().OnLook();
            MoveToCastle ();

        }
    }

    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * speed);
}

private void MoveToCastle()
{
    targetPosition = castlePosition;
}

}

Я ожидал, что функция MoveToCastle поместит моего игрока в замок (в положение, которое я объявил ранее).

Еще раз функция OnLook от моей двери работает.

Заранее благодарю за помощь. :)

1 Ответ

0 голосов
/ 05 мая 2019

Ваш MoveToCastle перестает работать, как только raycast становится ложным.Вы, вероятно, должны запустить некоторый непрерывный процесс перемещения к цели, когда лучевая передача попадет.Например, запустите сопрограмму примерно так:

IEnumarable MoveToCastle()
{   
    targetPosition = castlePosition;

    while (transform.position != castlePosition) // careful here! see below
    {
        transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * speed);
        yield return null;
    }
}

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

...