Работа с типом unit В этой статье Вы возможно не увидите ничего нового, но тут будут описаны методы работы с типом боевая единица – сохранения любых данных, отслеживание урона, работа со снарядами и другое…
Первое с чего начнем это хранения данных, у юнита есть весьма полезные функции – SetUnitUserData,GetUnitUserData, она может хранить integer. Прекрасно, часто бывает, что нам нужно прикрепить несколько данных… и для реализации нам потребуются несколько массивов и SetUnitUserData, она будет выступать в роли ключа в наших массивах.
Для удобство сначало сделаем так:
Code
define GetIdUnit(u) ={GetUnitUserData(u)}
На cJass define это как бы автозамена , после компиляции все замениться на GetUnitUserData(u)
Прекрасно, следующая задача – это сделать так, чтобы у каждого юнита были разные значения, для этого нам понадобиться 1 массив и 2 переменные типа integer.
Code
integer array Mass
integer I = 0
integer F = 0
В cJass, при объявление переменных не в функциях они будут являться глобальные, иначе локальными.
Пусть: define void = nothing
Code
void AddUNIT(unit u){
integer i = F
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
SetUnitUserData(u,i)
}
Кто не знает ещё cJass смотреть сюда: (после компиляции будет именно так)
Code
function AddUNIT takes unit u returns nothing
local integer i = F
if (F==0) then
set I = I + 1
set i = I
else
set i = Mass[F]
endif
set Mass[i]=-1
call SetUnitUserData(u,i)
endfunction
Эта функция будет давать юниту уникальный номер и сохранять его. Это конечно замечательно но массив в варике рассчитан на 8192 элементов, поэтому придётся нам убирать умерших юнитов, и давать новым юнитам старые номера.
Code
void RemoveUNIT(unit u){
integer i = GetIdUnit (u)
RemoveUnit(u)
Mass[i]=F
F=i
}
Довольно простая функция, выводит юнита из игры и освобождает номер… эту функцию мы вскоре будет дополнять…
и так объявив несколько массивов мы уже можем хранить данные и читать их, это самая быстрая система…
пример:
void TEST(){
integer i = GetIdUnit(GetTriggerUnit())
….
MyArray[i] = 5
MyArray2[i] = 10
….
}
Отлично, но тут ещё возникают ряд проблем, например как присвоить id более удобным способом ? тут все просто, при инициализации мы выбираем каждого юнита и взываем функцию AddUNIT, а так же создадим функцию – альтернатива CreateUnit.
Code
unit CreateUNIT(player p,integer id,real x,real y, real f){
integer i = F
bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
SetUnitUserData (bj_lastCreatedUnit,i)
return bj_lastCreatedUnit
}
И так прекрасно ! теперь созданым юнитам будут прикрепляться номера.
Для удобство оформим это виде библиотеки
Code
library UnitAll{
private integer array Mass
private integer I = 0
private integer F = 0
void AddUNIT(unit u){
integer i = F
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
SetUnitUserData(u,i)
}
unit CreateUNIT(player p,integer id,real x,real y, real f){
integer i = F
bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
// Ваши действия
//
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
SetUnitUserData (bj_lastCreatedUnit,i)
return bj_lastCreatedUnit
}
void RemoveUNIT(unit u){
integer i = GetUnitUserData(u)
// Ваши действия
//Обнуление
UnitAll_Data1[i] = 0
UnitAll_Data2[i] = 0
UnitAll_Ax[i] = 0
UnitAll_Ay[i] = 0
UnitAll_Az[i] = 0
//
RemoveUnit(u)
Mass[i]=F
F=i
}
//Ваши данные
public real array Ax,Ay,Az
public integer array Data1,Data2
}
После удаления юнита важно обнулить все массивы, где это требуется.
Приступим ко второй части… мы можем условно разделить юнитов на: Обычные боевые единицы и снаряды. У них конечно будут разные прикрепленные к ним данные и свойства… Для начало можно копирнуть библиотеку и переписать её аккуратно это основа. Для них будут разные номера и массивы.
Создадим две группы для каждой библиотеке
Code
group UnitAll = CreateGroup()
group SNAR = CreateGroup()
Мы так же будет добавлять юнитов и снарядов при создании и убирать при удалении функции дополняться:
Code
void AddUNIT(unit u){
integer i = F
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
GroupAddUnit(UnitAll,u)
SetUnitUserData(u,i)
}
unit CreateUNIT(player p,integer id,real x,real y, real f){
integer i = F
bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
// Ваши действия
//
if (F==0){
I=I+1
i=I}
else{i=Mass[F]}
Mass[i]=-1
SetUnitUserData (bj_lastCreatedUnit,i)
GroupAddUnit(UnitAll,u)
return bj_lastCreatedUnit
}
void RemoveUNIT(unit u){
integer i = GetUnitUserData(u)
// Ваши действия
GroupRemoveUnit(UnitAll,u)
//Обнуление
UnitAll_Data1[i] = 0
UnitAll_Data2[i] = 0
UnitAll_Ax[i] = 0
UnitAll_Ay[i] = 0
UnitAll_Az[i] = 0
//
RemoveUnit(u)
Mass[i]=F
F=i
}
Тоже самое проделаем для библиотеки снарядов…
В этих группах будет находиться Все юниты и снаряды нам будет удобно обращаться к группам для реализации своих целей. так же добавим в библиотеки то что нам надо…
Например, чтобы юнит мог перемещаться по оси Z, так же отсаживание урона –
Допустим у нас есть триггер, где нам нужно получить урон и юнита, мы так же добавим в наши функции – TriggerRegisterUnitEvent. Для данной функции… для библиотеки снарядов это необязательно, зато добавим другое, например чтобы снаряд нельзя было выделить (москиты).
Заключение: придерживаясь этой системы, мы можем наиболее быстро обращаться к данным юнита, так же отслеживать повреждения, работать со снарядами, с группами и разделять условно Юнитов на несколько типов, у которых будут свои свойства.
Скачать карту