107 lines
2.4 KiB
Markdown
107 lines
2.4 KiB
Markdown
|
# 相关类
|
|||
|
- TsPropActor
|
|||
|
- TsIdolPropActor
|
|||
|
- TsScenePropActor
|
|||
|
- TsPropEffectActor
|
|||
|
|
|||
|
# 相关资产
|
|||
|
ResArt/MountPointConfig/DT_MountPointConfig:用于设置道具挂载时的相对偏移。
|
|||
|
# MountPoint
|
|||
|
GameplayTag中有定义相关Prop的挂载位置标签:
|
|||
|
- Prop
|
|||
|
- MountPoint
|
|||
|
- Back
|
|||
|
- Body
|
|||
|
- Feet
|
|||
|
- Head
|
|||
|
- HeadBottom
|
|||
|
- HeadUp
|
|||
|
- Hips
|
|||
|
- LeftFoot
|
|||
|
- LeftHand
|
|||
|
- RightFoot
|
|||
|
- RightHand
|
|||
|
- Root
|
|||
|
|
|||
|
对应逻辑TsPropAssetManager.ts中的枚举,查找函数为GetMountPointIndexByTagName():
|
|||
|
```ts
|
|||
|
export const enum MountPointEnum {
|
|||
|
HeadUp,
|
|||
|
Head,
|
|||
|
HeadDown,
|
|||
|
LeftHand,
|
|||
|
RightHand,
|
|||
|
Back,
|
|||
|
Feet,
|
|||
|
Hips
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
TsIdolPropManagerComponent.ts
|
|||
|
AttachAllProp() => AttachProp()
|
|||
|
|
|||
|
TsPropAssetManager.ts
|
|||
|
```ts
|
|||
|
static GetMountPointName(Tag: UE.GameplayTag): string {
|
|||
|
if (Tag.TagName.startsWith('Prop.MountPoint')) {
|
|||
|
let res = Tag.TagName.split('.')
|
|||
|
return res[res.length - 1]
|
|||
|
}
|
|||
|
return ''
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
# 换装代码调用步骤
|
|||
|
PrepareLoadNewModel_Multicast
|
|||
|
ServerDoLoadPropPreset() => ServerStartSwitchPreset() => ServerLoadProp() => DoLoadProp() => LoadDressByConfig()
|
|||
|
|
|||
|
- TsDirectorController.ts CreateIdol()
|
|||
|
- TsIdolControllerActor.ServerCreateIdolControllerAtLiveArea
|
|||
|
- controller.PropComp.ServerLoadPropPreset(0)
|
|||
|
- TsIdolPropManagerComponent
|
|||
|
- ServerLoadPropPreset()
|
|||
|
- ServerLoadProp()
|
|||
|
- DoLoadProp()
|
|||
|
- LoadDressByConfig
|
|||
|
|
|||
|
LocalLoadDressByConfig() 本地加载。
|
|||
|
LoadDressByConfig() 服务器加载。
|
|||
|
|
|||
|
# 角色衣服套装预设切换逻辑
|
|||
|
在WBP_CharacterItem中5个按钮BtnSuit_1、BtnSuit_2、BtnSuit_3、BtnSuit_4、BtnSuit_5会调用EventOnPresetClicked。
|
|||
|
|
|||
|
```ts
|
|||
|
EventOnPresetClicked(PresetIndex: number, IsDoubleClick: boolean):void {
|
|||
|
let curTime = UE.KismetSystemLibrary.GetGameTimeInSeconds(this)
|
|||
|
if (curTime - this.LastLoadPresetTime < 0.5) {
|
|||
|
console.warn('Click too fast , please try again later')
|
|||
|
return
|
|||
|
}
|
|||
|
this.LastLoadPresetTime = curTime;
|
|||
|
if (IsDoubleClick) {
|
|||
|
this.LoadPreset(PresetIndex)
|
|||
|
} else {
|
|||
|
this.PreviewPreset(PresetIndex)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public LoadPreset(PresetIndex: number): void {
|
|||
|
if (this.Idol == null) {
|
|||
|
console.error(`TsCharacterItem@LoadPreset error: idol is null`);
|
|||
|
return;
|
|||
|
}
|
|||
|
this.Idol.PropComp.ServerLoadPropPreset(PresetIndex);
|
|||
|
}
|
|||
|
|
|||
|
public PreviewPreset(PresetIndex: number): void {
|
|||
|
if (this.Idol == null) {
|
|||
|
console.error(`TsCharacterItem@PreviewPreset error: idol is null`);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.Idol.PropComp.ClientLoadPropPreset(PresetIndex);
|
|||
|
this.RefreshPresetUIStatus()
|
|||
|
}
|
|||
|
```
|