玩法 / Model
Model Class
物理模拟与材质设置
在游戏中添加物理效果有助于提升场景的沉浸感,因为这能促使玩家相信他们的确在与模拟内容进行交互,并且能以某种方式得到反馈。
物理模拟 如何工作呢?
Model的属性定义了静态模型具有物理特性,其中较为重要的是:
静态模型实例 physicsEnabled 属性为 True 可开启物理模拟。
mass 属性表示重力的大小。
friction 属性表示摩擦力的大小。
restitution 属性表示弹力。
lockPosition 属性表示约束,约束哪个轴指在这个轴向不会发生变动。
材质如何自定义设置呢?
材质 是可以应用到网格物体静态模型上的资源,用它可控制场景的可视外观。
setMaterial 方法更换静态模型材质,传入左侧材质资源ID。
setStaticMeshAsset 方法更换静态模型,传入左侧静态模型资源ID。
Precautions
物理相关接口目前版本不支持证多端同步
ts
@Component
export default class ModelExample extends Script {
//当脚本被实例后,会在第一帧更新前调用此函数
protected async onStart(): `Promise`<`void`\> {
if(SystemUtil.isClient())
{
InputUtil.onKeyDown(Keys.F1,()=>{
// F1键 通知服务器执行事件
mw.Event.dispatchToServer("Model");
});
}
if(SystemUtil.isServer()){
mw.Event.addClientListener("Model",()=>{
let box = GameObject.spawn("197386",{
transform:new Transform(new Vector(500,0,100),new Rotation(0,0,0),new Vector(1,1,1)),
replicates:true
}) as Model;
// 控制质量
box.massEnabled = true;
// 设置质量
box.mass = 200;
// 使用质量
box.gravityEnabled = true;
// 设置摩擦力
box.friction = 0.1;
// 设置弹力
box.restitution = 1;
// 开启物理模拟
box.physicsEnabled = true;
// 开关闭阴影投射
box.castShadow = false;
});
}
}
}@Component
export default class ModelExample extends Script {
//当脚本被实例后,会在第一帧更新前调用此函数
protected async onStart(): `Promise`<`void`\> {
if(SystemUtil.isClient())
{
InputUtil.onKeyDown(Keys.F1,()=>{
// F1键 通知服务器执行事件
mw.Event.dispatchToServer("Model");
});
}
if(SystemUtil.isServer()){
mw.Event.addClientListener("Model",()=>{
let box = GameObject.spawn("197386",{
transform:new Transform(new Vector(500,0,100),new Rotation(0,0,0),new Vector(1,1,1)),
replicates:true
}) as Model;
// 控制质量
box.massEnabled = true;
// 设置质量
box.mass = 200;
// 使用质量
box.gravityEnabled = true;
// 设置摩擦力
box.friction = 0.1;
// 设置弹力
box.restitution = 1;
// 开启物理模拟
box.physicsEnabled = true;
// 开关闭阴影投射
box.castShadow = false;
});
}
}
}Hierarchy
↳
Model
Table of contents
Properties
onTouch: MulticastGameObjectDelegate |
|---|
| 进入Model事件 |
onTouchEnd: MulticastGameObjectDelegate |
| 离开Model事件 |
click
Properties
onBeforeDestroyDelegate: MulticastDelegate<() => void> |
|---|
| 物体销毁前事件回调 |
onCustomPropertyChange: Readonly<MulticastDelegate<(path: string, value: unknown, oldValue: unknown) => void>> other |
| 监听自定义属性同步事件 |
onDestroyDelegate: MulticastDelegate<() => void> |
| 物体销毁后事件回调 |
onPropertyChange: Readonly<MulticastDelegate<(path: string, value: unknown, oldValue: unknown) => void>> |
| 监听系统属性同步事件 |
Accessors
angularDamping(): number |
|---|
| 角阻尼 |
castShadow(): boolean |
| 获取是否开启阴影 |
centerOfMass(): Vector |
| 获取质心偏移 |
collisionGroup(): string |
| 获取对应的碰撞组 |
friction(): number |
| 获取摩擦力大小 |
gravityEnabled(): boolean |
| 获取是否启用重力 |
linerDamping(): number |
| 获取线性阻尼 |
lockPositionX(): boolean |
| 获取是否约束位置X |
lockPositionY(): boolean |
| 获取是否约束位置Y |
lockPositionZ(): boolean |
| 获取是否约束位置Z |
lockRotationX(): boolean |
| 获取是否约束旋转X |
lockRotationY(): boolean |
| 获取是否约束旋转Y |
lockRotationZ(): boolean |
| 获取是否约束旋转Z |
mass(): number |
| 获取质量大小 |
massEnabled(): boolean |
| 获取是否使用质量 |
physicsAngularVelocity(): Vector |
| 获取角速度(仅开启模拟时生效) |
physicsEnabled(): boolean |
| 获取是否模拟物理 |
physicsLinearVelocity(): Vector |
| 获取线性速度(仅开启模拟时生效) |
restitution(): number |
| 获取弹力大小 |
click
Accessors
assetId(): string |
|---|
| 获取当前物体使用资源的GUID |
gameObjectId(): string |
| 获取物体的唯一标识(唯一标识一个对象的字符串)。 |
isDestroyed(): boolean |
| 当前物体是否被销毁 |
isReady(): boolean |
| 当前物体状态 |
localTransform(): Transform |
| 当前物体本地变换 |
name(): string |
| 返回当前物体名称 |
netStatus(): NetStatus |
| 获取当前物体同步状态 |
parent(): GameObject |
| 获取当前父物体 |
tag(): string |
| 获取当前物体的标签 |
worldTransform(): Transform |
| 当前物体世界变换 |
Methods
addAngularImpulse(impulse: Vector, velChange?: boolean): void |
|---|
| 给开启物理模拟的模型添加一个角冲量 |
addForce(force: Vector, velChange?: boolean): void |
| 给开启物理模拟的模型添加一个力 |
addImpulse(impulse: Vector, velChange?: boolean): void |
| 给开启物理模拟的模型添加一个冲量力 |
addTorque(torque: Vector, velChange?: boolean): void |
| 给开启物理模拟的模型添加一个扭力 |
createMaterialInstance(Index: number): void |
| 创建材质实例 |
getMaterialInstance(): MaterialInstance[] |
| 返回当前拥有的材质实例 |
resetMaterial(): void |
| 还原物体材质 |
setCullDistance(inCullDistance: number): void client |
| 与玩家之间超出此距离的对象将被剪裁 |
setMaterial(MaterialGUID: string): void |
| 设置物体材质 |
setOutline(enabled: boolean, color?: LinearColor, width?: number): void |
| 设置对象描边及描边颜色 |
setPostProcessOutline(enabled: boolean, color?: LinearColor, width?: number): void |
| 设置对象描边及描边颜色。 |
setStaticMeshAsset(InAssetGuid: string): void |
| 设置静态网格资源 |
click
Methods
addComponent<T: extends Script<T>>(constructor: (...args: unknown[]) => T: extends Script<T>, bInReplicates?: boolean): T: extends Script<T> |
|---|
| 添加一个脚本组件 |
asyncGetChildByName(name: string): Promise<GameObject> |
| 异步根据名称查找子物体 |
asyncReady(): Promise<GameObject> |
| 物体准备好后返回 |
clone(gameObjectInfo?: GameObjectInfo): GameObject |
| 复制对象 |
destroy(): void |
| 删除对象 |
getBoundingBox(nonColliding?: boolean, includeFromChild?: boolean, outer?: Vector): Vector |
| 获取物体包围盒大小 |
getBounds(onlyCollidingComponents: boolean, originOuter: Vector, boxExtentOuter: Vector, includeFromChild?: boolean): void |
| 获取物体边界 |
getChildByGameObjectId(gameObjectId: string): GameObject |
| 根据 gameObjectId 查找子物体 |
getChildByName(name: string): GameObject |
| 根据名称查找子物体 |
getChildByPath(path: string): GameObject |
| 根据路径查找子物体 |
getChildren(): GameObject[] |
| 获取子物体 |
getChildrenBoundingBoxCenter(outer?: Vector): Vector |
| 获取所有子对象包围盒中心点(不包含父对象,父对象不可用返回[0,0,0]) |
getChildrenByName(name: string): GameObject[] |
| 通过名字查找所有的子物体 |
getComponent<T: extends Script<T>>(constructor?: (...args: unknown[]) => T: extends Script<T>): T: extends Script<T> |
| 获取指定类型的组件 |
getComponentPropertys<T: extends Script<T>>(constructor: (...args: unknown[]) => T: extends Script<T>): Map<string, IPropertyOptions> |
| 获取脚本组件属性 |
getComponents<T: extends Script<T>>(constructor?: (...args: unknown[]) => T: extends Script<T>): T: extends Script<T>[] |
| 获取指定类型的所有组件 |
getCustomProperties(): string[] |
| 获取所有自定义属性 |
getCustomProperty<T: extends CustomPropertyType>(propertyName: string): T: extends CustomPropertyType |
| 获取自定义属性 |
getCustomPropertyChangeDelegate(property): Readonly<MulticastDelegate<(path: string, value: unknown, oldValue: unknown) => void>> other |
| 给定对象属性修改时触发的事件代理 |
getPropertyChangeDelegate(property): Readonly<MulticastDelegate<(path: string, value: unknown, oldValue: unknown) => void>> other |
| 给定对象属性修改时触发的事件代理 |
getVisibility(): boolean |
| 获取物体是否被显示 |
moveBy(velocity: Vector, isLocal?: boolean): void other |
| 按给定的速度矢量随时间平滑地移动对象 |
moveTo(targetPosition: Vector, time: number, isLocal?: boolean, onComplete?: () => void): void other |
| 在指定时间内从当前位置平滑移动至目标位置 |
rotateBy(rotation: Quaternion Rotation, multiplier: number, isLocal?: boolean): void other |
| 按给定的旋转量随时间平滑地旋转对象 |
rotateTo(targetRotation: Quaternion Rotation, time: number, isLocal?: boolean, onComplete?: () => void): void other |
| 在指定时间内从当前旋转平滑变化至目标旋转 |
scaleBy(scale: Vector, isLocal?: boolean): void other |
| 按每秒给定的缩放矢量随时间平滑缩放对象 |
scaleTo(targetScale: Vector, time: number, isLocal?: boolean, onComplete?: () => void): void other |
| 在指定时间内从当前缩放平滑变化至目标缩放 |
setAbsolute(absolutePosition?: boolean, absoluteRotation?: boolean, absoluteScale?: boolean): void |
| 设置物体localTransform是相对于父物体或者世界 |
setCustomProperty(propertyName: string, value: undefined CustomPropertyType): void |
| 设置自定义属性 |
setVisibility(status: boolean PropertyStatus, propagateToChildren?: boolean): void |
| 设置物体是否被显示 |
stopMove(): void other |
| 中断moveTo()、moveBy()的进一步移动 |
stopRotate(): void other |
| 中断从rotateTo()或rotateBy()的进一步旋转 |
stopScale(): void other |
| 中断从ScaleTo()或ScaleBy()的进一步缩放 |
asyncFindGameObjectById(gameObjectId: string): Promise<GameObject> |
| 通过 gameObjectId 异步查找 GameObject |
asyncGetGameObjectByPath(path: string): Promise<GameObject> |
| 通过路径异步查找物体 |
asyncSpawn<T: extends GameObject<T>>(assetId: string, gameObjectInfo?: GameObjectInfo): Promise<T: extends GameObject<T>> |
| 异步构造一个物体 |
bulkPivotTo(gameObjects: GameObject[], transforms: Transform[]): void |
| 批量设置位置 |
findGameObjectById(gameObjectId: string): GameObject |
| 通过 gameObjectId 查找物体 |
findGameObjectByName(name: string): GameObject |
| 通过名字查找物体 |
findGameObjectsByName(name: string): GameObject[] |
| 通过名字查找物体 |
findGameObjectsByTag(tag: string): GameObject[] |
| 通过自定义标签获取物体 |
getGameObjectByPath(path: string): GameObject |
| 通过路径查找物体 |
spawn<T: extends GameObject<T>>(assetId: string, gameObjectInfo?: GameObjectInfo): T: extends GameObject<T> |
| 构造一个物体 |
Properties
onTouch
• onTouch: MulticastGameObjectDelegate
进入Model事件
onTouchEnd
• onTouchEnd: MulticastGameObjectDelegate
离开Model事件
Accessors
angularDamping
• | • | ||||
|---|---|---|---|---|---|
角阻尼 Returns
| 设置角阻尼 Parameters
|
castShadow
• | • | ||||
|---|---|---|---|---|---|
获取是否开启阴影 Returns
| 设置阴影开启状态 Parameters
|
centerOfMass
• | • | ||||
|---|---|---|---|---|---|
获取质心偏移 质心是物体质量的中心,对质心进行偏移时,会影响物体在运动时的形态,但不会影响物体自身的变换 Returns
| 设置质心偏移 质心是物体质量的中心,对质心进行偏移时,会影响物体在运动时的形态,但不会影响物体自身的变换 Parameters
|
collisionGroup
• | • | ||||
|---|---|---|---|---|---|
获取对应的碰撞组 Returns
| 设置碰撞组 Parameters
|
friction
• | • | ||||
|---|---|---|---|---|---|
获取摩擦力大小 Returns
| 设置摩擦力大小 Parameters
|
gravityEnabled
• | • | ||||
|---|---|---|---|---|---|
获取是否启用重力 Returns
| 设置是否启用重力 Parameters
|
linerDamping
• | • | ||||
|---|---|---|---|---|---|
获取线性阻尼 Returns
| 设置线性阻尼 Parameters
|
lockPositionX
• | • | ||||
|---|---|---|---|---|---|
获取是否约束位置X Returns
| 设置是否约束位置X Parameters
|
lockPositionY
• | • | ||||
|---|---|---|---|---|---|
获取是否约束位置Y Returns
| 设置是否约束位置Y Parameters
|
lockPositionZ
• | • | ||||
|---|---|---|---|---|---|
获取是否约束位置Z Returns
| 设置是否约束位置Z Parameters
|
lockRotationX
• | • | ||||
|---|---|---|---|---|---|
获取是否约束旋转X Returns
| 设置是否约束旋转X Parameters
|
lockRotationY
• | • | ||||
|---|---|---|---|---|---|
获取是否约束旋转Y Returns
| 设置是否约束旋转Y Parameters
|
lockRotationZ
• | • | ||||
|---|---|---|---|---|---|
获取是否约束旋转Z Returns
| 设置是否约束旋转Z Parameters
|
mass
• | • | ||||
|---|---|---|---|---|---|
获取质量大小 Returns
| 设置质量大小 Parameters
|
massEnabled
• | • | ||||
|---|---|---|---|---|---|
获取是否使用质量 Returns
| 设置是否启用质量 Parameters
|
physicsAngularVelocity
• | • | ||||
|---|---|---|---|---|---|
获取角速度(仅开启模拟时生效) Returns
| 设置需要叠加的角速度(仅开启模拟时生效) Parameters
|
physicsEnabled
• | • | ||||
|---|---|---|---|---|---|
获取是否模拟物理 Returns
| 设置模拟物理状态 Parameters
|
physicsLinearVelocity
• | • | ||||
|---|---|---|---|---|---|
获取线性速度(仅开启模拟时生效) Returns
| 设置需要叠加的线性速度(仅开启模拟时生效) Parameters
|
restitution
• | • | ||||
|---|---|---|---|---|---|
获取弹力大小 Returns
| 设置弹力大小 Parameters
|
Methods
addAngularImpulse
• addAngularImpulse(impulse, velChange?): void
给开启物理模拟的模型添加一个角冲量
Parameters
impulse Vector | 设置角冲量大小和方向 |
|---|---|
velChange? boolean | 是否忽视模型自身质量的影响 default:false 使用示例: 如下示例展示添加角冲量方法 ts if (model.physicsEnabled) `{ // 确保开启物理模拟 model.addAngularImpulse(new Vector(200,0,0), true); }` |
addForce
• addForce(force, velChange?): void
给开启物理模拟的模型添加一个力
Parameters
force Vector | 设置力大小和方向 default: null |
|---|---|
velChange? boolean | 是否忽视模型自身质量的影响 default:false 使用示例: 如下示例展示添加力方法 ts if (model.physicsEnabled) `{ // 确保开启物理模拟 model.addForce(new Vector(200,0,0), true); }` |
addImpulse
• addImpulse(impulse, velChange?): void
给开启物理模拟的模型添加一个冲量力
Parameters
impulse Vector | 设置冲量力大小和方向 |
|---|---|
velChange? boolean | 是否忽视模型自身质量的影响 default:false |
ts
if (model.physicsEnabled) {
// 确保开启物理模拟
model.addImpulse(new Vector(200,0,0), true);
}if (model.physicsEnabled) {
// 确保开启物理模拟
model.addImpulse(new Vector(200,0,0), true);
}addTorque
• addTorque(torque, velChange?): void
给开启物理模拟的模型添加一个扭力
Parameters
torque Vector | 设置扭力大小和方向 default: null |
|---|---|
velChange? boolean | 是否忽视模型自身质量的影响 default:false 使用示例: 如下示例展示添加扭力方法 ts if (model.physicsEnabled) `{ // 确保开启物理模拟 model.addTorque(new Vector(200,0,0), true); }` |
createMaterialInstance
• createMaterialInstance(Index): void
创建材质实例
Parameters
Index number | 第几个材质 range: 不超过材质数 type: 整数 |
|---|
getMaterialInstance
• getMaterialInstance(): MaterialInstance[]
返回当前拥有的材质实例
Returns
MaterialInstance[] | 材质实例数组 |
|---|
该材质资源若未加载过,返回的材质实例无法立即取到材质属性,材质资源加载完成后即可通过材质实例获取正确的材质属性
resetMaterial
• resetMaterial(): void
还原物体材质
setCullDistance
• setCullDistance(inCullDistance): void client
与玩家之间超出此距离的对象将被剪裁
Parameters
inCullDistance number | 裁剪距离 range: 建议 (2000, 4000) type: 浮点数 |
|---|
最终的裁剪距离会和画质等级有关;修改此属性 ≤0 时,裁剪距离会根据对象尺寸自动调整 (自动启用 CullDistanceVolume 功能)
Precautions
最终的裁剪距离会和画质等级有关
setMaterial
• setMaterial(MaterialGUID): void
设置物体材质
Parameters
MaterialGUID string | 材质 ID default: null range: 字符串长度依据材质资源 ID 长度而定 |
|---|
• setMaterial(MaterialGUID, index): void
设置物体材质
Parameters
MaterialGUID string | 材质 ID range: 字符串长度依据材质资源 ID 长度而定 |
|---|---|
index number | 材质下标 range: 依据材质 ID 长度而定 type:整数 |
setOutline
• setOutline(enabled, color?, width?): void
设置对象描边及描边颜色
Parameters
enabled boolean | 是否开启描边 |
|---|---|
color? LinearColor | 设置描边颜色,与后处理中颜色 Index 对应,-1为无颜色。 default: mw.LinearColor.black |
width? number | 设置描边宽度 default:2 range:[0, 100] type: 浮点数 |
需要场景中存在后处理对象。
setPostProcessOutline
• setPostProcessOutline(enabled, color?, width?): void
设置对象描边及描边颜色。
Parameters
enabled boolean | 是否开启描边 |
|---|---|
color? LinearColor | 设置描边颜色,与后处理中颜色Index对应,-1为无颜色 default:mw.LinearColor.black |
width? number | 设置描边宽度 default:2 range: [0, 4] type: 浮点数 |
setStaticMeshAsset
• setStaticMeshAsset(InAssetGuid): void
设置静态网格资源
Parameters
InAssetGuid string | 资源GUID range: 字符串长度依据资源 ID 长度而定 |
|---|