Как решить проблему стартовой позиции? - PullRequest
0 голосов
/ 29 мая 2019

Я написал этот код в 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);
    }
}

1 Ответ

3 голосов
/ 29 мая 2019

в общем случае вы должны использовать 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.

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