meta data for this page
  •  

📚 差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
scripting:world:model [2023/09/06 21:02] bibiboxsscripting:world:model [2025/05/25 15:56] (当前版本) bibiboxs
行 11: 行 11:
 > >
 > **补充:**静态实例默认不具备**动态对象特性**,如果部分静态对象有世界交互&脚本编辑等需求,可通过【地图编辑器】选中目标对象,属性界面勾选【动态对象】来强制动态实例==(请确保脚本中可能用到,否则动态对象会相对占用更多性能)==。 > **补充:**静态实例默认不具备**动态对象特性**,如果部分静态对象有世界交互&脚本编辑等需求,可通过【地图编辑器】选中目标对象,属性界面勾选【动态对象】来强制动态实例==(请确保脚本中可能用到,否则动态对象会相对占用更多性能)==。
 +
 +
 +
 +## Event
 +
 +### OnModelDamage( model, damage, from, type, isImmunity, localHitPos )
 +
 +> 当模型对象被攻击时调用,**攻击检测应该优先考虑此事件**。
 +
 +```javascript
 +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 )
 +
 +> 当模型对象被其他实体对象碰撞时调用。
 +
 +```javascript
 +function OnModelCollision( model: Mode, from: Entity )
 +```
 +
 +
 +
 +### OnModelHealthChange( model, oldHealth, newHealth )
 +
 +> 当模型对象血量发生改变时调用。
 +>
 +> 由于模型对象的特殊性,通常默认`Health`为0,所以很可能被攻击时不会调用此事件(因为默认值与最小值是0,数值没有发生改变)。
 +>
 +> **检测攻击应该优先考虑`OnModelDamage()`事件**。
  
  
行 46: 行 86:
 ```javascript ```javascript
 model.World = 0; //int model.World = 0; //int
 +```
 +
 +
 +
 +### model.Group
 +
 +> 设置模型对象实例组,当前版本对于Model实例暂无功能意义。
 +
 +```javascript
 +model.Group = 0; //int
 +```
 +
 +
 +
 +### model.Tag
 +
 +> 设置模型对象标签,此处的`Model.Tag`与基类`Entity.Tag`共用属性,并非单独的Tag属性。
 +
 +> 此属性设置为**非空值**将会同步提交到`TagList`(可使用API遍历),空值(默认)不会进行提交。
 +
 +```javascript
 +model.Tag = "";
 +```
 +
 +
 +
 +### model.ModelID
 +
 +> 获取(只读)对象的模型ID。
 +
 +```javascript
 +model.ModelID: int
 +```
 +
 +
 +
 +### model.Health
 +
 +> 设置模型对象实例血量(**仅有属性作用**,没有受击及伤害效果,具体逻辑需要开发者自行编写),默认值与最小值为`0`。
 +
 +```javascript
 +model.Health = 0; //int
 +```
 +
 +
 +
 +### model.Flags
 +
 +> 设置模型对象的`Flags`属性值(可叠加位Flag),参考[《模型对象特殊属性》](reference/instances "模型对象特殊属性")。
 +
 +```javascript
 +model.Flags = 0; //int
 +```
 +
 +
 +
 +### model.Immunity
 +
 +> 设定模型对象的[免疫属性](reference/instances "免疫属性")(可叠加位Flag),设置为`-1`自动识别完全免疫(所有Flag相加后的结果)。
 +
 +```javascript
 +model.Immunity = 0; //int
 +
 +//可根据具体需求叠加属性
 +//示例:无视子弹和爆炸伤害,其他正常
 +model.Immunity = 2 + 4; //或直接设为6
 ``` ```
  
行 112: 行 218:
 ### model.Collision ### model.Collision
  
-> 设置模型对象是否存在碰撞逻辑,默认为`false`,通常情况下不需要进行修改+> 设置模型对象是否开启碰撞逻辑,默认为`true`。
  
 ```javascript ```javascript
行 130: 行 236:
  
  
-### model.IsShine+### model.Enum
  
-> 设置模型对象是否明亮(始终高亮度,不受光照影响)。+> 设置模型对象的`Enum`属性值,不同类型的模型可能有不同的作用(或默认值)。
  
 ```javascript ```javascript
-model.IsShine = false; //bool+model.Enum = 0; //int 
 +``` 
 + 
 + 
 + 
 +### model.BoolValue 
 + 
 +> 设置模型对象的`BoolValue`属性值,不同类型的模型可能有不同的作用(或默认值)。 
 + 
 +```javascript 
 +model.BoolValue = false; //bool 
 +``` 
 + 
 + 
 + 
 +### model.StringValue 
 + 
 +> 设置模型对象的`StringValue`属性值,不同类型的模型可能有不同的作用(或默认值)。 
 + 
 +```javascript 
 +model.StringValue = ""; //string 
 +``` 
 + 
 + 
 + 
 +### model.Range 
 + 
 +> 设置模型对象的`Range`属性值,不同类型的模型可能有不同的作用(或默认值)。 
 + 
 +```javascript 
 +model.Range = 0.0; //float 
 +``` 
 + 
 + 
 + 
 +### model.Intensity 
 + 
 +> 设置模型对象的`Intensity`属性值,不同类型的模型可能有不同的作用(或默认值)。 
 + 
 +```javascript 
 +model.Intensity = 0.0; //float
 ``` ```
  
行 142: 行 288:
 ### model.BoundSize ### model.BoundSize
  
-> 获取模型原始尺寸计算值(只计算原始模型,不计算附加子物体等)。+> 获取模型原始尺寸计算值(类似面积,会随着对象缩放尺寸而改变
  
 ```javascript ```javascript
行 148: 行 294:
 ``` ```
  
 +
 +
 +### model.HasParent
 +
 +> 获取模型是否拥有绑定的父物体或节点(只读)。
 +
 +```javascript
 +model.HasParent: bool
 +```
 +
 +
 +
 +### model.Emission
 +
 +> 设置模型对象**发光亮度倍数**,默认为`0.0`(原始亮度),如果希望增加亮度(或者高光)至少需要修改数值>1,反之则表示降低亮度。
 +
 +> **注意:这里的“高光”仅指亮度渲染效果,实际光源渲染与`Light`有区别,不会有真正的光源照射效果。**
 +
 +```javascript
 +model.Emission = 0.0; //float
 +```
 +
 +```javascript
 +model.Emission = 0.0; //Disable
 +model.Emission = 1.0; //Enable, but default(1*1=1)
 +model.Emission = 2.0; //Enable, brightness(1*2=2)
 +```
  
  
行 154: 行 327:
 ### Model.Create() ### Model.Create()
  
-> 生成一个新的模型对象实例(由此生成的全部为动态对象)。+> 生成一个新的**模型对象实例**(由此生成的全部为动态对象)。
  
 ```javascript ```javascript
行 164: 行 337:
 let newModel = Model.Create(0, Vector(0, 0, 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)); //角度参数不同,可传递更详细的欧拉角 let newModel2 = Model.Create(0, Vector(0, 0, 0), Vector(0, 10, 0)); //角度参数不同,可传递更详细的欧拉角
 +```
 +
 +
 +
 +### Model.CreateEffect()
 +
 +[note2]
 +此方法在V0.8+被弃用。
 +[/note]
 +
 +> 生成一个新的**效果对象实例(粒子等)**(由此生成的全部为动态对象),效果索引参考**[《世界资源实例汇总——粒子效果表格》](reference/instances)**。
 +>
 +> 不同索引代表的效果样式不同,效果周期可能是**循环播放、单次播放**等,==由此代码生成的**单次播放**对象会在播放结束后自动销毁,但**循环播放**的对象永远不会,直到手动`Remove()`对象==。
 +>
 +> **注意:此方法相当于`Model.Create()`的扩展快速方法,帮助开发者快速生成效果对象,其原理仍然基于`Model`类。**
 +
 +[note3]
 +注意:此方法在内部基于`Model+DynamicObject`实现,因此有**额外的性能开销**。
 +
 +如果不需要关于`Model API`的相关功能,建议优先使用`World.CreateEffect() | Client.CreateEffect()`生成效果对象实例。
 +[/note]
 +
 +```javascript
 +function Model.CreateEffect( effect: int, pos: Vector, angle: float|vector ): Model
 +```
 +
 +```javascript
 +//生成一个爆炸效果(仅有效果),没有爆炸伤害
 +CreateEffect(3, Vector(0, 0, 0));
 ``` ```
  
行 188: 行 390:
  
  
-### Model.FindByIndex()+### Model.GetCount()
  
-寻找一个模型对象实例通过索引),存在则返回`null`+获取当前所有存在模型对象数量(不包括静态对象)
  
 ```javascript ```javascript
-function Model.FindByIndexindex: int ): Model+function Model.GetCount(): int
 ``` ```
  
  
  
-### Model.GetCount()+### Model.Get()
  
-> 获取当前所有存在模型对象数量(不包括静态对象)+> 获取当前存在的指定索引模型对象,通常搭配`GetCount()`遍历使用
  
 ```javascript ```javascript
-function Model.GetCount(): int+function Model.Getindex: int ): Model 
 +``` 
 + 
 + 
 + 
 +### Model.GetTagCount() 
 + 
 +> 获取当前所有满足`Tag`筛选的模型对象数量(所有`Tag`为xxx的模型对象数量)。 
 + 
 +```javascript 
 +function Model.GetTagCount( tag: string ): int 
 +``` 
 + 
 + 
 + 
 +### Model.GetByTag() 
 + 
 +> 获取当前所有满足`Tag`筛选的模型对象,通常搭配`GetTagCount()`遍历使用。 
 + 
 +```javascript 
 +function Model.GetByTag( tag: string, index: int = 0 ): Model
 ``` ```
  
行 227: 行 449:
 function model.Remove() function model.Remove()
 ``` ```
 +
 +
 +
 +### model.Damage()
 +
 +> 以标准方式攻击当前模型对象实例,**有关`Reason`原因,请参考[《世界资源实例汇总——伤害触发类型》](reference/instances)**。
 +>
 +> **注意:Model对象默认是没有受击逻辑的,即使血量为0也不会触发任何效果,此类内容需要开发者自行编写。**
 +
 +```javascript
 +function model.Damage( damage: int, from: Entity = null, reason: int = 0, localHitPos: Vector = Vector(0, 0, 0) )
 +```
 +
 +
 +
 +### model.ExistFlag()
 +
 +> 获取模型对象`Flags`是否已激活指定的`Flag`。
 +
 +```javascript
 +function model.ExistFlag( flag: int ): bool
 +```
 +
 +
 +
 +### model.AddForce()
 +
 +> 增加一个当前对象的物理作用力,默认为本地坐标系(根据参数`isLocal`)。
 +>
 +> **注意:此方法只有【动态物体+激活物理`Physics == true`】的对象可使用。**
 +
 +```javascript
 +function model.AddForce( force: Vector, isLocal: bool = true )
 +```
 +
 +```javascript
 +let obj = Model.Create(...);
 +obj.AddForce( Vector(0, 3, 0) ); //对象立即向上冲刺一段距离(y)
 +```
 +
 +
 +
 +### model.AddTurnForce()
 +
 +> 增加一个当前对象的物理旋转力,默认为本地坐标系(根据参数`isLocal`)。
 +>
 +> **注意:此方法只有【动态物体+激活物理`Physics == true`】的对象可使用。**
 +
 +```javascript
 +function model.AddTurnForce( force: Vector, isLocal: bool = true )
 +```
 +
 +```javascript
 +let obj = Model.Create(...);
 +obj.AddTurnForce( Vector(0, 10, 0) ); //对象横向旋转
 +```
 +
 +
 +
 +### model.MoveTo()
 +
 +> 将当前模型对象过渡移动到目标位置。
 +>
 +> **(停止过渡:不填写任何参数,执行一次)**
 +
 +```javascript
 +function model.MoveTo( pos: Vector, time: float )
 +```
 +
 +
 +
 +### model.RotateTo()
 +
 +> 将当前模型对象过渡旋转到目标欧拉角。
 +>
 +> **(停止过渡:不填写任何参数,执行一次)**
 +
 +```javascript
 +function model.RotateTo( euler: Vector, time: float )
 +```
 +
 +
 +
 +### model.ScaleTo()
 +
 +> 将当前模型对象过渡缩放到目标尺寸。
 +>
 +> **(停止过渡:不填写任何参数,执行一次)**
 +
 +```javascript
 +function model.ScaleTo( scale: Vector, time: float )
 +```
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
  
 </markdown> </markdown>