🎁
🏆 导航菜单
🎪 扩展内容
🎯 沙盘引擎文档
🕹️ 文章及书籍&教程
🎖️ 外部的链接
🎁
🏆 导航菜单
🎪 扩展内容
🎯 沙盘引擎文档
🕹️ 文章及书籍&教程
🎖️ 外部的链接
当角色被生成、被调用
Respawn()
时触发。
当角色死亡状态时触发,有关
Reason
原因,请参考《世界资源实例汇总——伤害触发类型》,例如通过代码character.Kill()
则reason == 0
。
function OnCharacterDeath( character: Character, reason: int )
当角色被其他角色杀死时触发,有关
Reason
原因,请参考《世界资源实例汇总——伤害触发类型》。等待此事件执行完毕后,随后仍然会触发
OnCharacterDeath()
事件。
function OnCharacterKill( killer: Character, character: Character, reason: int )
当角色附近有新的实体对象进入范围时调用。
实体对象:
World/Entity
类成员。
当角色附近有新的实体对象离开范围时调用。
实体对象:
World/Entity
类成员。
当角色手中道具(ID)发生更换时调用。
function OnCharacterPropChange( character: Character, oldProp: Prop, newProp: Prop )
当角色背包池总数(
character.PropCount
)发生变化时调用。
当角色手中道具
HasFocus
状态(bool)切换时调用。说明:表示开始\正在聚焦(true)及聚焦结束(false)。
function OnCharacterPropFocus( character: Character, prop: Prop, state: bool )
当角色手中道具即将被使用之前调用,此事件将关键决定当前道具是否允许使用。
注意:此事件拥有返回值,默认返回
1
,如果返回0
则表示不允许本次使用。
function OnCharacterPropActionBefore( character: Character, prop: Prop ): int
function OnCharacterPropActionBefore( character, prop ) { if(prop == 0 && character.Health <= 50) { //当玩家血量小于50,且Prop==0时,拦截使用请求,不会触发任何效果 return 0; } return 1; //此处可忽略,默认返回1(放行使用请求) }
当角色手中道具每次被使用一次时调用(例如:每次挥拳、开枪等)。
注意:
hitPos
参数表示当前物品最终造成伤害的位置,但投掷类物品等无法确定最终位置,所以此处将只返回起点位置。
function OnCharacterPropAction( character: Character, prop: Prop, hitPos: Vector )
当角色离开地面时触发。
当角色回到\接触地面时触发,可用
character.FlyTime
获取持续离地时间。
当角色被尝试造成任何伤害时调用,如果造成伤害,会在
OnCharacterHealthChange()
之后调用。有关伤害类型Type,请参考《世界资源实例汇总——伤害触发类型》。
function OnCharacterDamage( character: Character, damage: int, from: Entity, type: int, isImmunity: bool ) /* character:角色实例 damage:伤害值 from:造成伤害的对象(可能null,例如碰撞) type:伤害类型 isImmunity:是否免疫伤害(如果为true,则表示没有造成伤害,可能被Immunity\Group拦截了) */
当角色血量发生任何改变时触发。
当角色护甲值发生任何改变时触发。
当角色基础状态发生改变时触发(例如:站立、行走、跳跃、驾驶、乘坐、死亡等),状态索引参考《世界资源实例汇总——角色基础状态》。
当角色冻结属性
Frozen
发生改变时触发。
当角色游泳属性
IsSwimming
发生改变时触发。
当角色开始播放自定义动作时触发(通过
character.SetAnim()
)。
function OnCharacterAnimPlayed( character: Character, anim: int, loop: bool )
当角色停止播放自定义动作时触发(主动停止或播放结束)。
function OnCharacterAnimStopped( character: Character, anim: int, loop: bool )
有关角色与拾取物的交互行为,具体内容请访问Vehicle文档查看。
有关角色与拾取物的交互行为,具体内容请访问Pickup文档查看。
获取角色序列ID,每个实例ID是唯一的。
当之前的实例被销毁后,空闲的靠前ID将会被后续新实例重新使用(对于特殊情况,
UUID
是更合适的筛选选择)。
character.ID: int
获取角色UUID,这是由一串较长的字符串组成的全局唯一文本ID(实例化时自动赋值,非持久化数据)。
character.UUID: string
设置或获取角色名称(默认为空字符),长度限制最多
16
。即使有玩家(
Owner
)正在控制当前角色,也并不会返回玩家名称。
character.Name = ""; //string
设置角色坐标。
character.Pos = Vector(0, 0, 0);
获取角色正前方向量。
character.Forward: Vector
设置角色实例世界ID(不同世界将不可视\不可交互)。
如果当前角色已绑定
Owner(玩家)
,世界修改后将会因为世界不同而解除绑定,如果希望同步修改世界,请使用character.Owner.World
进行修改。
character.World = 0; //int
设置角色实例组(这是一个Entity基类通用属性)。
相同组的角色及对象无法造成伤害,默认值
0
表示特殊组(无免伤和分组机制)。
character.Group = 0; //int
获取(只读)控制当前角色的玩家对象(
Player
),如果不存在则返回null
。
character.Owner; //Player
获取(只读)角色生物种类(例如:人类、僵尸、猪牛羊、其他动物等),具体种类参考《世界资源实例汇总——角色生物表格》。
character.Type; //int
获取(只读)角色生物类型(例如:人形角色、地面生物、飞行生物、海洋生物等),具体类型参考《世界资源实例汇总》。
character.AnimalType; //int
设置角色透明度(0~255),默认值是
255
。
character.Alpha = 255; //int
设置角色透明度渐变时间,默认值是
1.0
。
character.AlphaTime = 1.0; //float
设置角色角度方向(Y轴),这是修改角色角度的主要方式。
character.Angle = 0.0; //0~360
设置角色欧拉角度。
根据引擎角色机制,修改除Y轴外其他角度时,常规情况下,
X\Z轴
会在短时间内自动Lerp重置到0.0
(类似不倒翁)。
character.EulerAngle = Vector(0, 0, 0);
设置角色血量,如果为0则表示死亡。
character.Health = 100;
设置角色护甲值(额外血量),默认为
0
,如果被攻击时护甲>=0则优先扣除护甲。此属性与
Health
机制基本相同,适合有【额外生命值、护甲值】需求时使用。
character.Armour = 100;
设置角色基础攻击伤害值(手中无物品时攻击,可理解为拳头攻击力)。
属性默认值根据角色不同有所差异。
character.BaseDamage = 0; //from character defaultValue
设定角色受损(被攻击)伤害倍数,默认为
1.0
。
character.DamageMultiplier = 1.0; //float
获取角色身体高度,不同的角色可能有不同的高度,通常为头顶上方的高度(例如:人类默认
2.0
)。可能用于获取头顶
Bubble
显示的高度。
character.BodyHeight: float
设置或读取角色焦点坐标,如果目标角色已被玩家实时控制,则修改是没有意义的(除非角色静止状态)。
焦点坐标指的是角色目前正在关注的位置(及方向),被玩家控制时也表示玩家鼠标的世界位置。
character.FocusPos = Vector(0, 0, 0);
设置角色触发检测范围,此属性将影响
character.GetTrigger()
相关检测距离,默认是1.5
。
character.TriggerDistance = 1.55; //float
为当前角色开关独立寻路范围组件,开启后可解决
Player+Stream
范围限制的问题,并且以当前对象自身作为寻路范围中心点,此属性默认关闭。注意:玩家控制的角色不需要且无法开启,因为
Player
本身就存在寻路范围组件。此属性每开启一个会对服务器主机性能产生一些影响,因此仍然建议AI寻路尽可能符合Stream规范,在特别需求的情况下,可以开启少数对象的此属性。
character.AISurface = false;
为当前角色设置一个AI目标对象,详情参考《CharacterAI》文档。
注意:当前属性被设置成为
null
的值后,属性AITargetPos
将被设置为default
,两种Target属性只能同时存在一个。
character.AITarget = null; //Entity
为当前角色设置一个AI目标坐标,详情参考《CharacterAI》文档。
注意:当前属性被设置成为
null
的值后,属性AITargetPos
将被设置为VECTOR_NULL
(常量,表示无意义\空坐标),两种Target属性只能同时存在一个。
character.AITargetPos = VECTOR_NULL; //Vector
为当前角色设置一个AI状态(行为\性格),详情参考《CharacterAI》文档。
character.AIState = 0; //Enum
为当前角色设置一个AI移动行为状态(自动\行走\奔跑),详情参考《CharacterAI》文档。
character.AIMoveState = 0; //Enum
为当前角色设置一个AI距离属性(不同AI状态有不同的意义),详情参考《CharacterAI》文档。
character.AIDistance = 3.0; //float
与
Character.SetVehicle()
作用基本相同,唯一的区别是不能设置具体的座位,这是一种补充写法。
let veh = Vehicle.Create(10, character.Pos, character.Angle); character.Vehicle = veh; //如果主驾驶没有被占用,则将此角色放置到驾驶位,否则无效果 //让玩家离开载具 character.Vehicle = null; //等同于调用了character.Eject()
获取当前玩家所在载具乘客位置(如果不存在乘坐载具,则返回-1)。
顺序:0(驾驶位)、1+(乘客位置)。
character.VehicleSlot: int
设置角色自身额外物理重力,默认值
0.0
。此属性越高角色物理越向上,例如设置为
0.1
获得持续向上推力。
character.Gravity = 0.0;
设置角色皮肤贴图,内置ID参考《世界资源实例汇总》,设置为
-1
可请求一个随机皮肤(如存在)。注意:需自行确保皮肤贴图及ID正确,理论上人类也可以穿上动物或外部导入皮肤(如存在),但同时也会导致贴图异常。
character.Skin = 0;
设置角色移动速度。
character.Speed = 1; //此数值根据Character不同类型默认值而定,不是固定的
设置角色移动速度倍数,默认为
1.0
。
character.SpeedMultiplier = 1.0;
设置角色附加状态移动速度,默认情况下此速度应该比
character.Speed
速度更快(奔跑)。此属性也可以举一反三,根据需求更改比
character.Speed
速度更慢,以实现走路\静步的效果。
character.AdditionSpeed = 1; //此数值根据Character不同类型默认值而定,不是固定的
设置角色附加状态移动速度倍数,默认为
1.0
。
character.AdditionSpeedMultiplier = 1.0;
获取(只读)角色单次行为(Action)次数(例如:连发武器的单次攻击连续次数、按下一次鼠标后Action次数)。
character.ActionContinue; //int
获取角色复活状态(是否未死亡)。
character.IsSpawned: bool
获取角色游泳状态,并非在水里状态(角色死亡后,即使在水里,也只会返回
false
)。
character.IsSwimming: bool
获取角色是否在水中(角色死亡后,即使没有游泳,也会返回
true
)。
character.IsInWater: bool
获取角色是否正在被燃烧。
character.IsOnFire: bool
获取角色是否在主驾驶载具(仅主驾驶有效,乘员状态将返回
false
)。
character.IsDriver: bool
获取角色是否在乘坐载具(即使角色正在主驾驶,也会返回
true
)。
character.IsPassenger: bool
获取角色是否为扩展型角色(拥有高级骨骼的角色,可使用道具、工具、武器等)。
通常情况下,人形角色均为扩展型,多数动物为非扩展型(因为动物通常无法正常动作持有\使用道具和武器等)。
character.IsPassenger: bool
设置角色的主要颜色,此属性主要用于人形角色。
在人形角色实例修改时,将会修改目标角色的肤色(例如:肤色、褐色皮肤、僵尸色皮肤等)。
在其他角色实例修改时,可能修改为整体叠加颜色。
通常情况下,人形角色均为扩展型,多数动物为非扩展型(因为动物通常无法正常动作持有\使用道具和武器等)。
character.Color = Color(255, 204, 153); character.Color1 = Color(255, 204, 153); //另一种属性映射,意义相同
设置角色的次要颜色,此属性主要用于人形角色。
在人形角色实例修改时,将会修改目标角色的头发颜色。
在其他角色实例修改时,可能不会有期望的效果。
character.Color2 = Color(255, 255, 0);
设定角色的免疫属性(可叠加位Flag)。
character.Immunity = 0; //int //可根据具体需求叠加属性 //示例:无视子弹和爆炸伤害,其他正常 character.Immunity = 2 + 4; //或直接设为6
Type | 说明 |
---|---|
0 | 无 |
1 | 无视常规\挥动攻击 |
2 | 无视子弹攻击 |
4 | 无视爆炸伤害 |
8 | 无视碰撞(及掉落)伤害 |
16 | 无视火焰伤害 |
获取\设置角色是否为开始\正在行动。
这是一个抽象概念,简单理解相当于让此角色”按住左键“(对于已被玩家控制的角色,此选项是只读意义的)。
character.HasAction = false; //bool
获取\设置角色是否为开始\正在聚焦。
这是一个抽象概念,简单理解相当于让此角色”按住右键“(对于已被玩家控制的角色,此选项是只读意义的)。
character.HasFocus = false; //bool
设置角色是否可以游泳,默认为
true
,当前版本只有僵尸等少数角色默认false
。注意:此属性将控制角色是否会被淹死,以及可能的AI控制逻辑。
character.CanSwim = true;
设置角色冻结状态,冻结后将无法移动、驾驶等操作。
character.Frozen = false;
设置角色飞行模式(不是一种手机模式),角色将可以进行飞天悬空移动等。
注意:当角色死亡时,将自动取消飞行模式。
character.FlyMode = false;
获取角色飞行\离开地面持续时间。
此属性从角色开始离地起计算,下次落地时清零。
举一反三:根据此属性可实现飞行时间、落地时间判定等功能。
character.FlyTime: float
获取角色当前正在触发的拾取物,如无则返回
null
。
character.Pickup: Pickup
获取角色当前正在触发的检查点,如无则返回
null
。
character.Checkpoint: Checkpoint
获取角色在载具状态持续时间(每次上车、切换乘客位置都将重置),如未使用载具则返回
-1
。
character.VehicleTime: float
获取角色在当前拾取物停留的持续时间(每次触碰拾取物都将重置),如离开拾取物则返回
-1
。
character.PickupTime: float
获取角色在当前检查点停留的持续时间(每次进入检查点都将重置),如离开检查点则返回
-1
。
character.CheckpointTime: float
获取角色当前正在使用的Prop物品对象,此属性无法直接赋值(例如无法
prop = null
,同时也不应该new或赋值其他对象),但可以修改其内部属性。正确操作角色Prop背包的方法是使用
character.SetProp()
,切换角色物品槽的方法是使用character.PropSlot
,而不是直接修改此属性。
character.Prop: Prop
设置角色当前正在使用的物品槽,默认为
0
,修改此属性是“切换背包物品”的正确方法。
character.PropSlot = 0; //0~PropCount
设置角色当前背包物品槽最大数量(可理解为背包格子数量),默认为
0
。通常情况下,如果想开始为一个角色创建背包系统,应该首先确保PropCount设置为合适的数量,或考虑使用
AddProp()
方法动态调整。
character.PropCount = 0;
生成一个新的角色实例,
Type
类型样式参考《世界资源实例汇总》。如果
Type
参数填写-1
,则表示生成一个随机类型的角色(随机生物)。
function Character.Create( type: int, pos: Vector, angle: float = 0 ): Character
//在0点坐标处,建立一个类型为0的角色实例 Character.Create(0, Vector(0, 0, 0), 0);
寻找一个角色实例(通过ID),不存在则返回
null
。
function Character.Find( id: int ): Character
寻找一个角色实例(通过UUID),不存在则返回
null
。
function Character.Find( uuid: string ): Character
获取当前所有存在角色数量。
function Character.GetCount(): int
获取当前存在的指定索引角色,通常搭配
GetCount()
遍历使用。
function Character.Get( index: int ): Character
销毁当前角色实例。
function character.Remove()
以标准方式攻击当前角色实例,有关
Reason
原因,请参考《世界资源实例汇总——伤害触发类型》。注意:此方法受到
GameRule("character_damagemultiplier")
规则影响(默认值0.5
,因此character.Damage(50)
则只会受到25伤害),如果希望直接改变血量,请考虑使用character.Health
属性直接赋值。
function character.Damage( damage: int, from: Entity = null, reason: int = 0 )
使当前角色立即执行一次
Action
行为(例如:手中有武器,立即攻击一次)。
function character.Action()
增加一个当前对象的物理作用力,默认为本地坐标系(根据参数
isLocal
)。在飞行
FlyMode
等逻辑冲突模式下,此方法不会生效。
function character.AddForce( force: Vector, isLocal: bool = true )
let npc = character.Create(...); npc.AddForce( Vector(0, 3, 0) ); //角色立即向上冲刺一段距离(y)
此方法已被取消,请使用
AITarget
属性等方式AI寻路。让角色AI寻路到某个坐标,如果角色不在任何Stream范围内,或者无法到达指定位置,将会返回
false
。此操作仅用于坐标寻路,不执行
AIState\AITarget
等机制逻辑。
function character.AIMove( pos: Vector, onComplete: Action = null ): bool
let chara = ...; chara.AIMove(Vector(10, 0, 5), () => { DLog("NPC到达了目标位置"); });
恢复当前角色(恢复最大血量),如果角色已经死亡则自动调用
character.Respawn()
。
function character.Recover()
杀死当前角色(仅死亡,不会自动销毁)。
死亡后的角色必须通过
character.Respawn()
才能正常复活。
function character.Kill()
开始燃烧当前角色。
如果参数
time < 0
则表示持续燃烧。
function character.Fire( time: float )
停止燃烧当前角色。
function character.FireOver()
复活并重置当前角色。
function character.Respawn()
使角色离开当前载具,如没有驾驶\乘坐载具则无效果。
也可以使用
character.Vehicle = null
有相同的效果。
function character.Eject()
使角色进入一辆载具的某个驾驶\乘客位置,
Slot=0
为驾驶位。此方法和
Vehicle.SetOccupant
作用相同。
function character.SetVehicle( vehicle: Vehicle, slot: int ): bool //是否进入成功
使角色进入一辆载具的自动靠前位置(优先顺序:驾驶位>乘客位1>乘客位2>乘客位N+1)。
function character.EnterVehicle( vehicle: Vehicle ): bool //是否进入成功
获取角色范围触发实例数量,此功能可获取某个角色
character.TriggerDistance
范围内的实例数量。实体通常包括:角色、载具、拾取物、检查点等。
function character.GetTriggerCount(): int
获取角色范围触发实例(根据索引),此功能可获取某个角色
character.TriggerDistance
范围内的实例对象。
function character.GetTrigger( index: int ): Entity
//遍历某个角色范围内所有实例对象,可用于扩展上车、拾取物品、使用等操作 for(let i=0;i<character.GetTriggerCount();i++) { let target = character.GetTrigger(i); DLog("trigger[" + i + "]: " + target.GetType()); }
重置\刷新当前角色正在使用的物品对象,通常情况下不需要调用此方法。
function character.ResetProp()
设置当前角色指定物品槽的物品对象,使用此功能是“设置背包物品”的正确方法。
function character.SetProp( slot: int, id: int, amount: int = 1, data: any = null )
//在物品槽索引3的位置,设置为ID10物品x1,同时为其设定自定义属性Test = 1.0 character.PropCount = 10; //提前设置好背包格子数量,否则会错误 character.SetProp(3, 10, 1, {Test: 1.0});
获取当前角色指定物品槽的物品对象,使用此功能是“获取指定背包槽物品”的正确方法。
对于角色实例来说,获取的物品对象永远不会为
null
,指定槽不存在时会返回默认物品(相当于透明的拳头,ID0
)。注意:
Prop
是一个扩展类型,具体属性参考【World/Prop】。
function character.GetProp( slot: int ): Prop
尝试为当前角色加入物品对象到物品槽,使用此功能是“加入背包物品”的正确方法。
function character.AddProp( id: int, amount: int = 1, data: any = null, forceAll: bool = false, autoSize = false ): int
尝试为当前角色加入物品对象到单独物品槽,与
AddProp()
的区别是:此方法无论前提条件,只使用最新的1个物品槽(不判断是否能完全放下,如果有叠加溢出,只会赋值数量到最大值)。
function character.AppendProp( id: int, amount: int = 1, data: any = null, autoSize = false ): int
设置\播放一段当前角色的自定义动作(例如:挥手、躺下、坐下等),详细动作ID参考《世界资源实例汇总》。
注意:如果希望主动停止\中断播放动作,使用无参数的此方法即可(
character.SetAnim()
)。
function character.SetAnim( anim: int, loop: bool = false )
设置角色扩展属性(例如:人形角色的头部、头发),此功能更多只适用于人形角色。
function character.SetExtend( type: index, index: int )
获取角色扩展属性。
function character.GetExtend( type: int ): int
绑定一个模型对象(
Model
)到角色指定节点位置(原点本地坐标),通过此功能可实现很多扩展操作,此功能更多只适用于人形角色。注意:同一个节点位置下,同时最多只能存在一个模型对象,如果有上个对象则会解除上次绑定(并非销毁模型对象)。
补充:当模型对象被绑定后,想要【读写】位置、角度、缩放(
Pos | Angle | Scale
)等信息时,坐标空间默认为【本地空间】而不是“世界空间”。
function character.SetNodeExtend( node: int, model: Model )
null
,相当于解除绑定)//给玩家【手中的物体】附加一个红色的射灯(类似:红外线瞄准灯光) let chara = xxxxx; let model = Model.Create(1, chara.Pos); character.SetNodeExtend(2, model); model.Enum = 1; model.Color = Color(255, 0, 0); model.Range = 40; model.Intensity = 2;
节点位置(Node) | 说明 |
---|---|
0 | 头部(支持动物角色) |
1 | 身体(支持动物角色) |
2 | 手持物品(关键)、右手位置 |
4 | 左手位置 |
5 | 右手位置 |
6 | 左脚位置 |
7 | 右脚位置 |
解除绑定一个角色节点位置的模型对象(
Model
)。注意:解除绑定并不会销毁模型对象,只是将其解除与角色的绑定及位置同步关系。
function character.RemoveNodeExtend( node: int )
获取角色指定节点位置绑定的模型对象(
Model
),如果不存在绑定则返回null
。
function character.GetNodeExtend( node: int ): Model
获取角色指定节点位置的当前世界坐标,如果不存在节点则返回
Vector(0, 0, 0)
。
function character.GetNodeExtendPos( node: int ): Vector