Доброго времени суток, у меня есть код
if (runtoright)
Rg.AddForce (Vector3.forward * speed * Time.deltaTime, ForceMode.VelocityChange);
else
Rg.AddForce (Vector3.forward * speed * -Time.deltaTime, ForceMode.VelocityChange);
runtoright меняется в зависимости от достижение правого/левого краев, но при смене краев скорость быстро становится маленькой, а мне нужно что бы как бы отбилось с такой же скорость, могу использовать transform.Translate, но мне нужно именно физически двигать объект, как это можно сделать?
Скорость становится маленькой из-за того, что вы добавляете направленную силу. Т.е. сначала объект начнёт замедляться, а только потом разгоняться в противоположную сторону.
Вероятно, вам можно использовать Vector3.MoveTowards. Этот метод представляет из себя интерполяцию вектора. Т.е. он принимает три параметра - начальная позиция, конечная позиция, и нормализованное положение между ними (от 0 до 1. При 0 и ниже вернётся начальная позиция, при 1 и больше конечная).
Т.е. вы гарантировано не уйдёте дальше заданной точки. Могу предложить следующее решение:
public float _duration; //Время за которое вы хотите доходить от одного края до другого.
Vector3 _begin;
Vector3 _end;
float _curentTime;
void Start()
{
_curentTime = 0;
transform.position = _begin; // Задаем начальное положение
}
Update()
{
_curentTime += Time.deltaTime;
float normalize = _curentTime/duration; //узнаем какая часть времени прошла с момента начала движения в нужную сторону
var position = Vector3.MoveTowards(_begin, _end, normalize);
if (position == _end) // Проверяем дошли ли мы до точки. Если да - меняем конечную и начальную местами и сбрасываем время.
{
var cash = _end;
_end = _begin;
_begin = cash;
_curentTime = 0
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей