Я написал этот код в 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);
}
}
в общем, вы должны использовать 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
, проще и удобнее в использовании!