Моя задача, это прокрутка плоскости(Panel) к заданному стикмену.
Что бы создать эффект "3д c изометрией" я сделал ортографическую камеру и поставил BattleGround x на -40
Вот как это выглядит сейчас:
Проблемы:
1. Я рассчитываю время прокрутки до объекта с помощью:
Синтаксис:
Используется csharp
float getTimeToRotation(GameObject player)
{
var groundPosition = transform.position;
var vector1 = centerIndicator.transform.position - groundPosition; //смотрим на статический obj
var temptranf = player.transform.position;
temptranf.y = 0f;
var vector2 = temptranf - groundPosition; //смотрим на игрока
var angle = Vector3.Angle(vector1, vector2); //в deg угол
return angle/speed;
}
{
var groundPosition = transform.position;
var vector1 = centerIndicator.transform.position - groundPosition; //смотрим на статический obj
var temptranf = player.transform.position;
temptranf.y = 0f;
var vector2 = temptranf - groundPosition; //смотрим на игрока
var angle = Vector3.Angle(vector1, vector2); //в deg угол
return angle/speed;
}
Это решение мне не подходит, так как угол берется ближайший и я не смогу указав игрока n высчитать нужный поворот к нему.
(В дальнейшем, всем игрокам в мультиплеере будет приходить команда повернуть камеру до игрока)
2.Даже если опустить факт неправильного поворота, я хочу добиться плавности прокрутки. (ease out)
С ускорения до плавного замедления.
Как работает поворот сейчас:
Синтаксис:
Используется csharp
//waitTime это результат предыдущей функции
IEnumerator rotateGround(float waitTime)
{
var duration = Time.time + waitTime;
while (duration > Time.time)
{
ground.transform.RotateAround(ground.transform.position, ground.transform.up, speed * Time.deltaTime);
foreach (var decoration in decorations)
{
decoration.transform.LookAt(camera.transform);
decoration.transform.RotateAround(ground.transform.position, ground.transform.up,
speed * Time.deltaTime);
}
foreach (var player in players)
{
player.transform.LookAt(camera.transform);
player.transform.RotateAround(ground.transform.position, ground.transform.up,
speed * Time.deltaTime);
}
yield return null;
}
setNextAttacer();
}
IEnumerator rotateGround(float waitTime)
{
var duration = Time.time + waitTime;
while (duration > Time.time)
{
ground.transform.RotateAround(ground.transform.position, ground.transform.up, speed * Time.deltaTime);
foreach (var decoration in decorations)
{
decoration.transform.LookAt(camera.transform);
decoration.transform.RotateAround(ground.transform.position, ground.transform.up,
speed * Time.deltaTime);
}
foreach (var player in players)
{
player.transform.LookAt(camera.transform);
player.transform.RotateAround(ground.transform.position, ground.transform.up,
speed * Time.deltaTime);
}
yield return null;
}
setNextAttacer();
}
Вот как это должно выглядеть: