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