[开发者心得] 7-8月份编辑器踩坑分享

[复制链接]
997 |1
俊记牛腩面 发表于 2023-9-11 16:13:07 | 显示全部楼层 |阅读模式
本帖最后由 俊记牛腩面 于 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的名字。
image.png image.png
025升026编辑器编译的结果可能有区别,如果Subdata类编译结果不一样,会导致025和026两个版本把相同类的数据存到两个地方,旧的数据就读不到了。
比如,025及之前editor编译后,BattleData类被编译成_BattleData, 026编译成BattleData,这样026发的游戏里就会有两个BattleData,一个带_,一个不带。导致旧数据丢失。新数据冗余。
image.png image.png
解决办法:
在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渲染不完全
缺陷描述:

解决方法:
可以将世界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

image.png image.png
解决方法:可以使用selectOptions替换字符串类型枚举
@Core.Property({ displayName: "strType", selectOptions: { "e0": "1", "e1": "2", "e2": "4" } })
public str: string = "1";

8.025脚本吸管属性无法通过拖动吸取对象树中的对象
解决方法:
026已修复。但修改了吸管的使用方式。
  • 旧方法:在对象树中拖拽对象到吸管属性中。
  • 新方法:在属性面板中点击吸管的吸附功能,再点击对象树中要吸取的对象。
b054b3dd-1c5b-4ba0-9549-89241aac6f17.gif



回复

使用道具 举报

吃到苦就是得到了甜 发表于 2023-9-13 08:56:01 来自手机 | 显示全部楼层
学学
回复

使用道具 举报

72小时热榜
热门版块
快速回复 返回顶部 返回列表