Как поделиться данными из метода onTriggerEnter для плавного перемещения позиции игрового объекта с помощью метода Update? - PullRequest
0 голосов
/ 22 апреля 2020

введите описание изображения здесь Я могу установить ось Y моего плеера с помощью простого вызова transform.position, за один шаг, все в методе onTriggerEnter, но движение имеет один шаг и поэтому отрывистый. Теперь я пытаюсь сделать движение плавным, поместив функцию transform.position в метод Update в том же классе. Однако, похоже, что значения положения, определенные / обновленные методом onTriggerEnter, недоступны в функции Update. Если я печатаю значения x и z в консоль, они содержат ожидаемые значения из функции onTriggerEnter, но кажутся равными 0, когда я печатаю в консоль из функции обновления. Есть идеи, что я делаю не так? Я бы никогда не назвал себя программистом, поэтому предположим худшее :-) Заранее спасибо за любую помощь!

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


public class Step1SetElevation : MonoBehaviour
{
    private float moveSpeed = 3f;
    private float currX = 0.0f;
    private float currZ = 0.0f;
    private Vector3 currentPos;
    private GameObject player;
    private Collider other;

    void OnTriggerEnter(Collider other)
    {
    player = GameObject.FindWithTag("Player");
    currentPos = GameObject.Find("PlayerController").transform.position;
    currX = currentPos.x;
    currZ = currentPos.z;
    }

    void Update()
    {
    player = GameObject.FindWithTag("Player");
    player.transform.position = new Vector3(currX, 3.4f, currZ) * Time.deltaTime * moveSpeed;
    }
}

1 Ответ

0 голосов
/ 22 апреля 2020

Я полагаю, что ваша проблема может заключаться в том, что вы используете OnTriggerEnter() для установки позиции, в которую вы хотите, чтобы ваш игрок переместился, это будет вызываться в кадре, в который игрок входит в ваш триггер, но затем не будет вызываться снова, пока игрок ушел и снова вошел ...
Если вы вместо этого используете OnTriggerStay() - что-то вроде

void Start(){ // this lookup can be expensive so lets only do it once
    player = GameObject.FindWithTag("Player");
    playerController = GameObject.Find("PlayerController");
}

void OnTriggerStay(Collider other){ // this is called once per frame that a collider remains in a trigger
    if(other.gameObject.tag == "Player"){ // just in case anything else ever enters the collider
        currentPos = playerController.transform.position;
        currX = currentPos.x;
        currZ = currentPos.z;
    }
}

void FixedUpdate(){ // it's generally advised to move objects in fixed update
    player.transform.position = new Vector3(currX, 3.4f, currZ) * Time.fixedDeltaTime * moveSpeed;
}
...