Вот скрипт движения куба (написанный, к сожалению, не мной)
Синтаксис:
Используется csharp
public class CubeMovement : MonoBehaviour {
public float rotationPeriod = 0.3f; // Время, необходимое для перехода на следующее место
public float sideLength = 1f; // Длина края куба
bool isRotate = false; // Флаг для определения того, вращается ли куб или нет
float directionX = 0; // Флаг направления вращения
float directionZ = 0; // Флаг направления вращения
Vector3 startPos; // Положение куба перед вращением
float rotationTime = 0; // Временной интервал во время вращения
float radius; // Орбитальный радиус центра тяжести
Quaternion fromRotation; // Центрирование перед вращением
Quaternion toRotation; // Центрирование после вращения
// Use this for initialization
void Start()
{
// Рассчитать радиус орбиты центра тяжести
radius = sideLength * Mathf.Sqrt(2f) / 2f;
}
// Update is called once per frame
void Update()
{
// Ключи (управление)
float x = 0;
float y = 0;
x = Input.GetAxisRaw("Horizontal");
if (x == 0)
{
y = Input.GetAxisRaw("Vertical");
}
// Если есть ключевой ввод, и куб не вращается
if ((x != 0 || y != 0) && !isRotate)
{
directionX = y; // Направление вращения (либо x, либо y должно быть 0)
directionZ = x; // Направление вращения (либо x, либо y должно быть 0)
startPos = transform.position; // Ведение координат перед вращением
fromRotation = transform.rotation; // Держите кватернион перед вращением
transform.Rotate(directionZ * 90, 0, directionX * 90, Space.World); // Повернуть на 90 градусов в направлении вращения
toRotation = transform.rotation; // Сохранять кватернион после вращения
transform.rotation = fromRotation; // Вращение возвратного куба перед вращением
rotationTime = 0; // Установите время, прошедшее во время вращения, в 0.
isRotate = true; // Установите флаг поворота
}
}
void FixedUpdate()
{
if (isRotate)
{
rotationTime += Time.fixedDeltaTime; // Увеличить прошедшее время
float ratio = Mathf.Lerp(0, 1, rotationTime / rotationPeriod); // Процент текущего прошедшего времени относительно времени вращения
// движение
float thetaRad = Mathf.Lerp(0, Mathf.PI / 2f, ratio); // Угол поворота в радианах.
float distanceX = -directionX * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad)); // Расстояние, пройденное по оси X. Знак - для выравнивания направления движения с ключом.
float distanceY = radius * (Mathf.Sin(45f * Mathf.Deg2Rad + thetaRad) - Mathf.Sin(45f * Mathf.Deg2Rad)); // Расстояние перемещения оси Y
float distanceZ = directionZ * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad)); // Расстояние перемещения по оси Z
transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ); // Установите текущую позицию
// вращение
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio); // Установите текущий угол поворота в Quaternion.Lerp (какая полезная функция)
// Инициализируйте каждый параметр в конце движения/вращения. Опустите флаг isRotate.
if (ratio == 1)
{
isRotate = false;
directionX = 0;
directionZ = 0;
rotationTime = 0;
}
}
}
}
public float rotationPeriod = 0.3f; // Время, необходимое для перехода на следующее место
public float sideLength = 1f; // Длина края куба
bool isRotate = false; // Флаг для определения того, вращается ли куб или нет
float directionX = 0; // Флаг направления вращения
float directionZ = 0; // Флаг направления вращения
Vector3 startPos; // Положение куба перед вращением
float rotationTime = 0; // Временной интервал во время вращения
float radius; // Орбитальный радиус центра тяжести
Quaternion fromRotation; // Центрирование перед вращением
Quaternion toRotation; // Центрирование после вращения
// Use this for initialization
void Start()
{
// Рассчитать радиус орбиты центра тяжести
radius = sideLength * Mathf.Sqrt(2f) / 2f;
}
// Update is called once per frame
void Update()
{
// Ключи (управление)
float x = 0;
float y = 0;
x = Input.GetAxisRaw("Horizontal");
if (x == 0)
{
y = Input.GetAxisRaw("Vertical");
}
// Если есть ключевой ввод, и куб не вращается
if ((x != 0 || y != 0) && !isRotate)
{
directionX = y; // Направление вращения (либо x, либо y должно быть 0)
directionZ = x; // Направление вращения (либо x, либо y должно быть 0)
startPos = transform.position; // Ведение координат перед вращением
fromRotation = transform.rotation; // Держите кватернион перед вращением
transform.Rotate(directionZ * 90, 0, directionX * 90, Space.World); // Повернуть на 90 градусов в направлении вращения
toRotation = transform.rotation; // Сохранять кватернион после вращения
transform.rotation = fromRotation; // Вращение возвратного куба перед вращением
rotationTime = 0; // Установите время, прошедшее во время вращения, в 0.
isRotate = true; // Установите флаг поворота
}
}
void FixedUpdate()
{
if (isRotate)
{
rotationTime += Time.fixedDeltaTime; // Увеличить прошедшее время
float ratio = Mathf.Lerp(0, 1, rotationTime / rotationPeriod); // Процент текущего прошедшего времени относительно времени вращения
// движение
float thetaRad = Mathf.Lerp(0, Mathf.PI / 2f, ratio); // Угол поворота в радианах.
float distanceX = -directionX * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad)); // Расстояние, пройденное по оси X. Знак - для выравнивания направления движения с ключом.
float distanceY = radius * (Mathf.Sin(45f * Mathf.Deg2Rad + thetaRad) - Mathf.Sin(45f * Mathf.Deg2Rad)); // Расстояние перемещения оси Y
float distanceZ = directionZ * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad)); // Расстояние перемещения по оси Z
transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ); // Установите текущую позицию
// вращение
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio); // Установите текущий угол поворота в Quaternion.Lerp (какая полезная функция)
// Инициализируйте каждый параметр в конце движения/вращения. Опустите флаг isRotate.
if (ratio == 1)
{
isRotate = false;
directionX = 0;
directionZ = 0;
rotationTime = 0;
}
}
}
}
Буду благодарен любой помощи.