角色系统 / Character
Character Class
角色
什么是角色?
角色是指代表玩家游戏实体。它是游戏中能够在虚拟世界中移动、与环境和其他角色进行交互的主要对象。可以将 Character 看作是游戏中的角色扮演者,它可以是玩家控制的角色或由游戏系统控制的角色。
角色具备哪些功能?
移动和交互。Character 具备在游戏世界中移动和与环境进行交互的能力。它可以行走、跑动、跳跃或飞行等,根据游戏规则和角色设计的不同, Character 可以执行各种动作。
功能和行为。Character 可以具备各种功能和行为。例如,一个角色可以是战士,具有攻击和防御技能;另一个角色可以是商人,负责交易和提供物品。 Character 的功能和行为由游戏开发者根据游戏需求进行定义和实现。
总的来说:
- 控制角色移动:你可以使用它来指定角色的移动速度、方向和加速度等参数。它允许你以编程的方式控制角色的运动,例如让角色向前移动、旋转或跳跃等。并支持多种移动方式:例如,它可以实现直线运动、旋转、跳跃、游泳、蹲伏和飞行等。根据你的游戏需求,你可以选择合适的移动方式,并使用对应接口来实现。
处理物理模拟与碰撞:它可以使用物理引擎来模拟角色的重力、碰撞和惯性等效果。通过物理模拟,角色可以与游戏世界中的其他对象进行交互,并受到合理的物理影响。执行碰撞检测:它可以检测角色与墙壁、地面或其他角色的碰撞,并采取相应的行动。这有助于实现更真实和可靠的角色移动和交互。
处理角色外观:可以给角色赋予各种各样的外貌。为角色选择合适的服装、装备和特征。无论是超级英雄的紧身服、中世纪骑士的盔甲还是未来战士的高科技装备,感受到角色的独特风格和个性。
实现生动的动画:还能赋予角色生动的动画效果。能够让角色在游戏中跳跃、奔跑、战斗,甚至是展现出各种特殊技能和动作。
其中比较重要的:
addMovement 函数控制角色沿着给定方向移动。
loadAnimation 函数将左侧动画资源加载在角色身上,使角色自如的使用多种动作。
description 属性更改角色外观,左侧栏中提供角色大量的衣服、饰品等资源,传入资源ID字符串进行随意更换外观。
ts
@Component
export default class NewExample extends Script {
protected onStart(): void {
GameObject.asyncSpawn<Model>("183107",{transform: new Transform(new Vector(100,0,0),new Rotation(0,0,0),new Vector(1,1,1))}).then(()=>{
console.log("233娘 success!");
});
}
}
@Component
export default class NewExample extends Script {
protected onStart(): void {
GameObject.asyncSpawn<Model>("183107",{transform: new Transform(new Vector(100,0,0),new Rotation(0,0,0),new Vector(1,1,1))}).then(()=>{
console.log("233娘 success!");
});
}
}
Hierarchy
↳
Character
Table of contents
Properties
onDescriptionChange: MulticastDelegate <OnDescriptionChange > |
---|
外观加载细节变化委托 |
onDescriptionComplete: MulticastDelegate <OnDescriptionComplete > |
角色外观加载完成时,调用委托 |
onStateChanged: MulticastDelegate <(prevState : CharacterStateType , currentState : CharacterStateType ) => void > |
角色状态改变回调 |
Accessors
brakingDecelerationFlying(): number |
---|
获取角色的飞行制动速率 |
brakingDecelerationSwimming(): number |
获取角色游泳制动速率| |
brakingDecelerationWalking(): number |
设置角色行走制动速率。| |
canJumpOutOfWater(): boolean |
获取角色是否可以跳出水面到陆地上 |
canStandOn(): boolean |
获取角色是否可以被其他玩家站立。| |
capsuleCorrectionEnabled(): boolean |
获取角色当前是否使用胶囊体修正| |
characterType(): CharacterType |
获取角色是什么类型| |
collisionExtent(): Vector |
获取包裹角色碰撞体的形状大小| |
collisionShape(): [CustomShapeType : CustomShapeType ](../enums/mw.CustomShapeType.md) |
获取角色碰撞形状(胶囊体型、球型、盒型)| |
collisionWithOtherCharacterEnabled(): boolean |
获取角色当前是否可以与其他角色产生碰撞。 |
complexMovementEnabled(): boolean |
是否启用复杂移动策略 |
crouchedHeight(): number |
获取角色下蹲状态下,碰撞盒的高度。 |
currentAnimation(): Animation |
当前播放的动画对象 |
currentStance(): Stance |
获取当前正在播放的基础姿态 |
currentSubStance(): SubStance |
获取当前正在播放的二级姿态,二级姿态类型为SubStance |
description(): CharacterDescription |
角色外观配置| |
displayName(): string |
获取角色名称| |
driftControl(): number |
获取角色在空中的灵活度| |
forceUpdateMovement(value : boolean ): void |
强制更新移动 |
gravityScale(): number |
获取重力的倍率| |
groundFriction(): number |
获取地面摩檫力 |
groundFrictionEnabled(): boolean |
获取单独制动摩擦状态| |
horizontalBrakingDecelerationFalling(): number |
获取角色下落制动速率| |
isCrouching(): boolean |
获取角色是否正在蹲下 |
isDescriptionReady(): boolean client |
获取当前角色外观是否准备完毕。| |
isJumping(): boolean |
获取角色是否正在跳跃 |
isMoving(): boolean |
获取角色是否正在移动 |
jumpMaxCount(): number |
获取角色最大可跳跃次数| |
maxAcceleration(): number |
获取角色最大加速度| |
maxFallingSpeed(): number |
设置角色最大下落速度| |
maxFlySpeed(): number |
获取角色最大飞行速度| |
maxJumpHeight(): number |
获取角色最大跳跃高度| |
maxStepHeight(): number |
获取角色最大可跨越高度| |
maxSwimSpeed(): number |
获取角色最大游泳速度| |
maxWalkSpeed(): number |
获取角色的最大行走速度| |
maxWalkSpeedCrouched(): number |
获取角色最大蹲伏行走速度 |
meshPositionOffset(): Vector |
获取mesh相对角色坐标点的偏移 |
meshRotationOffset(): Rotation |
获取mesh相对角色旋转的偏移 |
moveFacingDirection(): MoveFacingDirection |
获取角色运动面朝方向| |
movementDirection(): MovementDirection |
获取角色运动正方向| |
opacity(): number |
获取角色单层透明度 |
outOfWaterVerticalSpeed(): number |
出水时垂直方向速度 |
overheadUI(): UIWidget client |
获取角色头顶名字的界面 |
physicsEnabled(): boolean |
获取角色物理模拟状态 |
ragdollEnabled(): boolean |
启用布娃娃 |
rotateRate(): number |
获取角色最大转向速度| |
velocity(): Vector |
获取角色当前移动速度 |
walkableFloorAngle(): number |
获取角色可行走的最大角度| |
nameDisplayDistance(): number client |
获取当前客户端所有角色头顶显示名称可见距离。 |
nameVisible(): boolean client |
获取当前客户端所有角色头顶显示名称是否可见。 |
Methods
addImpulse(vector : Vector , ignoreMass? : boolean ): void server |
---|
添加冲量,相同冲量值在布娃娃与正常状态时,力效果会有差异。| |
addMovement(direction : Vector ): void |
沿着给定的方向向量添加移动输入| |
attachToSlot(gameObject : GameObject , slotName : HumanoidSlotType NonHumanoidSlotType ): void |
将物体附着到人物角色的指定插槽| |
cancelHeadFollow(): void client |
取消头部追踪 |
changeState(stateType : CharacterStateType ): void |
改变角色的状态 |
clearDescription(appearance? : boolean , slotAndDecoration? : boolean ): void |
清空角色外观数据| |
detachAllFromSlot(param? : Object ): void |
将角色插槽附着的对象全部分离| |
detachFromSlot(gameObject : GameObject ): void |
将物体从插槽中分离 |
getCenterVertexByMorphName(morphName : string ): Vector |
通过头部模型MorphName实时获取中心顶点位置 |
getCurrentState(): CharacterStateType |
获取当前角色的状态 |
getDescription(): CharacterDescription |
获取角色外观数据| |
getSlotWorldPosition(slotName : HumanoidSlotType ): Vector |
获取角色插槽的世界坐标| |
getVertexArrayByMorphName(morphName : string ): Vector [] |
通过头部模型MorphName实时获取所有顶点位置 |
getVertexPosition(index : number ): Vector |
通过头部模型顶点 index 实时获取顶点位置| |
headFollow(target : null GameObject Vector ): void client |
头部追踪 |
jump(): void |
使角色触发一个跳跃行为 |
loadAnimation(assetId : string ): Animation |
为角色加载一个动画资源。该接口会将给定的动画加载到角色上,返回一个可播放的Animation。 |
loadStance(assetId : string ): Stance |
为角色加载一个基础姿态| |
loadSubStance(assetId : string ): SubStance |
为角色加载一个二级姿态 |
setCollisionShapeAndExtent(shapeType : CustomShapeType , collisionExtent : Vector ): void |
为角色设置不同形状不同大小的碰撞体 |
setDescription(data : string string [] CharacterDescription ): void |
设置角色外观数据| |
setStateEnabled(characterStateType : CharacterStateType , enabled : boolean ): void |
设置角色状态开关 |
swimDown(speed : number ): void |
使角色在水中下潜| |
swimUp(speed : number ): void |
使角色在水中上浮| |
syncDescription(appearance? : boolean , slotAndDecoration? : boolean ): void client |
同步角色外观数据| |
click
Methods
setOutline(enabled : boolean , color? : LinearColor , width? : number ): void client |
---|
添加描边效果 |
setPostProcessOutline(enabled : boolean , color? : LinearColor , width? : number ): void client |
添加后处理描边 |
Properties
onDescriptionChange
• onDescriptionChange: MulticastDelegate
<OnDescriptionChange
>
外观加载细节变化委托
Precautions
当角色对象外观发生变化时执行绑定函数
ts
@Component
export default class Example_Character_OnDescriptionChange extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
@Component
export default class Example_Character_OnDescriptionChange extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
onDescriptionComplete
• onDescriptionComplete: MulticastDelegate
<OnDescriptionComplete
>
角色外观加载完成时,调用委托
Precautions
当角色对象外观加载完成时执行绑定函数
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色换装完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType:HumanoidSlotType.Hair});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色换装完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType:HumanoidSlotType.Hair});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
onStateChanged
• onStateChanged: MulticastDelegate
<(prevState
: CharacterStateType
, currentState
: CharacterStateType
) => void
>
角色状态改变回调 使用示例:按0-9,Z、X、C、V后查看打印
ts
@Component
export default class NewScript1 extends Script {
private character: Character;
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
Player.asyncGetLocalPlayer().then((player) => {
this.character = player.character;
this.character.onStateChanged.add((pre, curr)=>{
console.log(`pre: ${pre} curr: ${curr}`);
})
});
InputUtil.onKeyDown(Keys.Zero, ()=>{
this.character.changeState(CharacterStateType.None);
})
InputUtil.onKeyDown(Keys.One, ()=>{
this.character.changeState(CharacterStateType.Running);
})
InputUtil.onKeyDown(Keys.Two, ()=>{
this.character.changeState(CharacterStateType.Flying);
})
InputUtil.onKeyDown(Keys.Three, ()=>{
this.character.changeState(CharacterStateType.Swimming);
})
InputUtil.onKeyDown(Keys.Four, ()=>{
this.character.changeState(CharacterStateType.Jumping);
})
InputUtil.onKeyDown(Keys.Five, ()=>{
this.character.changeState(CharacterStateType.Freefall);
})
InputUtil.onKeyDown(Keys.Six, ()=>{
this.character.changeState(CharacterStateType.Ragdoll);
})
InputUtil.onKeyDown(Keys.Seven, ()=>{
this.character.changeState(CharacterStateType.GettingUp);
})
InputUtil.onKeyDown(Keys.Eight, ()=>{
this.character.changeState(CharacterStateType.Climbing);
})
InputUtil.onKeyDown(Keys.Nine, ()=>{
this.character.changeState(CharacterStateType.Crouching);
})
InputUtil.onKeyDown(Keys.Z, ()=>{
this.character.changeState(CharacterStateType.Pushed);
})
InputUtil.onKeyDown(Keys.X, ()=>{
this.character.changeState(CharacterStateType.Landed);
})
InputUtil.onKeyDown(Keys.C, ()=>{
this.character.changeState(CharacterStateType.Hit);
})
InputUtil.onKeyDown(Keys.V, ()=>{
this.character.changeState(CharacterStateType.Dead);
})
InputUtil.onKeyDown(Keys.E, ()=>{
console.log("currentState=="+this.character.getCurrentState());
})
InputUtil.onKeyDown(Keys.R, ()=>{
this.character.setStateEnabled(CharacterStateType.Flying, false);
})
}
}
@Component
export default class NewScript1 extends Script {
private character: Character;
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
Player.asyncGetLocalPlayer().then((player) => {
this.character = player.character;
this.character.onStateChanged.add((pre, curr)=>{
console.log(`pre: ${pre} curr: ${curr}`);
})
});
InputUtil.onKeyDown(Keys.Zero, ()=>{
this.character.changeState(CharacterStateType.None);
})
InputUtil.onKeyDown(Keys.One, ()=>{
this.character.changeState(CharacterStateType.Running);
})
InputUtil.onKeyDown(Keys.Two, ()=>{
this.character.changeState(CharacterStateType.Flying);
})
InputUtil.onKeyDown(Keys.Three, ()=>{
this.character.changeState(CharacterStateType.Swimming);
})
InputUtil.onKeyDown(Keys.Four, ()=>{
this.character.changeState(CharacterStateType.Jumping);
})
InputUtil.onKeyDown(Keys.Five, ()=>{
this.character.changeState(CharacterStateType.Freefall);
})
InputUtil.onKeyDown(Keys.Six, ()=>{
this.character.changeState(CharacterStateType.Ragdoll);
})
InputUtil.onKeyDown(Keys.Seven, ()=>{
this.character.changeState(CharacterStateType.GettingUp);
})
InputUtil.onKeyDown(Keys.Eight, ()=>{
this.character.changeState(CharacterStateType.Climbing);
})
InputUtil.onKeyDown(Keys.Nine, ()=>{
this.character.changeState(CharacterStateType.Crouching);
})
InputUtil.onKeyDown(Keys.Z, ()=>{
this.character.changeState(CharacterStateType.Pushed);
})
InputUtil.onKeyDown(Keys.X, ()=>{
this.character.changeState(CharacterStateType.Landed);
})
InputUtil.onKeyDown(Keys.C, ()=>{
this.character.changeState(CharacterStateType.Hit);
})
InputUtil.onKeyDown(Keys.V, ()=>{
this.character.changeState(CharacterStateType.Dead);
})
InputUtil.onKeyDown(Keys.E, ()=>{
console.log("currentState=="+this.character.getCurrentState());
})
InputUtil.onKeyDown(Keys.R, ()=>{
this.character.setStateEnabled(CharacterStateType.Flying, false);
})
}
}
Accessors
brakingDecelerationFlying
• | • | ||||
---|---|---|---|---|---|
获取角色的飞行制动速率 Returns
| 设置角色飞行制动速率 Parameters
|
ts
@Component
export default class Example_BrakingDecelerationFlying extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 加载喷射加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 0;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:键盘“1”,角色切换为飞行
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.switchToFlying();
});
// 添加一个按键方法:按下键盘“2”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Two, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放飞行动画,修改飞行速度和制动速度
boostAnimation.play();
myCharacter.maxFlySpeed = 2000;
myCharacter.brakingDecelerationFlying = 5000;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原飞行速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxFlySpeed = 500;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.addMovement(new Vector(0, 0, 5));
}, 1);
}
// 2秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxFlySpeed = 500;
boostAnimation.stop();
boostStance.stop();
}, 2000);
// 2.2秒后还原角色飞行制动速度
setTimeout(() => {
myCharacter.brakingDecelerationFlying = 300;
}, 2200);
});
}
}
}
@Component
export default class Example_BrakingDecelerationFlying extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 加载喷射加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 0;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:键盘“1”,角色切换为飞行
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.switchToFlying();
});
// 添加一个按键方法:按下键盘“2”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Two, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放飞行动画,修改飞行速度和制动速度
boostAnimation.play();
myCharacter.maxFlySpeed = 2000;
myCharacter.brakingDecelerationFlying = 5000;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原飞行速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxFlySpeed = 500;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.addMovement(new Vector(0, 0, 5));
}, 1);
}
// 2秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxFlySpeed = 500;
boostAnimation.stop();
boostStance.stop();
}, 2000);
// 2.2秒后还原角色飞行制动速度
setTimeout(() => {
myCharacter.brakingDecelerationFlying = 300;
}, 2200);
});
}
}
}
brakingDecelerationSwimming
• | • | ||||
---|---|---|---|---|---|
获取角色游泳制动速率 Returns
| 设置角色游泳制动速率 Parameters
|
ts
@Component
export default class Example_BrakingDecelerationSwimming extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 生成拱形容器并适配游泳区域
GameObject.spawn("WaterVolume",{transform: new Transform(new Vector(0, 0, 500), new Rotation(0, 0, 90), new Vector(20, 20, 10))});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let flag = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置游泳属性
myCharacter.canJumpOutOfWater = true;
myCharacter.outOfWaterVerticalSpeed = 100;
// 加载加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 10;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:按下键盘“1”,角色切换游泳 / 行走
InputUtil.onKeyDown(Keys.One, () => {
if(flag) {
myCharacter.switchToWalking();
} else {
myCharacter.switchToSwimming();
}
flag = !flag;
});
// 添加一个按键方法:按住键盘“2”,角色上浮
InputUtil.onKeyPress(Keys.Two, () => {
myCharacter.swimUp(10);
});
// 添加一个按键方法:按住键盘“3”,角色下潜
InputUtil.onKeyPress(Keys.Three, () => {
myCharacter.swimDown(10);
});
// 添加一个按键方法:按下键盘“4”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Four, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放游泳动画,修改游泳速度和制动速度
boostAnimation.play();
myCharacter.maxSwimSpeed = 600;
myCharacter.brakingDecelerationSwimming = 4096;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原游泳速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.swimUp(1)
}, 1);
}
// 1秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}, 1000);
// 1.2秒后还原角色游泳制动速度
setTimeout(() => {
myCharacter.brakingDecelerationSwimming = 4096
}, 1200);
});
}
}
}
@Component
export default class Example_BrakingDecelerationSwimming extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 生成拱形容器并适配游泳区域
GameObject.spawn("WaterVolume",{transform: new Transform(new Vector(0, 0, 500), new Rotation(0, 0, 90), new Vector(20, 20, 10))});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let flag = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置游泳属性
myCharacter.canJumpOutOfWater = true;
myCharacter.outOfWaterVerticalSpeed = 100;
// 加载加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 10;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:按下键盘“1”,角色切换游泳 / 行走
InputUtil.onKeyDown(Keys.One, () => {
if(flag) {
myCharacter.switchToWalking();
} else {
myCharacter.switchToSwimming();
}
flag = !flag;
});
// 添加一个按键方法:按住键盘“2”,角色上浮
InputUtil.onKeyPress(Keys.Two, () => {
myCharacter.swimUp(10);
});
// 添加一个按键方法:按住键盘“3”,角色下潜
InputUtil.onKeyPress(Keys.Three, () => {
myCharacter.swimDown(10);
});
// 添加一个按键方法:按下键盘“4”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Four, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放游泳动画,修改游泳速度和制动速度
boostAnimation.play();
myCharacter.maxSwimSpeed = 600;
myCharacter.brakingDecelerationSwimming = 4096;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原游泳速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.swimUp(1)
}, 1);
}
// 1秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}, 1000);
// 1.2秒后还原角色游泳制动速度
setTimeout(() => {
myCharacter.brakingDecelerationSwimming = 4096
}, 1200);
});
}
}
}
brakingDecelerationWalking
• | • | ||||
---|---|---|---|---|---|
设置角色行走制动速率。 Returns
| 设置角色行走制动速率 Precautions 仅在启用单独制动摩擦 groundFriction 时生效。 Parameters
|
ts
@Component
export default class Example_Braking extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 最大加速度为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,切换角色摩擦力的来源
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
@Component
export default class Example_Braking extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 最大加速度为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,切换角色摩擦力的来源
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
canJumpOutOfWater
• | • | ||||
---|---|---|---|---|---|
获取角色是否可以跳出水面到陆地上 Returns
| 设置角色是否可以跳出水面到陆地上 Parameters
|
ts
@Component
export default class CanJumpOutOfWater extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 生成拱形容器并适配游泳区域
GameObject.spawn("WaterVolume",{transform: new Transform(new Vector(0, 0, 500), new Rotation(0, 0, 90), new Vector(20, 20, 10))});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let flag = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置游泳属性
myCharacter.canJumpOutOfWater = true;
myCharacter.outOfWaterVerticalSpeed = 100;
// 加载加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 10;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:按下键盘“1”,角色切换游泳 / 行走
InputUtil.onKeyDown(Keys.One, () => {
if(flag) {
myCharacter.switchToWalking();
} else {
myCharacter.switchToSwimming();
}
flag = !flag;
});
// 添加一个按键方法:按住键盘“2”,角色上浮
InputUtil.onKeyPress(Keys.Two, () => {
myCharacter.swimUp(10);
});
// 添加一个按键方法:按住键盘“3”,角色下潜
InputUtil.onKeyPress(Keys.Three, () => {
myCharacter.swimDown(10);
});
// 添加一个按键方法:按下键盘“4”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Four, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放游泳动画,修改游泳速度和制动速度
boostAnimation.play();
myCharacter.maxSwimSpeed = 600;
myCharacter.brakingDecelerationSwimming = 4096;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原游泳速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.swimUp(1)
}, 1);
}
// 1秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}, 1000);
// 1.2秒后还原角色游泳制动速度
setTimeout(() => {
myCharacter.brakingDecelerationSwimming = 4096
}, 1200);
});
}
}
}
@Component
export default class CanJumpOutOfWater extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 生成拱形容器并适配游泳区域
GameObject.spawn("WaterVolume",{transform: new Transform(new Vector(0, 0, 500), new Rotation(0, 0, 90), new Vector(20, 20, 10))});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let flag = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置游泳属性
myCharacter.canJumpOutOfWater = true;
myCharacter.outOfWaterVerticalSpeed = 100;
// 加载加速动画
let boostAnimation = myCharacter.loadAnimation("53011");
boostAnimation.loop = 10;
let isBoost = false
// 加载上升姿态
let boostStance = myCharacter.loadSubStance("20307");
// 添加一个按键方法:按下键盘“1”,角色切换游泳 / 行走
InputUtil.onKeyDown(Keys.One, () => {
if(flag) {
myCharacter.switchToWalking();
} else {
myCharacter.switchToSwimming();
}
flag = !flag;
});
// 添加一个按键方法:按住键盘“2”,角色上浮
InputUtil.onKeyPress(Keys.Two, () => {
myCharacter.swimUp(10);
});
// 添加一个按键方法:按住键盘“3”,角色下潜
InputUtil.onKeyPress(Keys.Three, () => {
myCharacter.swimDown(10);
});
// 添加一个按键方法:按下键盘“4”,角色进行喷射加速
InputUtil.onKeyDown(Keys.Four, () => {
if(isBoost) return;
let boost_interval = 0;
if(myCharacter.isMoving) {
// 播放游泳动画,修改游泳速度和制动速度
boostAnimation.play();
myCharacter.maxSwimSpeed = 600;
myCharacter.brakingDecelerationSwimming = 4096;
// 设置加速周期,每帧检查角色是否移动,当角色停止移动时,执行停止加速操作:停止动画清除姿态,还原游泳速度,清除加速周期
boost_interval = setInterval(() => {
if(!myCharacter.isMoving) {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}
}, 1);
// 如果当前角色静止,修改角色为上升姿态,设置加速周期,每帧上升5个单位
} else {
boostStance.play();
boost_interval = setInterval(() => {
myCharacter.swimUp(1)
}, 1);
}
// 1秒后执行停止加速操作
setTimeout(() => {
isBoost = false;
clearInterval(boost_interval);
myCharacter.maxSwimSpeed = 300;
boostAnimation.stop();
boostStance.stop();
}, 1000);
// 1.2秒后还原角色游泳制动速度
setTimeout(() => {
myCharacter.brakingDecelerationSwimming = 4096
}, 1200);
});
}
}
}
canStandOn
• | • | ||||
---|---|---|---|---|---|
获取角色是否可以被其他玩家站立。 Returns
| 设置角色是否可以被其他玩家站立。 Parameters
|
ts
@Component
export default class Example_Character_CanStandOn extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
@Component
export default class Example_Character_CanStandOn extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
capsuleCorrectionEnabled
• | • | ||||
---|---|---|---|---|---|
获取角色当前是否使用胶囊体修正 Returns
| 设置角色当前是否使用胶囊体修正 Parameters
|
ts
@Component
export default class Example_Character_CapsuleCorrectionEnabled extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
@Component
export default class Example_Character_CapsuleCorrectionEnabled extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
characterType
• | ||
---|---|---|
获取角色是什么类型 Returns
|
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
collisionExtent
• | • | ||||
---|---|---|---|---|---|
获取包裹角色碰撞体的形状大小 Returns
| 设置包裹角色碰撞体的形状大小 Parameters
|
ts
@Component
export default class Example_Character_CollisionExtent extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
@Component
export default class Example_Character_CollisionExtent extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
collisionShape
• | • | ||||
---|---|---|---|---|---|
获取角色碰撞形状(胶囊体型、球型、盒型) Returns
| 设置角色碰撞形状(胶囊体型、球型、盒型) Parameters
|
ts
@Component
export default class Example_Character_CollisionShape extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
@Component
export default class Example_Character_CollisionShape extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
collisionWithOtherCharacterEnabled
• | • | ||||
---|---|---|---|---|---|
获取角色当前是否可以与其他角色产生碰撞。 Precautions true表示角色可以与其他角色碰撞,false表示角色不能与其他角色产生碰撞。 Returns
| 设置角色当前是否可以与其他角色产生碰撞。 Parameters
|
ts
@Component
export default class Example_Character_CollisionWithOtherCharacterEnabled extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
@Component
export default class Example_Character_CollisionWithOtherCharacterEnabled extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成拱门带碰撞的拱门
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 设置角色碰撞属性和跳跃属性
myCharacter.capsuleCorrectionEnabled = true;
myCharacter.maxJumpHeight = 250;
let NPC = Player.spawnDefaultCharacter();
NPC.worldTransform.position = new Vector(0, 100, 100);
// 添加一个按键方法:按下键盘“1”,开启/关闭NPC与其他角色的碰撞
InputUtil.onKeyDown(Keys.One, () => {
NPC.collisionWithOtherCharacterEnabled = !NPC.collisionWithOtherCharacterEnabled;
console.log("NPC与角色的碰撞 " + NPC.collisionWithOtherCharacterEnabled);
});
// 添加一个按键方法:按下键盘“2”,开启/关闭角色是否可被站立
InputUtil.onKeyDown(Keys.Two, () => {
NPC.canStandOn = !NPC.canStandOn;
console.log("NPC角色可被站立 " + NPC.canStandOn);
});
// 添加一个按键方法:按下键盘“3”,修改角色碰撞并打印结果
InputUtil.onKeyDown(Keys.Three, () => {
// 碰撞范围collisionExtent内部值全是半值,半径半高半长
myCharacter.setCollisionShapeAndExtent(CustomShapeType.Box, new Vector(50, 50, 200));
console.log("当前角色碰撞 " + myCharacter.collisionShape + " " + myCharacter.collisionExtent);
});
}
}
}
complexMovementEnabled
• | • | ||||
---|---|---|---|---|---|
是否启用复杂移动策略 Returns
| 是否启用复杂移动策略 Parameters
|
crouchedHeight
• | • | ||||
---|---|---|---|---|---|
获取角色下蹲状态下,碰撞盒的高度。 Returns
| 设置角色下蹲状态下,碰撞盒的高度。 Parameters
|
ts
@Component
export default class Example_Character_CrouchedHeight extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成草丛和拱门
GameObject.spawn("54834",{transform: new Transform(new Vector(300, 0, 0), Rotation.zero, new Vector(2, 2, 2))});
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 生成触发器并添加委托函数:进入触发器的角色蹲下,离开触发器站起
let tri = GameObject.spawn("Trigger",{transform: new Transform(new Vector(300, 0, 50), Rotation.zero, new Vector(2, 2, 1))}) as Trigger;
tri.onEnter.add((character: Character) => {
character.crouch(true);
setTimeout(() => {
console.log("当前角色下蹲 " + character.isCrouching);
}, 500);
});
tri.onLeave.add((character: Character) => {
character.crouch(false);
console.log("当前角色下蹲 " + character.isCrouching);
});
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 地面蹲伏行走时的最大移动速度100
myCharacter.maxWalkSpeedCrouched = 100;
// 下蹲后高度为100
myCharacter.crouchedHeight = 100;
// 添加一个按键方法:按下键盘“1”,启用/禁用下蹲能力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.crouchEnabled = !myCharacter.crouchEnabled;
console.log("当前角色是否能下蹲 " + myCharacter.crouchEnabled);
});
}
}
}
@Component
export default class Example_Character_CrouchedHeight extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成草丛和拱门
GameObject.spawn("54834",{transform: new Transform(new Vector(300, 0, 0), Rotation.zero, new Vector(2, 2, 2))});
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 生成触发器并添加委托函数:进入触发器的角色蹲下,离开触发器站起
let tri = GameObject.spawn("Trigger",{transform: new Transform(new Vector(300, 0, 50), Rotation.zero, new Vector(2, 2, 1))}) as Trigger;
tri.onEnter.add((character: Character) => {
character.crouch(true);
setTimeout(() => {
console.log("当前角色下蹲 " + character.isCrouching);
}, 500);
});
tri.onLeave.add((character: Character) => {
character.crouch(false);
console.log("当前角色下蹲 " + character.isCrouching);
});
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 地面蹲伏行走时的最大移动速度100
myCharacter.maxWalkSpeedCrouched = 100;
// 下蹲后高度为100
myCharacter.crouchedHeight = 100;
// 添加一个按键方法:按下键盘“1”,启用/禁用下蹲能力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.crouchEnabled = !myCharacter.crouchEnabled;
console.log("当前角色是否能下蹲 " + myCharacter.crouchEnabled);
});
}
}
}
currentAnimation
• | ||
---|---|---|
当前播放的动画对象 Returns
|
currentStance
• | ||
---|---|---|
获取当前正在播放的基础姿态 Returns
|
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 给角色加载一个二次元男性基础姿态
let animeManStance = myCharacter.loadStance("234423");
console.log("animeManStance assetId " + animeManStance.assetId);
// 给角色加载一个二次元女性基础姿态(默认),关闭瞄准偏移
let animeWomanStance = myCharacter.loadStance("216081");
animeWomanStance.aimOffsetEnabled = false;
console.log("animeWomanStance assetId " + animeWomanStance.assetId);
// 添加一个按键方法:按下键盘“1”,切换播放二次元男性基础姿态和二次元女性基础姿态
InputUtil.onKeyDown(Keys.One, () => {
if(myCharacter.currentStance == animeWomanStance) {
animeManStance.play();
// 开启瞄准偏移
animeManStance.aimOffsetEnabled = true;
} else {
animeWomanStance.play();
// 关闭瞄准偏移
animeWomanStance.aimOffsetEnabled = false;
}
});
// 添加一个按键方法:按下键盘“2”,停止播放基础姿态
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.currentStance) {
myCharacter.currentStance.stop();
}
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 给角色加载一个二次元男性基础姿态
let animeManStance = myCharacter.loadStance("234423");
console.log("animeManStance assetId " + animeManStance.assetId);
// 给角色加载一个二次元女性基础姿态(默认),关闭瞄准偏移
let animeWomanStance = myCharacter.loadStance("216081");
animeWomanStance.aimOffsetEnabled = false;
console.log("animeWomanStance assetId " + animeWomanStance.assetId);
// 添加一个按键方法:按下键盘“1”,切换播放二次元男性基础姿态和二次元女性基础姿态
InputUtil.onKeyDown(Keys.One, () => {
if(myCharacter.currentStance == animeWomanStance) {
animeManStance.play();
// 开启瞄准偏移
animeManStance.aimOffsetEnabled = true;
} else {
animeWomanStance.play();
// 关闭瞄准偏移
animeWomanStance.aimOffsetEnabled = false;
}
});
// 添加一个按键方法:按下键盘“2”,停止播放基础姿态
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.currentStance) {
myCharacter.currentStance.stop();
}
});
}
}
}
currentSubStance
• | ||
---|---|---|
获取当前正在播放的二级姿态,二级姿态类型为SubStance Returns
|
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 给角色加载仅上半身瞄准姿态
let aimStance = myCharacter.loadSubStance("94261");
aimStance.blendMode = StanceBlendMode.BlendUpper;
console.log("aimStance assetId " + aimStance.assetId);
// 给角色加载仅下半身踢腿姿态
let kickStance = myCharacter.loadSubStance("14520");
kickStance.blendMode = StanceBlendMode.BlendLower;
console.log("kickStance assetId " + kickStance.assetId);
// 添加一个按键方法:按下键盘“1”,切换播放瞄准姿态和踢腿姿态
InputUtil.onKeyDown(Keys.One, () => {
if(myCharacter.currentSubStance == aimStance) {
kickStance.play();
} else {
aimStance.play();
}
});
// 添加一个按键方法:按下键盘“2”,停止播放姿态
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.currentSubStance) {
myCharacter.currentSubStance.stop();
}
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 给角色加载仅上半身瞄准姿态
let aimStance = myCharacter.loadSubStance("94261");
aimStance.blendMode = StanceBlendMode.BlendUpper;
console.log("aimStance assetId " + aimStance.assetId);
// 给角色加载仅下半身踢腿姿态
let kickStance = myCharacter.loadSubStance("14520");
kickStance.blendMode = StanceBlendMode.BlendLower;
console.log("kickStance assetId " + kickStance.assetId);
// 添加一个按键方法:按下键盘“1”,切换播放瞄准姿态和踢腿姿态
InputUtil.onKeyDown(Keys.One, () => {
if(myCharacter.currentSubStance == aimStance) {
kickStance.play();
} else {
aimStance.play();
}
});
// 添加一个按键方法:按下键盘“2”,停止播放姿态
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.currentSubStance) {
myCharacter.currentSubStance.stop();
}
});
}
}
}
description
• | ||
---|---|---|
角色外观配置 Returns
|
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
displayName
• | • | ||||
---|---|---|---|---|---|
获取角色名称 Returns
| 设置角色名称 Parameters
|
ts
@Component
export default class Example_Character extends Script {
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let names = ["Cali", "Lily", "Emmie"];
let index = 0;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 打印本地玩家控制的character对象的guid和名字
console.log("My character: " + myPlayer.character.gameObjectId + " " + myPlayer.character.displayName);
// 添加一个按键方法:按下键盘“1”,切换角色显示名称
InputUtil.onKeyDown(Keys.One, () => {
myPlayer.character.displayName = names[index % 3];
index++;
});
}
}
}
@Component
export default class Example_Character extends Script {
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
let names = ["Cali", "Lily", "Emmie"];
let index = 0;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 打印本地玩家控制的character对象的guid和名字
console.log("My character: " + myPlayer.character.gameObjectId + " " + myPlayer.character.displayName);
// 添加一个按键方法:按下键盘“1”,切换角色显示名称
InputUtil.onKeyDown(Keys.One, () => {
myPlayer.character.displayName = names[index % 3];
index++;
});
}
}
}
driftControl
• | • | ||||
---|---|---|---|---|---|
获取角色在空中的灵活度 Returns
| 设置角色在空中的灵活度 Parameters
|
ts
@Component
export default class Example_DriftControl extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
@Component
export default class Example_DriftControl extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
forceUpdateMovement
• | ||
---|---|---|
强制更新移动 Precautions 角色当前是否启用强制更新移动,true表示角色会因碰撞被动位移,false表示角色不会因碰撞被动位移。 Parameters
|
ts
@Component
export default class Example_Character extends Script {
// 声明变量
cube: GameObject;
stride: Vector;
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
this.useUpdate = true;
// 移动步长:Y轴单位距离
this.stride = new Vector(-2, 0, 0);
// 在前方生成一个立方体,并在onUpdate里左右移动
let spawnTransform = new Transform(new Vector(300, 0, 0), Rotation.zero, Vector.one);
this.cube = GameObject.spawn("197386",{transform: spawnTransform});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 添加一个按键方法:按下键盘“1”,启用/禁用【强制更新移动】
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.forceUpdateMovement = !myCharacter.forceUpdateMovement;
console.log("当前角色是否强制更新移动: "+ myCharacter.forceUpdateMovement);
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 当立方体不为空时按步长每帧更新立方体世界坐标(左右移动)
if(this.cube) {
this.cube.worldTransform.position = this.cube.worldTransform.position.add(this.stride);
// 当立方体y轴世界坐标绝对值超过1000时,步长取反
if(Math.abs(this.cube.worldTransform.position.x) > 500) {
this.stride.multiply(-1);
}
}
}
}
}
@Component
export default class Example_Character extends Script {
// 声明变量
cube: GameObject;
stride: Vector;
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
this.useUpdate = true;
// 移动步长:Y轴单位距离
this.stride = new Vector(-2, 0, 0);
// 在前方生成一个立方体,并在onUpdate里左右移动
let spawnTransform = new Transform(new Vector(300, 0, 0), Rotation.zero, Vector.one);
this.cube = GameObject.spawn("197386",{transform: spawnTransform});
}
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 添加一个按键方法:按下键盘“1”,启用/禁用【强制更新移动】
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.forceUpdateMovement = !myCharacter.forceUpdateMovement;
console.log("当前角色是否强制更新移动: "+ myCharacter.forceUpdateMovement);
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在服务端执行
if(SystemUtil.isServer()) {
// 当立方体不为空时按步长每帧更新立方体世界坐标(左右移动)
if(this.cube) {
this.cube.worldTransform.position = this.cube.worldTransform.position.add(this.stride);
// 当立方体y轴世界坐标绝对值超过1000时,步长取反
if(Math.abs(this.cube.worldTransform.position.x) > 500) {
this.stride.multiply(-1);
}
}
}
}
}
gravityScale
• | • | ||||
---|---|---|---|---|---|
获取重力的倍率 Returns
| 设置重力的倍率 Parameters
|
ts
@Component
export default class Example_Character_GravityScale extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
@Component
export default class Example_Character_GravityScale extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
groundFriction
• | • | ||||
---|---|---|---|---|---|
获取地面摩檫力 Returns
| 设置地面摩檫力 Precautions 角色在地面上受到的摩擦力大小。在开启单独制动摩擦 groundFriction 时该值不生效。 Parameters
|
ts
@Component
export default class Example_GroundFriction extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 行走制动速率为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,启用/禁用地面摩擦力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
@Component
export default class Example_GroundFriction extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 行走制动速率为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,启用/禁用地面摩擦力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
groundFrictionEnabled
• | • | ||||
---|---|---|---|---|---|
获取单独制动摩擦状态 Returns
| 设置单独制动摩擦状态 Parameters
|
ts
@Component
export default class Example_GroundFriction extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 行走制动速率为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,启用/禁用地面摩擦力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
@Component
export default class Example_GroundFriction extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
this.useUpdate = true;
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大加速度为原来的0.1倍
myCharacter.maxAcceleration = 0.1 * myCharacter.maxAcceleration;
// 最大转向速度为原来的0.5倍
myCharacter.rotateRate = 0.5 * myCharacter.rotateRate;
// 最大行走速度为原来的2倍
myCharacter.maxWalkSpeed = 2 * myCharacter.maxWalkSpeed;
// 行走制动速率为原来的0.1倍
myCharacter.brakingDecelerationWalking = 0.1 * myCharacter.brakingDecelerationWalking;
myCharacter.groundFriction = 1;
// 添加一个按键方法:按下键盘“1”,启用/禁用地面摩擦力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.groundFrictionEnabled = !myCharacter.groundFriction;
});
}
}
// 周期函数每帧执行,此函数执行需要将this.useUpdate赋值为true,dt是当前帧与上一帧的延迟(秒)
protected onUpdate(dt: number): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 如果角色正在移动,打印角色的移动速度
if(myCharacter.isMoving) {
console.log("当前角色速度:" + myCharacter.velocity);
}
}
}
}
horizontalBrakingDecelerationFalling
• | • | ||||
---|---|---|---|---|---|
获取角色下落制动速率 Returns
| 设置角色下落制动速率 Parameters
|
ts
@Component
export default class Example_HorizontalBrakingDecelerationFalling extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
@Component
export default class Example_HorizontalBrakingDecelerationFalling extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 最大下落速度为1024
myCharacter.maxFallingSpeed = 1024;
// 下落制动速率为10
myCharacter.horizontalBrakingDecelerationFalling = 10;
// 按地面移动速率的0.1倍控制下落过程
myCharacter.driftControl = 0.1;
// 10倍重力
myCharacter.gravityScale = 10;
// 添加一个按键方法:按下键盘“1”,角色设置跳跃高度为1000后跳跃。
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.maxJumpHeight = 1000;
myCharacter.jump();
});
}
}
}
isCrouching
• | ||
---|---|---|
获取角色是否正在蹲下 Returns
|
ts
@Component
export default class Example_Character_IsCrouching extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成草丛和拱门
GameObject.spawn("54834",{transform: new Transform(new Vector(300, 0, 0), Rotation.zero, new Vector(2, 2, 2))});
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 生成触发器并添加委托函数:进入触发器的角色蹲下,离开触发器站起
let tri = GameObject.spawn("Trigger",{transform: new Transform(new Vector(300, 0, 50), Rotation.zero, new Vector(2, 2, 1))}) as Trigger;
tri.onEnter.add((character: Character) => {
character.crouch(true);
setTimeout(() => {
console.log("当前角色下蹲 " + character.isCrouching);
}, 500);
});
tri.onLeave.add((character: Character) => {
character.crouch(false);
console.log("当前角色下蹲 " + character.isCrouching);
});
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 地面蹲伏行走时的最大移动速度100
myCharacter.maxWalkSpeedCrouched = 100;
// 下蹲后高度为100
myCharacter.crouchedHeight = 100;
// 添加一个按键方法:按下键盘“1”,启用/禁用下蹲能力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.crouchEnabled = !myCharacter.crouchEnabled;
console.log("当前角色是否能下蹲 " + myCharacter.crouchEnabled);
});
}
}
}
@Component
export default class Example_Character_IsCrouching extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 生成草丛和拱门
GameObject.spawn("54834",{transform: new Transform(new Vector(300, 0, 0), Rotation.zero, new Vector(2, 2, 2))});
let arch = GameObject.spawn("36851",{transform: new Transform(new Vector(300, 210, 0), new Rotation(0, 0, 90), new Vector(2, 1, 2))}) as Model;
arch.setCollision(CollisionStatus.On);
// 生成触发器并添加委托函数:进入触发器的角色蹲下,离开触发器站起
let tri = GameObject.spawn("Trigger",{transform: new Transform(new Vector(300, 0, 50), Rotation.zero, new Vector(2, 2, 1))}) as Trigger;
tri.onEnter.add((character: Character) => {
character.crouch(true);
setTimeout(() => {
console.log("当前角色下蹲 " + character.isCrouching);
}, 500);
});
tri.onLeave.add((character: Character) => {
character.crouch(false);
console.log("当前角色下蹲 " + character.isCrouching);
});
// 获取当前客户端的玩家(自己)
let myPlayer = Player.localPlayer;
// 获取当前玩家控制的角色
let myCharacter = myPlayer.character;
// 地面蹲伏行走时的最大移动速度100
myCharacter.maxWalkSpeedCrouched = 100;
// 下蹲后高度为100
myCharacter.crouchedHeight = 100;
// 添加一个按键方法:按下键盘“1”,启用/禁用下蹲能力
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.crouchEnabled = !myCharacter.crouchEnabled;
console.log("当前角色是否能下蹲 " + myCharacter.crouchEnabled);
});
}
}
}
isDescriptionReady
• | ||
---|---|---|
获取当前角色外观是否准备完毕。 Returns
|
ts
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2;
// 修改角色style化妆:腮红为75674
myCharacter.description.advance.makeup.blush.blushStyle = "75674";
// 修改角色style头发:前发为57731,后发为63910
myCharacter.description.advance.hair.frontHair.style = "57731";
myCharacter.description.advance.hair.backHair.style = "63910";
// 修改角色style:上衣为58694,下衣为58700,手套为60384,鞋子为58696
myCharacter.description.advance.clothing.upperCloth.style = "58694";
myCharacter.description.advance.clothing.lowerCloth.style = "58700";
myCharacter.description.advance.clothing.gloves.style = "60384";
myCharacter.description.advance.clothing.shoes.style = "58696";
}
});
// 添加一个按键方法:按下键盘“3”,同步角色外观
InputUtil.onKeyDown(Keys.Three, () => {
myCharacter.syncDescription();
});
// 添加一个按键方法:按下键盘“4”,清空角色外观
InputUtil.onKeyDown(Keys.Four, () => {
myCharacter.clearDescription();
});
}
}
}
@Component
export default class Example_Character extends Script {
// 当脚本被实例后,会在第一帧更新前调用此函数
protected onStart(): void {
// 下列代码仅在客户端执行
if(SystemUtil.isClient()) {
// 获取当前客户端玩家
let myPlayer = Player.localPlayer;
// 获取玩家控制角色
let myCharacter = myPlayer.character;
// 如果玩家外观准备完成挥手,反之摊手
if(myCharacter.isDescriptionReady) {
let animation = myCharacter.loadAnimation("35391");
animation.play();
} else {
let animation = myCharacter.loadAnimation("14521");
animation.play();
}
let defaultStyle = null;
// 给【角色外观描述完成】委托添加函数
myCharacter.onDescriptionComplete.add(() => {
// 播放换装完成特效
EffectService.playOnGameObject("161245", myCharacter, {slotType: HumanoidSlotType.Root});
// 获取角色默认外观风格
if(defaultStyle == null) {
defaultStyle = myCharacter.getDescription();
}
});
// 给【角色外观描述变化】委托添加函数
myCharacter.onDescriptionChange.add((operationCode: number, index: number, value: unknown) => {
console.log("Appearance Changed");
console.log("OperationCode " + operationCode + " Index " + index);
});
// 添加一个按键方法:按下键盘“1”,重置为默认角色外观
InputUtil.onKeyDown(Keys.One, () => {
myCharacter.setDescription(defaultStyle);
});
// 添加一个按键方法:按下键盘“2”,修改角色外观
InputUtil.onKeyDown(Keys.Two, () => {
if(myCharacter.characterType == CharacterType.HumanoidV2) {
// 修改角色style头部:头大小为1.5倍
myCharacter.description.advance.headFeatures.head.headOverallScale = 1.5;
// 修改角色style体型:身高为1.2倍
myCharacter.description.advance.bodyFeatures.body.height = 1.2