Laya3D小项目中的踩坑历程

.lh or .ls

测试Unity导出的Scene(仅包含3D球架)在导入Laya后的显示,发现若导出.lh文件,在Laya创建的Scene中挂载脚本运行时会报“cannot read ‘_addCamera’ of undefined”错误,解决此问题时选择重新导出.ls文件

相应脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { ui } from "./../ui/layaMaxUI";
export default class SmallScene extends Laya.Script {
constructor() { super(); }

onEnable(): void {
Laya3D.init(0, 0);
Laya.Stat.show();
Laya.stage.scaleMode = Laya.Stage.SCALE_FULL;
Laya.stage.screenMode = Laya.Stage.SCREEN_NONE;
Laya.Scene3D.load("res/Loading/LayaScene_SmallScene/Conventional/SmallScene.ls", Laya.Handler.create(null, function(scene:Laya.Scene3D):void {
Laya.stage.addChild(scene) as Laya.Scene3D;
}));
}

onDisable(): void {
}
}
new SmallScene;
导出文件说明:

ls — 场景文件: Json文件,包含场景中所有节点的数据信息,包含光照贴图信息
lh — 层级文件: Json文件,包含场景中所有节点的数据信息,不包含光照贴图信息
lt — 地形文件: Json文件,包含地形中的数据信息
lm — 网格文件: 二进制文件,包含模型所有顶点的数据信息
lmat — 材质文件: Json文件,包含光照,贴图,渲染模式等基本材质信息
lsani — 蒙皮动画文件:二进制文件,包含骨骼动画帧率信息
lrani — 刚体动画文件:二进制文件,包含刚体动画帧率信息
lav — 新版动画节点文件:Json文件,只包含Animator组件下节点的数据信息
lani — 新版动画文件:二进制文件,包含Animator动画帧率信息

Mesh Collider 和 Box Collider的选择:

篮筐处有两个Trigger,一个在篮筐一个在篮网,篮筐环附近用Box Collider(元碰撞器),篮网用Mesh Collider(网格),后者渲染时消耗资源比前者大很多

如何进一步操作导入的Scene中的子对象?

laya.display.Node

测试时在Laya.Scene3D.load的call中添加:

1
console.log("scene.numChildren:", scene.numChildren);

可在运行时查看scene中的子对象个数

其他类似操作代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
Laya.Scene3D.load("res/Loading/LayaScene_SmallScene/Conventional/SmallScene.ls", Laya.Handler.create(null, function(scene:Laya.Scene3D):void {
//myScene = scene;
Laya.stage.addChild(scene) as Laya.Scene3D;
//var camera = new Laya.Camera(0, 3, 10);
//scene.addChild(camera);
console.log("scene.numChildren:", scene.numChildren);
let sprite:Laya.Sprite3D = new Laya.Sprite3D();
scene.addChildAt(sprite, 5);
console.log(scene.getChildAt(3).name);
console.log(scene.getChildAt(4).name);
console.log(scene.getChildAt(5).name);
}));

getChildName

关于Laya.Handler.create

Handler是事件处理器类

laya.utils.Handler

create(caller:*, method:Fuction, args:Array = null, once:Boolean = true): Handler

caller:* -执行域(this)

method:Function -回调方法

args:Array -携带的参数

once:Boolean -是否只执行一次,默认为true

注意once后或者Handler.recover()后不要再使用此对象

流程

GolbalDataScene -> StartScene -> LoadingScene -> GameScene

GolbalDataScene/GameStaticController/ConfigController中控制加载Assets/Resources/Config中的BallsData和StageData

一些说明

每个Scene中的UIController是用相同的BSK Manager脚本,即,所有场景能用到的UI相关的管理控制都放在这个脚本,其他通用的Cotorller也如此

reset球的函数在BSKGameController -> resetBalls,设置了篮球的初始化位置,Rotation,layer,放到balls列表(但是没有设置其物理属性如重力、碰撞)

给篮球(balls)获取BSKBall组件、添加刚体、并且siKinematic = true使物理影响刚体在BSKShooter中的Update函数中(Update每一帧都调用)

在Laya中创建的对应脚本的类型的选择要考虑Unity中对应脚本是否有Update等逐帧刷新的功能

对Unity中具有Update等逐帧刷新的Component(Monobehavior),在Laya中创建对应脚本所选类型要考虑是否有相同逐帧刷新的内置函数

BSKBall -> Start函数:

1
gameObject.GetComponent<Renderer>().material = BSKGameConfig.s_Instance.GetBallMaterial();

篮球资源是如何加载进去的:在BSKGameController声明一个GameObject对象-BallPrefab,然后在Unity的Inspector中可以直接选取需要的“lanqiu”资源

将Unity中的Scene导入Laya时,games_bg不能导入,因为不支持Sprite Renderer