Создание MapCurve
Автор: КоловратЪ Добавлено: 2010-07-25 20:52:25
| |
MapCurve ( англ. Кривая карты ) – отлично подходят для использования её, как визуального представления пути движения юнита. По сути это набор соединенных точек ( MapCurvePoint ) в одну линию. Давайте посмотрим на свойства и методы данного класса.
| Properties |
| Name |
Description |
| AutomaticTimeStep ( float ) |
Шаг автоматического увеличения «времени точки». |
| CurveType ( CurveTypes ) |
Тип кривой. |
| CurveTypes.UniformCubicSpline |
Равномерный, кубический. |
| CurveTypes Bezier |
Безье |
| Points |
Список точек. (редактируется в редакторе карт) |
| Methods |
| public Vec3 CalculateCurvePointByCoefficient( float coefficient ) |
Рассчитывает точку на кривой по коэффициенту. |
| public Vec3 CalculateCurvePointByTime( float time ) |
Рассчитывает точку на кривой по времени. |
| public Quat CalculateCurveRotationByCoefficient( float coefficient ) |
Рассчитывает поворот по коэффициенту. |
| public Quat CalculateCurveRotationByTime( float time ) |
Рассчитывает поворот по времени. |
| public MapCurvePoint CreatePoint( MapCurvePoint afterPoint ) |
Создаёт точку на кривой. |
| public float GetCurveMaxTime() |
Возвращает максимальное время кривой. |
| public Range GetCurveTimeRange() |
Возвращает временный интервал кривой. |
| protected virtual void OnUpdateCurve() |
Обновляет кривую. |
Применениe кривой.
Самый простой способ применения кривой, это использовать лишь точки кривой, а именно их координаты.
Для этого в классе, в котором будем это использовать, нужно объявить поле хранящие индекс текущий точки, написать метод поверяющий дошли ли мы до точки или нет. Если дошли, то увеличиваем или сбрасываем индекс.
Пример кода –
[FieldSerialize]
MapCurve curve; // наша кривая
[FieldSerialize]
int index = 0; // индекс текущий точки
void TickIndex()
{
Vec3 pos = curve.Points[index].Position;
// находим растояние до точки
float distance = ( this.Position - pos ).LengthFast();
if ( distance <= 1 ) // если дошли то
index++; // увечиваем индекс
if ( index > curve.Points.Count ) // если индекс больше чем количество // точек на кривой,
index = 0; // сбрасываем в ноль...
}
Далее необходимо написать метод выполняющий само передвижение.
Есть 2 способа реализации.
- Расчет необходимого вектора и передача его в класс управления.
- Расчет, какие клавиши должны быть нажаты для достижения заданной точки и передача нажатия тих клавиш в интеллект.
Способ первый.
void TickMovement()
{
// Высчитываем вектор изходя из нужной нам позиции
Vec3 pos = curve.Points[index].Position;
Vec2 vec = pos.ToVec2() - this.Position.ToVec2();
float len = vec.NormalizeFast();
float lenToTarget = len;
if( len > .3f )
{
if( lenToTarget < 1.5f ) vec *= lenToTarget;
else vec = Vec2.Zero;
}
if ( vec != Vec2.Zero )
{
// Поворачиваем юнита к нужной точки
this.SetTurnToPosition( pos );
// задаём вектор двиджения.
this.SetForceMoveVector( vec );
}
}
Теперь мы может в методе
OnTick выполнить метод рассчитывающий индекс текущий точки, а потто метод передвижения.
Этот способ хорошо подходит когда нужно реализовать движение объекта внутри класса, не прибегая к использованию редактора логики и интеллекта.
Как реализовать движение 2м способом вы можете посмотреть в этой
в этой теме форума.
Оглавление
| На верх