meta data for this page
📚 World/Model
在《沙盘引擎》世界中,所有关于3D模型、物体实例均属于Model对象。
在此基础上,Model还分为静态、动态两种不同实例形态:
静态实例:通常由游戏地图生成的地图对象,这些对象通常只作为世界的建筑装饰及碰撞,不具有动态对象特性(不可通过脚本编辑)。
动态实例:由开发者在脚本中实时创建的Model.Create()
对象,拥有动态对象特性(可通过脚本编辑)。
补充:静态实例默认不具备动态对象特性,如果部分静态对象有世界交互&脚本编辑等需求,可通过【地图编辑器】选中目标对象,属性界面勾选【动态对象】来强制动态实例(请确保脚本中可能用到,否则动态对象会相对占用更多性能)。
📒 Event
📘 OnModelDamage( model, damage, from, type, isImmunity )
当模型对象被攻击时调用,攻击检测应该优先考虑此事件。
function OnModelDamage( model: Model, damage: int, from: Entity, type: int, isImmunity: bool, localHitPos: Vector ) /* model:触发实例 damage:伤害值 from:造成伤害的对象(可能null,例如碰撞) type:伤害类型 isImmunity:是否免疫伤害(如果为true,则表示没有造成伤害,可能被Immunity\Group拦截了) localHitPos:受击位置的本地坐标 */
📘 OnModelCollision( model, from )
当模型对象被其他实体对象碰撞时调用。
function OnModelCollision( model: Mode, from: Entity )
📘 OnModelHealthChange( model, oldHealth, newHealth )
当模型对象血量发生改变时调用。
由于模型对象的特殊性,通常默认Health
为0,所以很可能被攻击时不会调用此事件(因为默认值与最小值是0,数值没有发生改变)。
检测攻击应该优先考虑OnModelDamage()
事件。
📒 Property
📘 model.ID
获取模型对象序列ID,每个实例ID是唯一的。
当之前的实例被销毁后,空闲的靠前ID将会被后续新实例重新使用(对于特殊情况,UUID
是更合适的筛选选择)。
补充:部分游戏地图文件内置了一些【动态模型对象】,这将导致加载地图时直接生成【动态Model】,所以可能会出现“服务器任何Model.Create()
代码都没写,但是ID不是从0开始”的情况,这是因为一些ID被提前使用了。
model.ID: int
📘 model.UUID
获取模型对象UUID,这是由一串较长的字符串组成的全局唯一文本ID。
model.UUID: string
📘 model.World
设置模型对象实例世界ID(不同世界将不可视\不可交互)。
model.World = 0; //int
📘 model.Group
设置模型对象实例组,当前版本对于Model实例暂无功能意义。
model.Group = 0; //int
📘 model.Tag
设置模型对象标签,此处的Model.Tag
与基类Entity.Tag
共用属性,并非单独的Tag属性。
此属性设置为非空值将会同步提交到TagList
(可使用API遍历),空值(默认)不会进行提交。
model.Tag = "";
📘 model.ModelID
获取(只读)对象的模型ID。
model.ModelID: int
📘 model.Health
设置模型对象实例血量(仅有属性作用,没有受击及伤害效果,具体逻辑需要开发者自行编写),默认值与最小值为0
。
model.Health = 0; //int
📘 model.Flags
设置模型对象的Flags
属性值(可叠加位Flag),参考《模型对象特殊属性》。
model.Flags = 0; //int
📘 model.Immunity
设定模型对象的免疫属性(可叠加位Flag),设置为-1
自动识别完全免疫(所有Flag相加后的结果)。
model.Immunity = 0; //int //可根据具体需求叠加属性 //示例:无视子弹和爆炸伤害,其他正常 model.Immunity = 2 + 4; //或直接设为6
📘 model.Pos
设置模型对象坐标。
model.Pos = Vector(0, 0, 0);
📘 model.Angle
设置模型对象角度。
model.Angle = 0.0; //float
📘 model.EulerAngle
设置模型对象欧拉角度。
model.EulerAngle = Vector(0, 0, 0);
📘 model.Scale
设置模型对象3D尺寸缩放。
model.Scale = Vector(1, 1, 1); //默认全部为1,无论尺寸是否内部缩放
📘 model.Color
设置模型对象特定颜色或覆盖颜色,如果需要修改透明度,应该使用model.Alpha
。
model.Color = Color(255, 255, 255);
📘 model.Alpha
设置模型对象实例透明度,默认为255
。
model.Alpha = 255; //int
📘 model.Collision
设置模型对象是否开启碰撞逻辑,默认为true
。
model.Collision = false; //bool
📘 model.Physics
设置模型对象物理模式开关,默认关闭,只有动态对象可以使用此属性。
model.Physics = false; //bool
📘 model.Enum
设置模型对象的Enum
属性值,不同类型的模型可能有不同的作用(或默认值)。
model.Enum = 0; //int
📘 model.BoolValue
设置模型对象的BoolValue
属性值,不同类型的模型可能有不同的作用(或默认值)。
model.BoolValue = false; //bool
📘 model.StringValue
设置模型对象的StringValue
属性值,不同类型的模型可能有不同的作用(或默认值)。
model.StringValue = ""; //string
📘 model.Range
设置模型对象的Range
属性值,不同类型的模型可能有不同的作用(或默认值)。
model.Range = 0.0; //float
📘 model.Intensity
设置模型对象的Intensity
属性值,不同类型的模型可能有不同的作用(或默认值)。
model.Intensity = 0.0; //float
📘 model.BoundSize
获取模型原始尺寸计算值(类似面积),会随着对象缩放尺寸而改变。
model.BoundSize: float //数字越大表示尺寸越大,根据内置标准的尺寸规范计算
📘 model.HasParent
获取模型是否拥有绑定的父物体或节点(只读)。
model.HasParent: bool
📘 model.Emission
设置模型对象发光亮度倍数,默认为0.0
(原始亮度),如果希望增加亮度(或者高光)至少需要修改数值>1,反之则表示降低亮度。
注意:这里的“高光”仅指亮度渲染效果,实际光源渲染与Light
有区别,不会有真正的光源照射效果。
model.Emission = 0.0; //float
model.Emission = 0.0; //Disable model.Emission = 1.0; //Enable, but default(1*1=1) model.Emission = 2.0; //Enable, brightness(1*2=2)
📒 Static Function
📘 Model.Create()
生成一个新的模型对象实例(由此生成的全部为动态对象)。
function Model.Create( model: int, pos: Vector, angle: float|vector ): Model
//在0点坐标处,建立一个模型ID为0、角度为10的模型对象实例 let newModel = Model.Create(0, Vector(0, 0, 0), 10); let newModel2 = Model.Create(0, Vector(0, 0, 0), Vector(0, 10, 0)); //角度参数不同,可传递更详细的欧拉角
📘 Model.CreateEffect()
生成一个新的效果对象实例(粒子等)(由此生成的全部为动态对象),效果索引参考《世界资源实例汇总——粒子效果表格》。
不同索引代表的效果样式不同,效果周期可能是循环播放、单次播放等,由此代码生成的单次播放对象会在播放结束后自动销毁,但循环播放的对象永远不会,直到手动Remove()
对象。
注意:此方法相当于Model.Create()
的扩展快速方法,帮助开发者快速生成效果对象,其原理仍然基于Model
类。
Model+DynamicObject
实现,因此有额外的性能开销。
如果不需要关于Model API
的相关功能,建议优先使用World.CreateEffect() | Client.CreateEffect()
生成效果对象实例。
function Model.CreateEffect( effect: int, pos: Vector, angle: float|vector ): Model
//生成一个爆炸效果(仅有效果),没有爆炸伤害 CreateEffect(3, Vector(0, 0, 0));
📘 Model.Find()
寻找一个模型对象实例(通过ID),不存在则返回null
。
function Model.Find( id: int ): Model
📘 Model.FindByUUID()
寻找一个模型对象实例(通过UUID),不存在则返回null
。
function Model.FindByUUID( uuid: string ): Model
📘 Model.GetCount()
获取当前所有存在模型对象数量(不包括静态对象)。
function Model.GetCount(): int
📘 Model.Get()
获取当前存在的指定索引模型对象,通常搭配GetCount()
遍历使用。
function Model.Get( index: int ): Model
📘 Model.GetTagCount()
获取当前所有满足Tag
筛选的模型对象数量(所有Tag
为xxx的模型对象数量)。
function Model.GetTagCount( tag: string ): int
📘 Model.GetByTag()
获取当前所有满足Tag
筛选的模型对象,通常搭配GetTagCount()
遍历使用。
function Model.GetByTag( tag: string, index: int = 0 ): Model
📘 Model.ExistModel()
判断指定模型Model
是否存在引擎中(是否存在模型可被加载)。
function Model.ExistModel( model: int ): bool
📒 Function
📘 model.Remove()
销毁当前模型对象实例。
function model.Remove()
📘 model.Damage()
以标准方式攻击当前模型对象实例,有关Reason
原因,请参考《世界资源实例汇总——伤害触发类型》。
注意:Model对象默认是没有受击逻辑的,即使血量为0也不会触发任何效果,此类内容需要开发者自行编写。
function model.Damage( damage: int, from: Entity = null, reason: int = 0, localHitPos: Vector = Vector(0, 0, 0) )
📘 model.ExistFlag()
获取模型对象Flags
是否已激活指定的Flag
。
function model.ExistFlag( flag: int ): bool
📘 model.AddForce()
增加一个当前对象的物理作用力,默认为本地坐标系(根据参数isLocal
)。
注意:此方法只有【动态物体+激活物理Physics == true
】的对象可使用。
function model.AddForce( force: Vector, isLocal: bool = true )
let obj = Model.Create(...); obj.AddForce( Vector(0, 3, 0) ); //对象立即向上冲刺一段距离(y)
📘 model.AddTurnForce()
增加一个当前对象的物理旋转力,默认为本地坐标系(根据参数isLocal
)。
注意:此方法只有【动态物体+激活物理Physics == true
】的对象可使用。
function model.AddTurnForce( force: Vector, isLocal: bool = true )
let obj = Model.Create(...); obj.AddTurnForce( Vector(0, 10, 0) ); //对象横向旋转
📘 model.MoveTo()
将当前模型对象过渡移动到目标位置。
(停止过渡:不填写任何参数,执行一次)
function model.MoveTo( pos: Vector, time: float )
📘 model.RotateTo()
将当前模型对象过渡旋转到目标欧拉角。
(停止过渡:不填写任何参数,执行一次)
function model.RotateTo( euler: Vector, time: float )
📘 model.ScaleTo()
将当前模型对象过渡缩放到目标尺寸。
(停止过渡:不填写任何参数,执行一次)
function model.ScaleTo( scale: Vector, time: float )