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