Объект Entity
- объект, который появляется в игре. Любой звук, геометрия, эффект, фон, невидимое и т.д. Entity делятся на классы.Каждый объект в мире присваивается уникальный идентификатор при создании. Все Entity имеют две общие характеристики: "Имя" и "Родитель".
- все объекты Entity (различного класса) доступны в дереве вкладки EntityList
КЛАССЫEntity
- название класса у Entity можно узнать в свойствах закладки Entity на верхней строке.
- ОСНОВНЫЕ КЛАССЫ у Entity :
- СWorldInfotProperties - Entity контроллер карты
- СStaticModelProperties - Entity любая статичная модель в игре (ящик,здание и т.д.)
- СPropProperties -тоже что и СStaticModelProperties, только здесь доступно ещё использовать редактор коллизии с физикой.
- CExternalJointProperties - Entity привязка (например связать два СPropProperties) и т.д.
КЛАСС CScriptProperties
- Так же есть класс, который отвечает за выполнение скриптов в создаваемой карте CScriptProperties (в EntityList именуется как Script в папке Logic)
- CScriptProperties- это скрипт или программируемый код языка Lua.
- язык Lua
Подробно я не буду говорить об этом языке т.к. в интернете можно найти литературу. Можно отметить что Lua Является свободно распространяемым, с открытыми исходными текстами на языке Си, где сам язык Lua дополняет Си присутствием динамического контроллера типов (переменной допускается менять свой тип самостоятельно).
- Редактор Lua открывается при двойном клике на правую кнопку мыши по Entity Скрипту на карте (после добавления из EntityList на карту он выглядит в виде темно-оранжевого кубика) (например: вкладка Script001)
КАК ПРИСВАИВАТЬ ПЕРЕМЕННЫМ редактора Lua класс Entity из SE3
- в редакторе Lua пишем любое символьное имя например: m - это и будет новая переменная, к которой мы присваиваем любой Entity
- далее перетаскиваем мышью (при этом нажав Ctrl+Alt+Shift - на самом деле это копирование Entity) выбранный Entity из Карты (например ящик СStaticModelProperties) в
редактор Lua к m (при перетаскивании мы видим +)- если все сделано правильно, то в редакторе Lua переменная m окрашивается в зеленый цвет. В результате чего мы видим ниже описание: Variable m присвоено значение Handle.
- Когда мы поставим точку перед переменной m, то увидим красную черту, а при наведении на саму m появляться пояснение, что это СStaticModelProperties. Красная черта означает, что необходимо дописать код. На самом деле точка открывает доступ к свойствам объекта (как и в другом любом языке)
- Закоментированный код в редакторе выглядит (без русских символов):--Comment
СОХРАНЕНИЕ СКРИПТА
- Сохранить скрипт в файл формата Lua можно, открыв вкладку Entity этого CScriptProperties и наведя курсор на Значение (Value) свойства Script нажимаем правой кнопкой мыши выбираем Save или Save As... (аналогично загрузка через Browse...)
ПАНЕЛЬ RCon:Local
- RCon:Local- информационная панель, откуда можно узнать наличие ошибок скрипта Lua или вывести какие-нибудь данные . Командную Панель RCon:Local можно активировать в View-RCon:Local
например напишем в редакторе:
print(Text...Text)
- print("мой первый скрипт")
- при запуске игры Ctrl+T в панели RCon:Local выведет мой первый скрипт
СИНТАКСИС ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ В Lua
--ПРИМИТИВНЫЕ ТИПЫ
local a --объявили одну переменную как nil
local a,b,c... --объявили несколько переменных как nil
--объявление переменных со значением типа Boolean,Float,String,Table
local b=True
local a=1.0015
local text="Текст"
local t={a1,a2,...}
--ТИПЫ SE3
local a=function()
local a=function()
--Явное объявление переменной SE3
назначение переменной a через комментарий путем выбора после знака : тип нажав (Ctrl+Space)
--a:СStaticModelEntity
entityVariable:MemberFunction() --Вызов функций переменной entity
entityVariable.SomeEvent --Вызов Свойств переменной entity
worldInfo
глобальная переменная, в которой сидит класс СworldInfoProperties (нет необходимости его присваивать вручную)
объект, который содержит глобальные свойства карты, откуда можно получить все объекты определенного класса
- а=worldGlobals.worldInfo: GetWorldFileName() --String
получаем путь (в виде строки), где хранится файл карты
КАК ПОЛУЧИТЬ ВСЕ Entity Карты с ОДИНАКОВЫМ КЛАССОМ
- local m=worldGlobals.worldInfo:GetAllEntitiesOfClass("CExternalJointEntity")
- print(m)
КАК ПОЛУЧИТЬ Entity Карты по id
- local model = worldGlobals.worldInfo:GetEntityByID("CStaticModelEntity",id)
Простейшие Операции и выражения
Простейшие операторы:
and
or
- b=type(a)--String
узнаем тип переменной a (возвращает строку)
1. Выражение
- a==b --Boolean- равно
- a<=b --Boolean - меньше равно
- a>=b --Boolean - больше равно
- a<b --Boolean - меньше
- a>b --Boolean - больше
- a~=b --Boolean - не равно
Если выполняется Выражение тогда ...
- if Выражение then ... end
3. Функции в SE3
- H=mthDegToRad(DegH)--Float
- P=mthDegToRad(DegP)--Float
- B=mthDegToRad(DegB)--Float
- q=mthHPBToQuaternion(H,P,B)--Quaternion4f (угол)
- H=q.h --Float
- P=q.p --Float
- B=q.b --Float
- V=mthVector3f(x, y, z)--Vector3f (вектор)
- x=V.x--Float
- y=V.y--Float
- z=V.z--Float
ОБЪЯВЛЕНИЕ ФУНКЦИИ
- QV=mthQuatVect(q, V)--QuatVec
- q=QV:GetQuat()--Float
- H=QV.qh --Float
- P=QV.qp --Float
- B=QV.qb --Float
- V=QV:GetVect()--Float
- x=QV.vx --Float
- y=QV.vy --Float
- z=QV.vz --Float
- QV=entity:GetPlacement()--QuatVec
- entity:SetPlacement(QV)
- local function Name(param1,param2...)...Return Result...end
- function worldGlobals.Name(param1,param2...)...Return Result... end
- function thisScript Name() ...Return Result... end
вызов в другом скрипте scriptName:Name()
пример:
function worldGlobals.SetEntityPosition(entity, vNewPosition)
entity:SetPlacement(
mthQuatVect(entity:GetPlacement():GetQuat(),vNewPosition))
end
вызываем:
установить модель Entity на карте в положение с координатами V
- worldGlobals.SetEntityPosition(model, V)
ОБЩИЕ ФУНКЦИИ Se3
Wait(filtr) --блокирует код на определенное время пока filtr не возвратит true
WaitForever() --блокирует код навсегда пока не остановился мир
ВСЕ О СОБЫТИЯХ (Event) В SE3
- Создание,Получение Значения События через wait
- CustomEvent("Имя нового события")--Boolean
- CustomEvent(объект,"Имя нового события") --Boolean
- CustomEvent(объект,"Имя нового события",ЗначениеСобытия)--ЗначениеСобытия
- 2. Событие
Event(entityVariable.SomeEvent)--BooleanSignalEvent("ИмяСобытия")--BooleanSignalEvent(объект, "ИмяСобытия")--Boolean
SignalEvent("ИмяСобытия",Таблица)--Таблица
SignalEvent(объект, "ИмяСобытия",ЗначениеСобытия)--ЗначениеСобытия
ОБЩИЕ ФУНКЦИИ у Entity моделей видимых классов на карте
- model:SetStretch(0.9) --изменить размер Entity модели на 0.9 (FLOAT)
- model:Dissapear()--модель будет не видна на карте
- model:Appear() -- модель будет не видна на карте
Все о ПЕРЕМЕННОЙ с Типом Таблица (Table)
- Явное объявление Таблицы
Table={[key1]=value1,[key2]=value2 ,...}
вызов:value= function() ... end --Любое значениеkey=имя--Stringlocal f = Table [key]
- Свойства Table
- m[i] -обращение к i (свободная любая цифра, например 1) ячейке таблицы, где сидит объект. Если i выходит за границы таблицы то возвращает значение nil (Неопределено)
- #m - количество индексов (в которых сидят объекты)
- for i in ipairs(m) do print(m[i]) end - обход всех индексов таблицы
table.remove(m,i) - удаление индекса i из таблицы
Все о ПЕРЕМЕННЫХ с различным Типом SE3
- CBaseEntity (CPropEntity,CStaticEntity...)
CString=CBaseEntity :GetClassName()
CString=CBaseEntity :GetName()
CString=CBaseEntity :GetName()
CBaseEntity Handle=CBaseEntity :GetParent(IDENT idName)
CWorldInfoEntity* =SBaseEntity :GetWorldInfo()
Vector3f= CBaseEntity :GetLinearVelocity()
CBaseEntity:SetLinearVelocity(Vector3f vVelocity)
Vector3f= CBaseEntity :GetAngularVelocity()
CBaseEntity:SetAngularVelocity(Vector3f vAngVelocity)
QuatVect = CBaseEntity :GetPlacement ()
QuatVector=CBaseEntity:GetAttachmentAbsolutePlacement(IDENT idAttachment)
QuatVector= CBaseEntity :GetAttachmentRelativePlacement(IDENT idAttachment)
CBaseEntity:SetPlacement(QuatVect qvPlacement)
СBaseEntity :InflictDamage(Slong slКоличество) --наносит ущерб СBaseEntity :InflictDamageofType(Slong slКоличество,CString
stТипУщерба) --наносит ущерб с типом
- CPropEntity(модель с физикой)
CPropEntity:EnablePhysics() --Включить физику
CPropEntity:DisablePhysics()--Включить физику
CPropEntity:WakeUp() --пробудить
CPropEntity:DisablePhysics()--Включить физику
CPropEntity:WakeUp() --пробудить
CPropEntity:GoToSleep() --перейти в спящий режим
CPropEntity:DestroyOnePhase(Bool bCascadeDestruction)
CPropEntity:DestroyOnePhase(Bool bCascadeDestruction)
Bool= CPropEntity:IsDestroyed() --разрушается
CPropEntity:ReportDamage()
- CExternalJointEntity (соединитель)
m:Link(a,b,"","","","") --a и b - модели СPropEntity
m:UnLink --отсоединить
- CLeggedPuppetEntity (кукла)
- puppet:PlayAnim("Hello")
- puppet:DropDead()
- puppet.DesiredPositionReached --желаемая позиция достигнута
- CSpawnEntity
- spawner:SpawnSimple()--все доступные спауны
- spawneeAvailableEventObject=spawner.SpawneeAvailable
- spawnedPuppet = spawneeAvailableEventObject:GetSpawnedEntity()
Пример:
скрипт ищет объекты CPropEntity и прикрепляет их друг к другу (по условию)
function worldGlobals.SetLinkProps(t)
local m=worldGlobals.worldInfo:GetAllEntitiesOfClass("CExternalJointEntity")
local p1=worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity")
local p2=worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity")
local j1,k1,v1,v2,f,v
for i in ipairs(m) do
if i>#worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity") then
break
end
f=false
for j in ipairs(p1) do v1=p1[j]:GetPlacement():GetVect();
for k in ipairs(p2) do v2=p2[k]:GetPlacement():GetVect();
v=mthVector3f(t, 0, 0)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
--print(i)
--print(j) print(k)
f=true;
break;
end--if
v=mthVector3f(0, t, 0)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
f=true;
break;
end--if
v=mthVector3f(0, 0, t)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
f=true;
break;
end--if
end--p2
if f then
break;
end
end--p1
if f then
table.remove(p1,j1);
--table.remove(p2,k1);
end
end--m
end--function
worldGlobals.SetLinkProps(0.5)
Комментарии
model:Appear() -- модель будет не видна на карте
Ашибка