本帖最后由 俊记牛腩面 于 2023-9-11 16:13 编辑
1.人形对象设置父级对象后,修改父级对象的坐标,人形对象不会跟着改变位置
踩坑描述:
设计如此。现在npc的实现方式是一个mwactor + character 的结构。父子关系应该挂的是mwactor 但是 mwactor和character是没有父子关系的。
如果setMesh的时候这个资源不是换装资源,会把后面的换装卡住 给character的worldLocation赋非法值时,会导致项目崩溃或游戏异常,有时没有报错,不易排查
踩坑描述:
let height: number = undefined;
let vec: Vector = new Vector(0, 0, 10 + height);
Gameplay.getCurrentPlayer().character.worldLocation = Gameplay.getCurrentPlayer().character.worldLocation.add(vec);
解决办法 :
2.加载角色时会概率性触发场景上的触发器逻辑
解决办法 :
尽量不要把出生点放在触发器上
3.026使用Core.Script.spawnScript()偶现没有同步到客户端
踩坑描述:
偶现服务端core.script.spawnScript()创建脚本没有同步到客户端,客户端脚本的onStart未执行
/** * 初始化玩家脚本 * @param playerId */
public async initPlayer(playerId: number) {
let playerInfo = await Core.Script.spawnScript(PlayerInfo);
MapEx.set(this._playerMap, playerId, playerInfo);
}
解决办法 :
将脚本保存为预制体,通过生成预制体来生成脚本
public async initPlayer(playerId: number) {
let playerInfoPrefab = await Core.GameObject.asyncSpawnGameObject("2132AF8C45A9C0EA12467CA0ABCECED8", true);
let script = await playerInfoPrefab.asyncGetScriptByName("PlayerInfo");
let playerInfo = script as PlayerInfo; playerInfo.scriptPlayerId = playerId;
MapEx.set(this._playerMap, playerId, playerInfo);
this._playerInfoPrefabMap.set(playerId, playerInfoPrefab);
}
4.025升026编辑器编译结果不同,Subdata类的编译结果可能不同,导致出现一份新数据,不再获取旧数据 '
'踩坑描述: 目前Subdata默认使用数据类的类名来作为模块data的名字。
025升026编辑器编译的结果可能有区别,如果Subdata类编译结果不一样,会导致025和026两个版本把相同类的数据存到两个地方,旧的数据就读不到了。
比如,025及之前editor编译后,BattleData类被编译成_BattleData, 026编译成BattleData,这样026发的游戏里就会有两个BattleData,一个带_,一个不带。导致旧数据丢失。新数据冗余。
解决办法 :
在Subdata类里重写 get dataName() ,这样可以锁定存档的类名,不会出现相同类重复创建存档的情况。
export class BattleRankDataHelper extends Subdata {
get dataName() {
return "_BattleRankDataHelper";
}
public initDefaultData(): void {...}
}
5.027确认不再支持ModuleS的 net_方法中带可选参数Player,需要删除。
描述:
之前的使用方法:
// ModuleCreqSomething(){
this.server.net_reqSomething();
}
// ModuleSnet_reqSomething(player?: Gameplay.Player){
let playerId = player.getPlayerId();
...// doSomething
}
027将不再支持这种使用方法。会导致下面的问题:
// 服务端方法内调用player逻辑会被中断
net_test(player?: Player) {
console.log("net_test");
console.log("player", player.playerId);// 这里会被中断,客户端也等不到返回值
console.log("aaaaaa");
return "uuuuu";
}
解决方案:
一. 不在net_参数中带player,在方法中使用 this.currentPlayerId/ this.currentPlayer/ this.currentData来获取对应玩家信息
// ModuleSnet_test() {
console.log("aaaaaa", this.currentPlayer.playerId, this.currentPlayerId)
return "uuuuu"
}
二.将可选参数player改成playerId,客户端多传一个playerId
// ModuleCasync test() {
let res = await this.server.net_test(this.localPlayerId);
}
// ModuleSnet_test(playerId: number) {
console.log("aaaaaa", playerId)
return "uuuuu"
}
6.动态创建的世界UI或者拖入到场景中的世界UI渲染不完全
缺陷描述:
Your browser does not support video tags.
解决方法:
可以将世界UI的几何体模式改为圆柱,再保存退出编辑器,再进入编辑器,给这个世界UI绑定UI,再将几何体模式改为平面运行游戏,查看世界UI对排行榜UI的渲染情况,修复这个bug。
7.脚本属性创建字符串类型的枚举属性无法显示下拉面板
缺陷描述:
字符串类型的枚举属性是输入框,数字枚举是下拉面板,不一致
enum NumEnum{
e0=1, e1=2, e2 = 4}enum StrEnum{
e0="1",
e1="2",
e2 = "4"}
@Core.Property({displayName:"数字枚举",enumType: NumEnum})
num: NumEnum = NumEnum.e0
@Core.Property ({displayName:"字符串枚举",enumType: StrEnum})
str: StrEnum = StrEnum.e0
解决方法: 可以使用selectOptions替换字符串类型枚举
@Core.Property({ displayName: "strType", selectOptions: { "e0": "1", "e1": "2", "e2": "4" } })
public str: string = "1";
8.025脚本吸管属性无法通过拖动吸取对象树中的对象
解决方法:
026已修复。但修改了吸管的使用方式。
旧方法:在对象树中拖拽对象到吸管属性中。 新方法:在属性面板中点击吸管的吸附功能,再点击对象树中要吸取的对象。