Как решить задачу о стартовой позиции?

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

public class RotationCircuit : MonoBehaviour
{
    float timeCounter = 0;

    float speed;
    float width;
    float height;

    private float startPosY;
    private float startPosX;
    private float startPosZ;

    void Start()
    {
        speed = 1;
        width = 4; //largueur
        //height = 1; //hauteur

        startPosX = transform.position.x;
        startPosY = transform.position.y;
        startPosZ = transform.position.z;

        float y = GetComponent<Transform>().position.y;
        float x = GetComponent<Transform>().position.x;
        float z2 = GetComponent<Transform>().position.z;

        transform.position = new Vector3(x, y, z2);
    }

    void Update()
    {
        timeCounter += Time.deltaTime * speed;

        float x2 = Mathf.Cos(timeCounter) * width;
        //float y2 = Mathf.Sin(timeCounter) * height; //utile pour faire des haut et bas
        float y2 = GetComponent<Transform>().position.y;
        float z2 = GetComponent<Transform>().position.z;

        transform.position = new Vector3(x2, y2, z2);
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в общем, вы должны использовать transform.position вместо GetComponent<Transform>().position


Затем ваш блок кода

float y = transform.position.y;
float x = transform.position.x;
float z2 = transform.position.z;

transform.position = new Vector3(x, y, z2);

абсолютно ничего не меняет... вы получаете текущую позицию, сохраняете ее в локальных переменных и записываете точно такую ​​же позицию...

Кстати, у них также есть те же значения, которые вы уже сохранили в

startPosX = transform.position.x;
startPosY = transform.position.y;
startPosZ = transform.position.z;

позже вы никогда не будете использовать эти значения в любой точке.

То же самое в Update

float x2 = Mathf.Cos(timeCounter) * width;

float y2 = transform.position.y;
float z2 = transform.position.z;

transform.position = new Vector3(x2, y2, z2);

изменяет только компонент x позиции, который рассчитывается

Mathf.Cos(timeCounter) * width;

который ни в коем случае не принимает во внимание начальные transform.position.x или startPosX.


Я точно не знаю, как вы хотите учитывать начальную позицию, но похоже, что это будет примерно так:

// Little hint: By making those fields serialized
// you can adjust those values directly in the Inspector
// especially while running the Game without having to recompile everytime
[SerializedField] private float speed = 1;
[SerializedField] private float width = 4;
[SerializedField] private float height = 1;

private float timeCounter = 0;
private Vector3 startPosition;

private void Start()
{
    // you can simply store the Vector3 position
    // no need to store each component individually
    startPosition = transform.position;
}

private void Update()
{
    timeCounter += Time.deltaTime * speed;

    var x = Mathf.Cos(timeCounter) * width;
    var y = Mathf.Sin(timeCounter) * height;

    //           from the startPosition    move x right          and y up
    transform.position = startPosition + Vector3.right * x + Vector3.up * y;
}

То, что объект в начале прыгает один раз, а именно width вправо, очевидно, связано с Mathf.Cos, которое соответствует 1 времени начала 0.

Спасибо за вашу помощь @derHugo, на самом деле некоторые функции, такие как startPosition = transform.position; и Vector3.right * x, проще и удобнее в использовании!

Gotori 29.05.2019 17:20

Другие вопросы по теме