meta data for this page
  •  

📚 差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
scripting:world:vehicle [2023/08/15 11:11] bibiboxsscripting:world:vehicle [2025/08/16 04:30] (当前版本) bibiboxs
行 1: 行 1:
 <markdown> <markdown>
 # World/Vehicle # World/Vehicle
 +
 +**载具`Vehicle`是世界玩法中的关键部分,使用相关API及事件可以高度自定义载具功能。**
 +
 +
  
 ## Event ## Event
  
-### OnVehicleEnteredcharacter, vehicle, seat )+### OnVehicleSpawnvehicle ) 
 + 
 +> 当载具**被生成、被调用`Respawn()`**时触发。 
 + 
 + 
 + 
 +### OnVehicleExplode( vehiclereason ) 
 + 
 +> 当载具**爆炸、被摧毁**时触发,**有关`Reason`原因,请参考[《世界资源实例汇总——伤害触发类型》](reference/instances)**,例如通过代码`vehicle.Kill()`则`reason == 0`。 
 + 
 + 
 + 
 +### OnVehicleEntered( vehicle, character, seat )
  
 > 当角色进入载具(或切换位置)时触发。 > 当角色进入载具(或切换位置)时触发。
行 10: 行 26:
  
  
-### OnVehicleExited( character, vehicle, seat )+### OnVehicleExited( vehicle, character, seat )
  
 > 当角色离开载具时触发。 > 当角色离开载具时触发。
 +
 +
 +
 +### OnVehicleDamage( vehicle, damage, from, type, isImmunity, localHitPos )
 +
 +> 当载具**被尝试造成任何伤害**时调用,如果造成伤害,会在`OnVehicleHealthChange()`后调用。
 +>
 +> **有关伤害类型Type,请参考[《世界资源实例汇总——伤害触发类型》](reference/instances)。**
 +
 +```javascript
 +function OnVehicleDamage( vehicle: Vehicle, damage: int, from: Entity, type: int, isImmunity: bool, localHitPos: Vector )
 +/*
 + vehicle:载具实例
 + damage:伤害值
 + from:造成伤害的对象(可能null,例如碰撞)
 + type:伤害类型
 + isImmunity:是否免疫伤害(如果为true,则表示没有造成伤害,可能被Immunity\Group拦截了)
 + localHitPos:受击位置的本地坐标
 +*/
 +```
 +
 +
 +
 +### OnVehicleHealthChange( vehicle, oldHealth, newHealth )
 +
 +> 当载具**血量发生任何改变**时触发。
  
  
行 36: 行 78:
 ```javascript ```javascript
 vehicle.UUID: string vehicle.UUID: string
 +```
 +
 +
 +
 +### vehicle.Name
 +
 +> 获取载具数据内名称(`Data.Name`)。
 +
 +```javascript
 +vehicle.Name: string
 ``` ```
  
行 42: 行 94:
 ### vehicle.Model ### vehicle.Model
  
-> 获取载具模型ID。+> 获取载具模型ID(载具标识)
  
 ```javascript ```javascript
 vehicle.Model: int vehicle.Model: int
 +```
 +
 +
 +
 +### vehicle.Type
 +
 +> 获取载具模型类型(如:汽车、船、飞行器等)。
 +
 +```javascript
 +vehicle.Type: int
 ``` ```
  
行 56: 行 118:
 ```javascript ```javascript
 vehicle.Pos = Vector(0, 0, 0); //Vector vehicle.Pos = Vector(0, 0, 0); //Vector
 +```
 +
 +
 +
 +### vehicle.Forward
 +
 +> 获取载具正前方向量。
 +
 +```javascript
 +vehicle.Forward: Vector
 +```
 +
 +
 +
 +### vehicle.World
 +
 +> 设置载具实例世界ID(不同世界将不可视\不可交互)。
 +>
 +
 +```javascript
 +vehicle.World = 0; //int
 +```
 +
 +
 +
 +### vehicle.Group
 +
 +> 设置载具**实例组**(这是一个Entity基类通用属性)。
 +>
 +> 相同组的载具及角色对象等无法造成伤害(包括攻击、撞击等),默认值`0`表示特殊组(无免伤和分组机制)。
 +
 +```javascript
 +vehicle.Group = 0; //int
 ``` ```
  
行 82: 行 177:
 ### vehicle.Health ### vehicle.Health
  
-> 设定载具生命值损耗+> 设定载具生命值。 
 + 
 +```javascript 
 +vehicle.Health = 1000; 
 +``` 
 + 
 + 
 + 
 +### vehicle.DefaultHealth 
 + 
 +> 获取载具默认生命值。 
 + 
 +```javascript 
 +vehicle.DefaultHealth: int 
 +``` 
 + 
 + 
 + 
 +### vehicle.BoundSize 
 + 
 +> 获取(只读)载具尺寸大小
  
 ```javascript ```javascript
-vehicle.Health = 1000; //Vector+vehicle.BoundSize; //float
 ``` ```
  
行 92: 行 207:
 ### vehicle.Immunity ### vehicle.Immunity
  
-> 设定载具的免疫属性(可叠加位Flag)。+> 设定载具的[免疫属性](reference/instances "免疫属性")(可叠加位Flag),同步修改`VehicleData`,设置为`-1`自动识别完全免疫(所有Flag相加后的结果)。
  
 ```javascript ```javascript
行 102: 行 217:
 ``` ```
  
-| Type | 说明         | + 
-| ---- | ------------ | + 
-| 0    | 无           | +### vehicle.TyreImmunity 
-| 1    | 无视挥动攻击 | + 
-| 2    | 无视子弹攻击 +> 设定载具的轮胎受击免疫,激活后**不会因==常规攻击==导致爆胎**(`vehicle.SetTyre(1)`),默认为`false`。 
-| 4    | 无视爆炸伤害 | +
-| 8    | 无视碰撞伤害 |+> **注意:此属性不会影响`vehicle.SetTyre()`执行效果。** 
 + 
 +```javascript 
 +vehicle.TyreImmunity = false; //bool 
 +``` 
 + 
 + 
 + 
 +### vehicle.DamageMultiplier 
 + 
 +> 设定载具受损(被攻击伤害倍数,默认为`1.0`。 
 + 
 +```javascript 
 +vehicle.DamageMultiplier = 1.0; //float 
 +```
  
  
行 125: 行 254:
 | 1    | 开启灯光           | | 1    | 开启灯光           |
 | 2    | 全部灯光(远光灯) | | 2    | 全部灯光(远光灯) |
 +
 +
 +
 +### vehicle.LightColor
 +
 +> 设定载具的**主要灯光颜色**,此方法会修改当前载具所有灯光颜色。
 +
 +```javascript
 +vehicle.LightColor = Color(255, 255, 255); //Color
 +```
  
  
行 160: 行 299:
 ```javascript ```javascript
 vehicle.Alarm = false; //bool vehicle.Alarm = false; //bool
 +```
 +
 +
 +
 +### vehicle.Engine
 +
 +> 设置载具引擎启动状态,默认关闭,**当有玩家进入驾驶位后自动激活,并且不会在下车时主动取消**。
 +
 +```javascript
 +vehicle.Engine = false; //bool
 +```
 +
 +
 +
 +### vehicle.Locked
 +
 +> 设置载具**上锁状态**,默认关闭,**此属性目前只有逻辑作用,没有实际的功能**。
 +
 +```javascript
 +vehicle.Locked = false; //bool
 ``` ```
  
行 166: 行 325:
 ### vehicle.Color ### vehicle.Color
  
-> 设定载具的模型颜色。+> 设定载具的**模型颜色**
 > >
-> 此选项仅在部分载具生效,具体取决于载具Json是否包含`Extend/ColorNodes`颜色节点注册(注册:可改变颜色的模型节点;载具模型导入时,可改变颜色的子节点需要和载具本分割出来,并将可变颜色的子节点注册至此)。 +**此选项仅在支持的载具生效,具体取决于载具`Json`是否包含`Extend/CustomColors`颜色替换匹配** 
-> + 
-> *例如:导入的模型`xxx.gltf`拥有子节点`xx1`和`xx2`,其中`xx2`是**在建模工具内单独分割出来的节点**,此子节点允许由`vehicle.Color`动态修改颜色,所以需要在载具Json文件*`Extend/ColorNodes`提前注册`"ColorNodes": ["xx2"]`即可,**届时引擎会自动尝试修改`xx2 `节点的材质颜色**。 +[note2
-> + 
-> **==《沙盘引擎》原生载具大多数都配置了此选项,因此可以直接通过代码修改载具颜色。==**+《沙盘引擎》原生载具大多数都配置了此选项,因此可以直接通过代码修改载具颜色。 
 + 
 +[/note]
  
 ```javascript ```javascript
行 182: 行 343:
 ### vehicle.PowerState ### vehicle.PowerState
  
-> 设置载具引擎驱动状态。+> 设置载具引擎**驱动状态**
 > >
 > 此属性仅用于特殊情况下使用,不建议常规情况下【写入】使用,但可放心用于【只读】判定方向使用。 > 此属性仅用于特殊情况下使用,不建议常规情况下【写入】使用,但可放心用于【只读】判定方向使用。
行 200: 行 361:
 ### vehicle.TurnState ### vehicle.TurnState
  
-> 设置载具引擎转向状态。+> 设置载具引擎**转向状态**
 > >
 > 此属性仅用于特殊情况下使用,不建议常规情况下【写入】使用,但可放心用于【只读】判定方向使用。 > 此属性仅用于特殊情况下使用,不建议常规情况下【写入】使用,但可放心用于【只读】判定方向使用。
行 213: 行 374:
 | 1    | 向左转向 | | 1    | 向左转向 |
 | 2    | 向右转向 | | 2    | 向右转向 |
 +
 +### vehicle.CenterOfMass
 +
 +> 设置载具物理质心(平衡中心点),默认值为载具原始数据`CenterOfMass`。
 +>
 +> 通常情况下,数值`Vector(0, -0.5, 0)`是比较平稳的点,合适的数值可提升载具平稳度。
 +>
 +> **扩展:通过此属性+搭配按键绑定,可实现载具倾斜等效果。**
 +
 +```javascript
 +vehicle.CenterOfMass = Vector(0, 0, 0);
 +```
  
  
行 218: 行 391:
 ### vehicle.Driver ### vehicle.Driver
  
-> 获取载具当前的驾驶员角色(如无则返回null)。+> 获取载具当前的**驾驶员角色**(如无则返回null)。
  
 ```javascript ```javascript
行 228: 行 401:
 ### vehicle.Seat ### vehicle.Seat
  
-> 获取载具的最大乘员数量。+> 获取载具的**最大乘员数量**
  
 ```javascript ```javascript
行 238: 行 411:
 ### vehicle.Seated ### vehicle.Seated
  
-> 获取载具当前正在乘坐的乘员数量。+> 获取载具当前正在乘坐的**乘员数量**
  
 ```javascript ```javascript
行 273: 行 446:
  
 ```javascript ```javascript
-vehicle.Speed: float+vehicle.FixedSpeed: float
 ``` ```
  
行 284: 行 457:
 ```javascript ```javascript
 vehicle.SpeedProgress: float vehicle.SpeedProgress: float
 +```
 +
 +
 +
 +### vehicle.GhostMode
 +
 +> 设置载具**幽灵穿透模式**开关(可穿透其他载具)。
 +
 +```javascript
 +vehicle.GhostMode = false; //bool
 ``` ```
  
行 300: 行 483:
 ### vehicle.IsInWater ### vehicle.IsInWater
  
-> 获取载具是否在水中。+> 获取载具**是否在水中**
  
 ```javascript ```javascript
 vehicle.IsInWater: bool vehicle.IsInWater: bool
 +```
 +
 +
 +
 +### vehicle.IsOnFire
 +
 +> 获取载具是否**正在被燃烧**。
 +
 +```javascript
 +vehicle.IsOnFire: bool
 +```
 +
 +
 +
 +### vehicle.IsDamageFire
 +
 +> 获取载具是否**正在损毁燃烧**(损耗低于最低数值,即将燃烧爆炸)。
 +
 +```javascript
 +vehicle.IsDamageFire: bool
 +```
 +
 +
 +
 +### vehicle.IsTurnOver
 +
 +> 获取载具是否**被判定翻车**(翻转角度>=90)。
 +
 +```javascript
 +vehicle.IsTurnOver: bool
 +```
 +
 +
 +
 +### vehicle.PowerTime
 +
 +> 获取载具**持续动力时间(`PowerState == 1 || PowerState == -1`)**,默认或非动力时值为`0`。
 +
 +```javascript
 +vehicle.PowerTime: float
 +```
 +
 +
 +
 +### vehicle.IsOnGround
 +
 +> 获取载具**是否在地面上**(`vehicle.LiftOffHeight <= 0.5`)。
 +
 +```javascript
 +vehicle.IsOnGround: bool
 +```
 +
 +
 +
 +### vehicle.LiftOffHeight
 +
 +> 获取载具**与地面的距离**。
 +
 +```javascript
 +vehicle.LiftOffHeight: float
 ``` ```
  
行 313: 行 556:
  
 > 生成一个新的载具实例,`Type`类型样式参考[《世界资源实例汇总》](reference/instances)。 > 生成一个新的载具实例,`Type`类型样式参考[《世界资源实例汇总》](reference/instances)。
 +
 +> 如果`Type`参数填写`-1`,则表示生成一个随机类型的载具。
  
 ```javascript ```javascript
行 345: 行 590:
  
  
-### Vehicle.FindByIndex() 
  
-寻找一个载具实例(通过索引),不存在则返回`null`+### Vehicle.GetCount() 
 + 
 +获取当前所有存在载具数量
  
 ```javascript ```javascript
-function Vehicle.FindByIndexindex: int ): Vehicle+function Vehicle.GetCount(): int
 ``` ```
  
  
  
-### Vehicle.GetCount()+### Vehicle.Get()
  
-> 获取当前所有存在载具数量+> 获取当前存在的指定索引载具,通常搭配`GetCount()`遍历使用
  
 ```javascript ```javascript
-function Vehicle.GetCount(): int+function Vehicle.Getindex: int ): Vehicle
 ``` ```
 +
 +
 +
 +### Vehicle.SetSourceData()
 +
 +> 设置**指定型号载具**最新数据,可用来修改同一`Model`载具的全部初始属性。
 +
 +[note3]
 +
 +尽管此方法允许修改任何存在的原生数据`KeyPath`,但并非所有改动都会生效(例如:轮胎、附件、座位等不会生效,也不建议修改,除非知道自己在做什么),此方法更适合修改`Handling`之类的载具**基础属性**。
 +
 +注意:执行代码前**已存在**的载具对象**不会更新**,除非为其执行手动更新代码(`vehicle.ResetData()`)。
 +
 +[/note]
 +
 +```javascript
 +function Vehicle.SetSourceData( vehicle: int, keyPath: string, value: any )
 +```
 +
 +```javascript
 +Vehicle.SetSourceData(10, "Handling.Acceleration", 300);
 +```
 +
 +**更多关于`VehicleData`属性和节点信息,请参考[《游戏载具扩展》](extend/vehicle)。**
 +
 +
 +
 +### Vehicle.GetSourceData()
 +
 +> 获取**指定型号载具**最新数据,如果目标节点不存在则返回`null`。
 +
 +```javascript
 +function Vehicle.GetSourceData( vehicle: int, keyPath: string ): any
 +```
 +
 +
 +
 +### Vehicle.ResetSourceData()
 +
 +> 清空**指定型号载具**修改数据,恢复使用**引擎\模组**内原始数据。
 +>
 +> 注意:此方法**不会更新**已生成的对象,除非手动运行 `vehicle.ResetData()` 。 
 +
 +```javascript
 +function Vehicle.ResetSourceData( vehicle: int )
 +```
 +
 +
 +
 +### Vehicle.ResetAllSourceData()
 +
 +> 清空**指定型号载具**修改数据,恢复使用**引擎\模组**内原始数据。
 +>
 +> 注意:此方法**不会更新**已生成的对象,除非手动运行 `vehicle.ResetData()` 。 
 +
 +```javascript
 +function Vehicle.ResetAllSourceData()
 +```
 +
 +
 +
 +### Vehicle.ResetAllData()
 +
 +> 重置刷新**指定型号载具**最新数据,全部更新使用最新数据。
 +>
 +> **注意:通过`vehicle.SetData`独立修改的载具也会被覆盖更新。**
 +
 +```javascript
 +function Vehicle.ResetAllData( vehicle: int = -1 )
 +```
 +
 +- `vehicle`默认为`-1`修改全部`Model`载具,否则表示仅修改指定`Model`载具
  
  
  
 ## Function ## Function
 +
 +### vehicle.Remove()
 +
 +> 销毁当前载具实例。
 +
 +```javascript
 +function vehicle.Remove()
 +```
 +
 +
 +
 +### vehicle.Damage()
 +
 +> 以标准方式攻击当前载具实例,**有关`Reason`原因,请参考[《世界资源实例汇总——伤害触发类型》](reference/instances)**。
 +
 +```javascript
 +function vehicle.Damage( damage: int, from: Entity = null, reason: int = 0, localHitPos: Vector = Vector(0, 0, 0) )
 +```
 +
 +
 +
 +### vehicle.AddForce()
 +
 +> 增加一个当前对象的物理作用力,默认为本地坐标系(根据参数`isLocal`)。
 +
 +```javascript
 +function vehicle.AddForce( force: Vector, isLocal: bool = true )
 +```
 +
 +```javascript
 +let veh = Vehicle.Create(...);
 +veh.AddForce( Vector(0, 0.5, 5) ); //载具立即向前冲刺一段距离(z)
 +```
 +
 +
 +
 +### vehicle.AddTurnForce()
 +
 +> 增加一个当前对象的物理旋转力,默认为本地坐标系(根据参数`isLocal`)。
 +
 +```javascript
 +function vehicle.AddTurnForce( force: Vector, isLocal: bool = true )
 +```
 +
 +```javascript
 +let veh = Vehicle.Create(...);
 +veh.AddForce( Vector(0, 0.5, 0) ); //将载具抬起一点
 +veh.AddTurnForce( Vector(0, 10, 0) ); //载具横向旋转
 +```
 +
 +
  
 ### vehicle.SetOccupant() ### vehicle.SetOccupant()
行 374: 行 743:
  
 ```javascript ```javascript
-Vehicle.SetOccupant( seat: int, instance: Character )+Vehicle.SetOccupant( instance: Character, seat: int = 0 )
 ``` ```
  
行 381: 行 750:
 let chara = Character.Find(0); let chara = Character.Find(0);
  
-veh.SetOccupant(0, chara); //设置玩家进入主驾驶位置(0),如果位置已存在乘员则不执行 +veh.SetOccupant(chara, 0); //设置玩家进入主驾驶位置(0),如果位置已存在乘员则不执行 
-veh.SetOccupant(0, null); //踢出主驾驶位置,不再有角色驾驶(null)+veh.SetOccupant(null, 0); //踢出主驾驶位置,不再有角色驾驶(null)
 ``` ```
 +
 +
 +
 +### vehicle.GetOccupant()
 +
 +> 获取载具某个乘客位置的角色(`0`表示驾驶员),未找到则返回`null`。
 +
 +```javascript
 +function vehicle.GetOccupant( seat: int ): Character
 +```
 +
 +
 +
 +### vehicle.GetAnyOccupant()
 +
 +> 获取载具任一乘客角色(包含驾驶员),默认返回第一个找到的角色。
 +
 +```javascript
 +function vehicle.GetAnyOccupant( random: bool = false ): Character
 +```
 +
 +- **`random`:**是否获取随机角色,否则获取第一个找到的角色
 +
 +
 +
 +### vehicle.FindOccupant()
 +
 +> 获取指定角色在载具中的位置索引,未找到则返回`-1`。
 +
 +```javascript
 +function vehicle.FindOccupant( character: Character ): int
 +```
 +
 +
 +
 +### vehicle.Fix()
 +
 +> 修复当前载具(恢复最大血量),如果载具已经爆炸则自动调用`vehicle.Respawn()`。
 +
 +```javascript
 +function vehicle.Respawn()
 +```
 +
 +
 +
 +### vehicle.Kill()
 +
 +> 立即完全破坏当前载具。
 +
 +```javascript
 +function vehicle.Kill()
 +```
 +
 +
 +
 +### vehicle.Fire()
 +
 +> 开始燃烧当前载具。
 +
 +> 如果参数`time < 0`则表示持续燃烧。
 +
 +```javascript
 +function vehicle.Fire( time: float )
 +```
 +
 +
 +
 +### vehicle.FireOver()
 +
 +> 停止燃烧当前载具。
 +
 +```javascript
 +function vehicle.FireOver()
 +```
 +
 +
 +
 +### vehicle.Respawn()
 +
 +> 复活\完全重置当前载具,如果载具上有其他角色将会被弹出。
 +
 +```javascript
 +function vehicle.Respawn()
 +```
 +
 +
 +
 +### vehicle.EjectAll()
 +
 +> 弹出当前载具所有乘员\驾驶员(离开载具)。
 +
 +```javascript
 +function vehicle.EjectAll()
 +```
 +
 +
 +
 +### vehicle.SetTyre()
 +
 +> 设置载具某个轮胎的状态(如有轮胎)。
 +
 +```javascript
 +function vehicle.SetTyre( index: int, state: int )
 +```
 +
 +| 状态 | 说明                                             |
 +| ---- | ------------------------------------------------ |
 +| 0    | 默认,轮胎可见                                   |
 +| 1    | 爆胎,轮胎偏移(不受`vehicle.TyreImmunity`影响) |
 +| 2    | 轮胎消失                                         |
 +
 +
 +
 +### vehicle.GetTyre()
 +
 +> 获取载具某个轮胎的状态(如有轮胎),如轮胎不存在则返回`-1`。
 +
 +```javascript
 +function vehicle.GetTyre( index: int )
 +```
 +
 +
 +
 +### vehicle.ExistFlag()
 +
 +> 获取载具`Flags`是否已激活指定的`Flag`。
 +
 +```javascript
 +function vehicle.ExistFlag( flag: int ): bool
 +```
 +
 +```javascript
 +vehicle.SetData("Flags", 4);
 +DLog(vehicle.ExistFlag(4)); //true
 +```
 +
 +
 +
 +### vehicle.SetData()
 +
 +> 设置**当前载具**原生数据(独立),可用来修改载具部分属性。
 +>
 +> 对于一些载具属性的调整,可能需要同时调整多个属性才会达到理想中的效果(例如:提升速度`Acceleration`的同时最好也提升`MaxSpeed`)。
 +>
 +> **注意:尽管`SetData()`允许修改任何存在的原生数据`KeyPath`,但并非所有改动都会生效(例如:轮胎、附件、座位数等不会生效),此方法更适合修改`Handling`之类的载具属性。**
 +
 +[note2]
 +
 +如果希望修改载具的特殊属性,可能希望执行:`vehicle.SetData("Flags", XX)`。
 +
 +**关于载具特殊属性,参考[《载具特殊属性Flag》](reference/instances)。**
 +
 +[/note]
 +
 +```javascript
 +function vehicle.SetData( keyPath: string, value: any )
 +```
 +
 +```javascript
 +let tempVeh = Vehicle.Find(0);
 +tempVeh.SetData("Handling.Acceleration", 300); //Add Speed
 +```
 +
 +**补充:更多有关`VehicleData`属性和节点信息,请参考[《游戏载具扩展》](extend/vehicle)内的Json节点。**
 +
 +
 +
 +### vehicle.GetData()
 +
 +> 获取**当前载具**原生数据(独立),如果目标节点不存在则返回`null`。
 +
 +```javascript
 +function vehicle.GetData( keyPath: string ): any
 +```
 +
 +
 +
 +### vehicle.ResetData()
 +
 +> 重置**当前载具**默认原生数据(独立),如果原生数据通过`Vehicle.SetSourceData()`更改,则使用被其更改后的原生数据,否则使用**引擎\模组**最原始数据。
 +
 +```javascript
 +function vehicle.ResetData()
 +```
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
  
  
 </markdown> </markdown>