角色基础功能
阅读本文大概需要 30 分钟
本文概述了角色的所有基础属性,以及如何在编辑器中,修改角色的基础属性,制作出主角的各种能力。
什么是角色?
- 角色是具有一套行为能力的模型。游戏世界中,角色分为非玩家角色和玩家角色。
- 【玩家角色】:由玩家控制的角色,大部分的玩家角色都是游戏剧情的关键或是主角。本篇主要讲解如何设置玩家角色的属性与功能。
- 【非玩家角色】:非玩家角色也被称为 NPC,指的是在游戏中不受真人玩家控制的游戏角色。NPC 一般由计算机人工智能控制,拥有一套行为模式的角色。NPC 通常分为剧情 NPC,战斗 NPC,服务 NPC 以及兼具多种功能的 NPC 等。
如何设置角色属性?
方式一 :面板设置
在对象管理器中的【世界】对象中,找到并点击【角色】对象后,即可通过属性面板编辑角色的默认属性。
方式二 :脚本设置
通过脚本挂在到对象管理器的对象中,实现动态修改角色属性。
下面我们会根据角色的各个属性,介绍其属性作用,以及如何动态修改角色属性。
角色属性
基础属性
是否可移动
属性说明:控制玩家移动的属性,关闭后角色将无法移动。
实际应用:我们可以利用触发器对象,制作一个小范围的陷阱。角色进入陷阱时,导致角色眩晕1秒,眩晕期间无法移动,并播放眩晕特效。当然禁锢类型的技能效果也是如此。
实现步骤:
首先我们将触发器对象放置在场景中
然后触发器对象下挂载以下脚本,即可实现一个限制移动的陷阱。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//角色进入陷阱触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色禁止移动
chara.movementEnabled = false;
// 新增眩晕特效
let effect = GameObject.spawn("142935",{replicates: true}) as Effect;
//将眩晕特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//将眩晕特效进行相对位置的偏移
effect.localTransform.position = new Vector(0, 0, 170)
//播放眩晕特效
effect.play();
//加载眩晕动作
let dizzyAnimation = chara.loadAnimation("53005");
//播放眩晕动作
dizzyAnimation.play();
//1秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色可以移动
chara.movementEnabled = true;
//移除头顶眩晕特效
effect.destroy()
//停止播放眩晕动作
dizzyAnimation.stop();
}
}, 1000);
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//角色进入陷阱触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色禁止移动
chara.movementEnabled = false;
// 新增眩晕特效
let effect = GameObject.spawn("142935",{replicates: true}) as Effect;
//将眩晕特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//将眩晕特效进行相对位置的偏移
effect.localTransform.position = new Vector(0, 0, 170)
//播放眩晕特效
effect.play();
//加载眩晕动作
let dizzyAnimation = chara.loadAnimation("53005");
//播放眩晕动作
dizzyAnimation.play();
//1秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色可以移动
chara.movementEnabled = true;
//移除头顶眩晕特效
effect.destroy()
//停止播放眩晕动作
dizzyAnimation.stop();
}
}, 1000);
});
}
}
最后需要将脚本中利用到的GUID为【142935】和【53005】的资源放置在优先加载的列表,中即可实现效果。
效果图:
地面最大速度
属性说明:角色在地面移动时,角色可达到的最大移动速度。
实际应用:我们可以利用触发器对象,制作一个加速区域或者减速区域。当角色进入区域时,使角色获得5秒加速或者获得5秒减速。后续我们在制作跑酷类型的游戏时,可以合理利用此功能进行设计游戏玩法。
首先我们将触发器对象放置在场景中
然后触发器对象下挂载以下脚本,即可实现一个加速区域。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色的地面最大速度将变为900
chara.maxWalkSpeed = 900;
//加载疾跑动作
let runAnimation = chara.loadAnimation("29722");
//播放疾跑动作
runAnimation.play();
// 新增疾跑特效
let effect = GameObject.spawn("153604",{replicates: true}) as Effect;
//将疾跑特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//将疾跑特效进行相对位置的偏移
effect.localTransform = new Transform((new Vector(0, 0, 90)),new Rotation(90, 0, -90),new Vector(1, 1, 1));
//播放疾跑特效
effect.play();
//2秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色移动模式切换为地面行走
chara.switchToWalking();
//角色的地面最大速度恢复为450
chara.maxWalkSpeed = 450;
}
}, 2000);
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色的地面最大速度将变为900
chara.maxWalkSpeed = 900;
//加载疾跑动作
let runAnimation = chara.loadAnimation("29722");
//播放疾跑动作
runAnimation.play();
// 新增疾跑特效
let effect = GameObject.spawn("153604",{replicates: true}) as Effect;
//将疾跑特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//将疾跑特效进行相对位置的偏移
effect.localTransform = new Transform((new Vector(0, 0, 90)),new Rotation(90, 0, -90),new Vector(1, 1, 1));
//播放疾跑特效
effect.play();
//2秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色移动模式切换为地面行走
chara.switchToWalking();
//角色的地面最大速度恢复为450
chara.maxWalkSpeed = 450;
}
}, 2000);
});
}
}
最后需要将脚本中利用到的GUID为【29722】和【153604】的资源放置在优先加载的列表,中即可实现效果。
效果图:
换个脚本,并将脚本中利用到的GUID为【142933】的资源放置在优先加载的列表,即可实现一个减速区域。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色的地面最大速度将变为100
chara.maxWalkSpeed = 100;
// 新增减速特效
let effect = GameObject.spawn("142933",{replicates: true}) as Effect;
//将减速特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//播放减速特效
effect.play();
//2秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色移动模式切换为地面行走
chara.switchToWalking();
//角色的地面最大速度恢复为450
chara.maxWalkSpeed = 450;
//移除减速特效
effect.destroy()
}
}, 2000);
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
//角色的地面最大速度将变为100
chara.maxWalkSpeed = 100;
// 新增减速特效
let effect = GameObject.spawn("142933",{replicates: true}) as Effect;
//将减速特效插到角色根节点处
chara.attachToSlot(effect, HumanoidSlotType.Root);
//播放减速特效
effect.play();
//2秒后触发以下逻辑
setTimeout(() => {
if (chara) {
//角色移动模式切换为地面行走
chara.switchToWalking();
//角色的地面最大速度恢复为450
chara.maxWalkSpeed = 450;
//移除减速特效
effect.destroy()
}
}, 2000);
});
}
}
效果图:
最大加速度
属性说明:角色移动时,角色会根据最大加速度进行提速,逐渐达到角色的地面最大速度。
举例说明:在两个角色的地面最大速度相同时,最大加速度较快的角色会先达到最大速度。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//设置角色最大加速度 = 1000;
chara.maxAcceleration = 1000;
//声明角色
let chara = Player.localPlayer.character
//设置角色最大加速度 = 1000;
chara.maxAcceleration = 1000;
不可跨越高度
属性说明:角色跨越台阶时,台阶的最大高度 ,大于等于该高度角色均无法跨越。
举例说明:当角色上楼梯时,可以直接走上去,当角色上比较高的石墩时,无法直接走上去。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色不可跨越高度 = 200;
chara.maxStepHeight = 200;
//声明角色
let chara = Player.localPlayer.character
//角色不可跨越高度 = 200;
chara.maxStepHeight = 200;
示意图:
最大站稳角度
属性说明:角色站立在斜坡上时,斜坡的最大角度,超过该角度,角色将无法站立在这个斜坡上,角色会存在坠落的表现。
数值范围:0-90。
举例说明:当角色走上斜坡时,斜坡角度过大,角色将无法在斜坡上站稳,而滑落下来。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色最大站稳角度 = 60;
chara.walkableFloorAngle = 60;
//声明角色
let chara = Player.localPlayer.character
//角色最大站稳角度 = 60;
chara.walkableFloorAngle = 60;
示意图:
最大转向速度
属性说明:角色每秒旋转的最大速度
举例说明:当角色接到指令进行转向时,会根据转向速度进行旋转。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色最大转向速度 = 100;
chara.rotateRate = 100;
//声明角色
let chara = Player.localPlayer.character
//角色最大转向速度 = 100;
chara.rotateRate = 100;
示意图:
运动面朝方向
属性说明:主角模型的面部朝向。
运动面朝方向包括:始终朝向移动方向、始终朝向目标方向、始终朝向控制器方向。
举例说明:
始终朝向移动方向
- 主角模型面朝方向始终朝向移动方向,例如角色向后移动,角色模型会立马转身面朝后方进行移动,注意摄像机转向不会影响角色的面朝方向。
始终朝向目标方向
- 主角模型面朝方向始终朝向目标方向,例如角色向后移动,但目标在前方,则角色模型会面朝前方倒退的方式进行移动。
始终朝向控制器
- 主角模型面朝方向始终朝向控制器,例如用户滑动了摄像机,主角模型的朝向会跟随摄像机方向进行旋转,换而言之摄像机朝向与主角模型朝向保持一致
示例脚本:
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//运动面朝方向为运动方向
chara.moveFacingDirection = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//运动面朝方向为目标方向
chara.moveFacingDirection = 1;
});
//点击按键3触发以下逻辑
InputUtil.onKeyDown(Keys.Three, () => {
//运动面朝方向为控制器方向
chara.moveFacingDirection = 2;
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//运动面朝方向为运动方向
chara.moveFacingDirection = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//运动面朝方向为目标方向
chara.moveFacingDirection = 1;
});
//点击按键3触发以下逻辑
InputUtil.onKeyDown(Keys.Three, () => {
//运动面朝方向为控制器方向
chara.moveFacingDirection = 2;
});
}
}
运动时依据的正方向
属性说明:角色模型移动时,依据的前进方向。
运动时依据的正方向包括:以定轴方向、以视线方向、以控制器方向。
举例说明:
以定轴方向
- 以世界的 X 轴正方向为前进方向,例如角色向前移动,主角模型向 X 轴正方向移动了一段距离。
以视线方向
- 以角色模型的视线方向为前进方向,例如角色向前移动,主角模型向他面朝的方向移动了一段距离。
以控制器方向
- 以控制器方向为前进方向,例如角色向前移动,主角模型会跟随摄像机的方向移动了一段距离,换而言之摄像机面朝方向为正方向。
示例脚本:
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//以定轴方向作为移动时的正方向
chara.movementDirection = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//以视线方向作为移动时的正方向
chara.movementDirection = 1;
});
//点击按键3触发以下逻辑
InputUtil.onKeyDown(Keys.Three, () => {
//以控制器方向作为移动时的正方向
chara.movementDirection = 2;
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//以定轴方向作为移动时的正方向
chara.movementDirection = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//以视线方向作为移动时的正方向
chara.movementDirection = 1;
});
//点击按键3触发以下逻辑
InputUtil.onKeyDown(Keys.Three, () => {
//以控制器方向作为移动时的正方向
chara.movementDirection = 2;
});
}
}
启用地面摩擦力
属性说明:角色在地面移动时,会受到两种向后的因素影响,分别是地面摩擦力和行走减速度。关闭地面摩擦力的影响后,角色移动时,就只会受到行走减速度影响。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//关闭地面摩擦力
chara.groundFrictionEnabled = false;
//设置角色的行走减速度=1000
chara.brakingDecelerationWalking = 1000;
//声明角色
let chara = Player.localPlayer.character
//关闭地面摩擦力
chara.groundFrictionEnabled = false;
//设置角色的行走减速度=1000
chara.brakingDecelerationWalking = 1000;
地面摩擦力
属性说明:角色在地面移动时,会受到两种向后的因素影响,分别是地面摩擦力和行走减速度。地面摩擦力是制约人物运动时改变方向的能力效果,一般是模拟环境因素给角色带来的不同减速效果。
实际应用:角色在冰面上奔跑时,突然转向,向反方向跑,角色会因为冰面的摩擦力较小,继续向前滑行一段时间后才能停下,然后向后进行移动。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//启用地面摩擦力
chara.groundFrictionEnabled = true;
//设备角色的地面摩擦力=10
chara.groundFriction = 10;
//声明角色
let chara = Player.localPlayer.character
//启用地面摩擦力
chara.groundFrictionEnabled = true;
//设备角色的地面摩擦力=10
chara.groundFriction = 10;
行走减速度
属性说明:角色在地面移动时,会受到两种向后的因素影响,分别是地面摩擦力和行走减速度。行走减速度是角色在地面移动状态下,不施加任何主动操作时受到的减速度。
实际应用:当角色不受地面摩擦力影响时,角色在减速过程中会根据角色的行走减速度进行减速,直至角色速度为0。当然正常情况下,角色是同时受到两个因素影响,所以在制作溜冰场的效果时,需要将两个值都减少到适应的值,如果其中一个值较大,都会导致角色将直接停下来。
实现步骤:以实现溜冰场的区域为例,想实现溜冰场效果目前是两种方式,首先我们要知道因为角色受到两种因素(地面摩擦力/行走减速度)的影响才能停下来,所以在做溜冰场效果时,我们需要将这两个因素的降低。
- 方式1:两个因素值都降低,并将脚本中利用到的GUID为【151060】的资源放置在优先加载的列表,进而实现溜冰效果。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//声明角色
let chara = Player.localPlayer.character
//加载溜冰动作
let anim = chara.loadAnimation("151060");
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//降低地面摩擦力,地面摩擦力=0
chara.groundFriction = 0;
//降低行走减速度,使行走减速度=10
chara.brakingDecelerationWalking = 10;
//播放滑冰动作
anim.play();
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//提高地面摩擦力,地面摩擦力=8
chara.groundFriction = 8;
//提高行走减速度,使行走减速度=2048
chara.brakingDecelerationWalking = 2048;
//停止滑冰动作
anim.stop();
}
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//声明角色
let chara = Player.localPlayer.character
//加载溜冰动作
let anim = chara.loadAnimation("151060");
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//降低地面摩擦力,地面摩擦力=0
chara.groundFriction = 0;
//降低行走减速度,使行走减速度=10
chara.brakingDecelerationWalking = 10;
//播放滑冰动作
anim.play();
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//提高地面摩擦力,地面摩擦力=8
chara.groundFriction = 8;
//提高行走减速度,使行走减速度=2048
chara.brakingDecelerationWalking = 2048;
//停止滑冰动作
anim.stop();
}
});
}
}
- 方式2:利用关闭地面摩擦力的接口,使地面摩擦力功能失效,只改变行走减速度,并将脚本中利用到的GUID为【151060】的资源放置在优先加载的列表,进而实现溜冰效果。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//声明角色
let chara = Player.localPlayer.character
//加载溜冰动作
let anim = chara.loadAnimation("151060");
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//关闭地面摩擦力的影响
chara.groundFrictionEnabled = false;
//降低行走减速度,使行走减速度=10
chara.brakingDecelerationWalking = 10;
//播放滑冰动作
anim.play();
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//关闭地面摩擦力的影响
chara.groundFrictionEnabled = false;
//提高行走减速度,使行走减速度=2048
chara.brakingDecelerationWalking = 2048;
//停止滑冰动作
anim.stop();
}
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//声明角色
let chara = Player.localPlayer.character
//加载溜冰动作
let anim = chara.loadAnimation("151060");
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//关闭地面摩擦力的影响
chara.groundFrictionEnabled = false;
//降低行走减速度,使行走减速度=10
chara.brakingDecelerationWalking = 10;
//播放滑冰动作
anim.play();
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//关闭地面摩擦力的影响
chara.groundFrictionEnabled = false;
//提高行走减速度,使行走减速度=2048
chara.brakingDecelerationWalking = 2048;
//停止滑冰动作
anim.stop();
}
});
}
}
示意图:
飞行属性
最大飞行速度
属性说明:角色在飞行状态下进行移动时,角色可达到的最大移动速度。
实际应用:我们可以利用触发器对象,制作一个飞行区域。当角色进入区域时,角色会切换为飞行状态,且最大飞行速度为1000。
首先我们将触发器对象放置在场景中
然后触发器对象下挂载以下脚本,即可实现一个飞行区域。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色状态切换为飞行状态
chara.switchToFlying();
//角色最大飞行速度=1000
chara.maxFlySpeed = 1000;
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色状态切换为地面行走状态
chara.switchToWalking();
}
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入触发器时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色状态切换为飞行状态
chara.switchToFlying();
//角色最大飞行速度=1000
chara.maxFlySpeed = 1000;
}
});
//角色离开触发器时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色状态切换为地面行走状态
chara.switchToWalking();
}
});
}
}
示意图:
飞行减速度
属性说明:角色在空中移动的状态下,不施加任何主动操作时受到的减速度。
实际应用:当角色在向前飞行的时候,突然不再施加操作,角色会受到飞行减速度的影响进行减速,直至飞行速度等于0。如果飞行减速度设置较小,角色会继续向其滑行,然后慢慢停下来。如果飞行减速度设置较大,角色将直接停下来。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//飞行减速度 = 200
chara.brakingDecelerationFlying = 200;
//声明角色
let chara = Player.localPlayer.character
//飞行减速度 = 200
chara.brakingDecelerationFlying = 200;
飞行减速度为200时,示意图:
飞行减速度为2048时,示意图:
游泳属性
最大游泳速度
属性说明:角色在游泳状态下进行移动时,角色可达到的最大移动速度。
实际应用:当角色进入游泳区域时,角色会切换为游泳状态,且最大游泳速度为 1000。
实现步骤:首先我们将游泳区域对象放置在场景中
然后我们就会根据角色属性面板中最大游泳速度,进行执行。
示意图:
如果想动态修改最大游泳速度,示例脚本如下:
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//设置最大游泳速度 = 500
chara.maxSwimSpeed = 500;
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明角色
let chara = Player.localPlayer.character
//设置最大游泳速度 = 500
chara.maxSwimSpeed = 500;
}
}
游泳减速度
属性说明:角色在游泳状态下,不施加任何主动操作时受到的减速度。
实际应用:当角色在向前游泳的时候,突然不再施加操作,角色会受到游泳减速度的影响进行减速,直至游泳速度等于0。如果游泳减速度设置较小,角色会继续向其滑行,然后慢慢停下来。如果游泳减速度设置较大,角色将直接停下来。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//游泳减速度 = 500
chara.brakingDecelerationSwimming = 500;
//声明角色
let chara = Player.localPlayer.character
//游泳减速度 = 500
chara.brakingDecelerationSwimming = 500;
游泳减速度为200时,示意图:
游泳减速度为2048时,示意图:
下蹲属性
是否可以下蹲
属性说明:角色是否可以下蹲。
实际应用:在特殊情况下,不允许角色下蹲。
蹲伏行走最大移动速度
属性说明:角色在下蹲状态下移动时,角色可达到的最大移动速度。
实际应用:进入下蹲区域时,角色进入下蹲状态,移速在达到最大移动速度时恒定。
实现步骤:首先我们将触发器对象放置在场景中,然后绑定以下脚本即可实现一个下蹲区域。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入方形触发时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色状态切换为下蹲状态
chara.crouch(true);
//设置下蹲移速=500
chara.maxWalkSpeedCrouched = 500;
}
});
//角色离开方形触发时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色状态切换为行走状态
chara.crouch(false);
}
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
let trigger = this.gameObject as Trigger;
//角色进入方形触发时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色状态切换为下蹲状态
chara.crouch(true);
//设置下蹲移速=500
chara.maxWalkSpeedCrouched = 500;
}
});
//角色离开方形触发时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色状态切换为行走状态
chara.crouch(false);
}
});
}
}
示意图:
下蹲时的高度
属性说明:下蹲状态下,角色胶囊体的高度。
实际应用:根据实际角色模型的下蹲高度,调整角色的胶囊体高度,进行完美适配。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色下蹲时胶囊体的高度 = 150
chara.crouchedHeight = 150;
//声明角色
let chara = Player.localPlayer.character
//角色下蹲时胶囊体的高度 = 150
chara.crouchedHeight = 150;
下落属性
最大下落速度
属性说明:角色在下落状态下移动时,角色可达到的最大移动速度。
实际应用:角色在从高空跳跃后,角色仅受到重力影响进行下落,下落速度会越来越快,直至移速达到最大下落速度。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//最大下落速度 = 5000
chara.maxFallingSpeed = 5000;
//声明角色
let chara = Player.localPlayer.character
//最大下落速度 = 5000
chara.maxFallingSpeed = 5000;
下落控制灵敏度
属性说明:角色在下落状态下的运动效果,可以拆分成水平方向的运动和垂直方向的运动两个部分。垂直方向的运动计算主要通过重力影响,水平方向的运动计算与地面的运动效果是一样的,也是由地面的最大速度、最大加速度以及下落控制灵敏度进行计算。也就是说水平速度主要以地面速度为基准,而下落控制灵敏度是限制水平的移动速度效果,使角色在下落状态下的水平移动速度不超过地面的移动速度。
数值范围:0-1。
范围说明:下落控制灵敏度范围在0到1之间,如果控制程度的数值为0时,角色无法在水平方向施加其他方向的速度。如果控制程度的数值为1时,角色可以在水平方向施加其他方向的速度,并且移动速度与地面的移动速度保持一致。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//下落控制程度 = 0
chara.airControl = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//下落控制程度 = 1
chara.airControl = 1;
});
//声明角色
let chara = Player.localPlayer.character
//点击按键1触发以下逻辑
InputUtil.onKeyDown(Keys.One, () => {
//下落控制程度 = 0
chara.airControl = 0;
});
//点击按键2触发以下逻辑
InputUtil.onKeyDown(Keys.Two, () => {
//下落控制程度 = 1
chara.airControl = 1;
});
下落控制灵敏度为0时,示意图:
下落控制灵敏度为1时,示意图:
重力倍率
属性说明:该值是调整角色下落速度时的重力效果的倍率。默认为1倍,数值越大,角色下落速度越快,数值越小,角色下落速度越慢。该值只影响角色重力倍率,世界场景中其他物体不受其影响。
实际应用:我们可以通过重力倍率调整出降落伞的效果,并且可以通过角色在空中状态下,改变地面最大速度和加速度,实现在空中移动速度更快的效果。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//重力倍率 = 0.01
chara.gravityScale = 0.01;
//声明角色
let chara = Player.localPlayer.character
//重力倍率 = 0.01
chara.gravityScale = 0.01;
下落水平减速度
属性说明:角色在下落状态下,不施加任何主动操作时水平方向受到的减速度。
举例说明:正常跳跃时,会根据初始跳跃的方向进行移动,如果该减速度过大,会导致角色在不操作的情况下,脱离该轨迹,进行垂直下落的效果。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//下落水平减速度 = 1000
chara.horizontalBrakingDecelerationFalling = 1000;
//声明角色
let chara = Player.localPlayer.character
//下落水平减速度 = 1000
chara.horizontalBrakingDecelerationFalling = 1000;
下落水平减速度为0时,示意图:
下落水平减速度为1000时,示意图:
跳跃属性
是否可跳跃
属性说明:限制角色跳跃的属性。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色跳跃能力为false
chara.jumpEnabled = false;
//声明角色
let chara = Player.localPlayer.character
//角色跳跃能力为false
chara.jumpEnabled = false;
最大跳跃高度
属性说明:角色跳跃时,从起跳位置到最高位置的距离设定。
实际应用:角色踩到跳跃板(触发器)时,角色将会执行跳跃,且跳跃很高的高度。
实现步骤:首先我们将触发器对象放置在场景中,然后绑定以下脚本即可实现一个跳跃板的功能。或者也可以利用此功能做蹦蹦床等功能。
ts
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//角色进入方形触发时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色触发跳跃功能
chara.jump();
//角色跳跃高度 = 800
chara.maxJumpHeight = 800;
}
});
//角色离开方形触发时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色跳跃高度 = 200
chara.maxJumpHeight = 200;
}
});
}
}
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
//声明触发器
let trigger = this.gameObject as Trigger;
//角色进入方形触发时触发以下逻辑
trigger.onEnter.add((chara: Character) => {
if (chara) {
//角色触发跳跃功能
chara.jump();
//角色跳跃高度 = 800
chara.maxJumpHeight = 800;
}
});
//角色离开方形触发时触发以下逻辑
trigger.onLeave.add((chara: Character) => {
if (chara) {
//角色跳跃高度 = 200
chara.maxJumpHeight = 200;
}
});
}
}
示意图:
最大跳跃次数
属性说明:角色能够执行的最大跳跃数量。
实际应用:实现角色多次跳跃的功能。
示例脚本:
ts
//声明角色
let chara = Player.localPlayer.character
//角色跳跃次数 = 5
chara.jumpMaxCount = 5;
//声明角色
let chara = Player.localPlayer.character
//角色跳跃次数 = 5
chara.jumpMaxCount = 5;
示意图:
形象设置
使用平台角色形象
属性说明:勾选使用平台角色形象,角色的形象会继承233的平台形象效果,不勾选的情况下,角色可以自主设置角色形象。
注意说明:勾选使用平台角色形象的情况下,在角色编辑器中修改角色形象是无法更改形象效果的。
外观类型
属性说明:外观类型根据角色外观形象进行得划分,分为【基础人形形象】/【高级人形形象】/【多足形象】。
【基础人形形象】:是人形的整体形象,只能更换整体外观形象。
【高级人形形象】:是更加完善得人形形象,可以更换角色的服装(上衣、裤子、手套、鞋子),以及脸部效果(前发、后发、瞳孔、眉毛、睫毛、肤色)等等效果。
【多足形象】:是非人形的整体形象,比如四足动物的猫/狗/猪等,只能更换整体外观形象。
体型类型
属性说明:体型类型是相同外观类型下得更加详细得类型划分,使编辑器能够更加精准的获取到角色形象的体型外观,让角色的动作和表现效果更加符合审美。目前体型类型只有高级人形形象才会进行区分,【基础人形形象】和【多足形象】直接更换形象即可,不需要区分体型。
备注说明:无类型是没有明确的形象定义,让用户自定义角色效果。
套装数据
属性说明:套装数据是高级人形形象的独有属性,用户可以将自己在角色编辑器中存储好的形象保存成相应文件,并直接拖入到属性面板中,这样用户可以将自己存储好的形象进行便捷设置。
操作示例:
角色形象
属性说明:角色形象是具体的形象资源槽,根据不同的类型显示不同的资源槽,用户可以通过将资源拖拽相应属性资源槽内,快速实现设置想要的角色形象。因为基础人形形象和多足形象都是只能更换整体外观形象,所以只有一个形象资源槽,而高级人形形象可以更换多个部位的资源,所以有6个形象资源槽。
操作示例:
角色换装的详细说明请见:
角色描边
被遮挡时开启描边
属性说明:角色被物体遮挡时,会显示角色描边,标记角色位置。
注意说明:开启描边后,注意关闭摄像机碰撞,否则没办法看到角色在遮挡情况下的描边效果。
描边颜色
属性说明:显示角色描边时,角色的描边颜色。
描边宽度
属性说明:显示角色描边时,角色的描边宽度。
示意图: