Skip to content
水体区域

水体区域

阅读本文大概需要 10 分钟

本文概述了水体区域的定义,水体区域都有哪些功能,表现效果以及使用方式。

什么是水体区域

水体区域定义:水体区域是一个具有一定形状的区域,它具有水面和水下效果,并且可以在角色进入该区域时,切换为游泳状态。开发者使用该对象在自己想要的区域,实现角色游泳效果。例如场景中的游泳池,河流湖泊和海洋都可以放置水体区域。

水体区域在编辑器中以功能对象的形式存在,打开编辑器后在左侧资源栏中的“逻辑资源”中,选取“游戏功能对象”,红框中就是水体区域,资源ID为WaterVolume。

水体区域使用

如何找到水体区域?

在【资源库】-【游戏功能对象】列表中找到【水体区域】的对象。

使用水体区域

我们在找到水体区域后,可以根据需求手动拖入场景内,修改其属性来实现相应的效果,也可以通过代码动态生成水体区域。

基础属性中包括了水体的物理属性和水体的表现效果。我们可以通过调节水体摩擦力,改变角色在水中的移动效果。我们也可以通过调节水体属性和水波效果调整水面的表现效果。

动态生成水体区域

也可以将鼠标悬停在要的的资源上方,查看资源的GUID;也可以通过右键,复制对象的GUID。然后通过GUID动态创建相应的资源。

动态生成特效的示例脚本:

ts
// 异步spawn,没有找到资源时会下载后在生成
GameObject.asyncSpawn("12683").then((obj) => {
    let pool = obj as WaterVolume;
})
// 异步spawn,没有找到资源时会下载后在生成
GameObject.asyncSpawn("12683").then((obj) => {
    let pool = obj as WaterVolume;
})
ts
// 普通spawn生成,没有优先加载或预加载资源则无法生成
let pool = GameObject.spawn("WaterVolume") as WaterVolume;
// 普通spawn生成,没有优先加载或预加载资源则无法生成
let pool = GameObject.spawn("WaterVolume") as WaterVolume;

注意

为了保证之前版本水体的兼容性,我们新增水体的逻辑对象,它将会使用的是WaterVolume的GUID,之前游泳区域的逻辑对象GUID依旧是SwimmingVolume,在后续的版本中我们依旧会保留SwimmingVolume的功能,之前的项目可以正常使用。

游泳属性介绍

水体摩擦力

功能说明:角色在游泳区域内的摩擦力,影响角色移动的加速度和表现效果

演示效果:

水体摩擦力=1水体摩擦力=100

水体属性介绍

主体颜色

功能说明:水体区域主要显示的颜色

演示效果:

相关接口:

ts
//找到水体区域
let water = GameObject.findGameObjectById("21C44BBD") as WaterVolume;
//主体颜色设置为红色
water.waterColor = LinearColor.red
//找到水体区域
let water = GameObject.findGameObjectById("21C44BBD") as WaterVolume;
//主体颜色设置为红色
water.waterColor = LinearColor.red

透明度

功能说明:水体区域的透明化程度。0为完全透明,1为完全不透明。

演示效果:

相关接口:

ts
//透明度设置为0.6
water.transmittance = 0.6
//透明度设置为0.6
water.transmittance = 0.6

水波属性介绍

水波强度

功能说明:水面上的水波强弱显示效果

演示效果:

相关接口:

ts
//设置水波强度为0.3
water.normalFlat = 0.3
//设置水波强度为0.3
water.normalFlat = 0.3

水波角度

功能说明:水波的倾斜角度效果

演示效果:

相关接口:

ts
//设置水波的角度为0.5
water.flowAngle = 0.5
//设置水波的角度为0.5
water.flowAngle = 0.5

水波速度

功能说明:水波的流动速度

演示效果:

相关接口:

ts
//设置水波的速度为20
water.flowSpeed = 20
//设置水波的速度为20
water.flowSpeed = 20

水波密度

功能说明:水波在水面上的整体密集程度

演示效果:

相关接口:

ts
//设置水波密度为500
water.flowTile = 500
//设置水波密度为500
water.flowTile = 500

其他说明

控制角色上浮下沉

演示效果:

相关接口:

ts
@Component
export default class Example_Character_SwimDown 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(10, 10, 10))});
        }
        // 下列代码仅在客户端执行
        if(SystemUtil.isClient()) {
            // 获取当前客户端的玩家(自己)
            let myPlayer = Player.localPlayer;
            // 获取当前玩家控制的角色
            let myCharacter = myPlayer.character;
            // 添加一个按键方法:按住键盘“1”,角色上浮
            InputUtil.onKeyPress(Keys.One, () => {
                myCharacter.swimUp(5);
            });
            // 添加一个按键方法:按住键盘“2”,角色下潜
            InputUtil.onKeyPress(Keys.Two, () => {
                myCharacter.swimDown(5);
            });
        }
    }
}
@Component
export default class Example_Character_SwimDown 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(10, 10, 10))});
        }
        // 下列代码仅在客户端执行
        if(SystemUtil.isClient()) {
            // 获取当前客户端的玩家(自己)
            let myPlayer = Player.localPlayer;
            // 获取当前玩家控制的角色
            let myCharacter = myPlayer.character;
            // 添加一个按键方法:按住键盘“1”,角色上浮
            InputUtil.onKeyPress(Keys.One, () => {
                myCharacter.swimUp(5);
            });
            // 添加一个按键方法:按住键盘“2”,角色下潜
            InputUtil.onKeyPress(Keys.Two, () => {
                myCharacter.swimDown(5);
            });
        }
    }
}