參考:
一 常用資源類型
場景 .ls
預設 .lh
模型網格 .lm
材質 .lmat
動畫文件 .lani
貼圖 .jpg .png .ltc等
二 場景加載
下面加載XunLongShi(馴龍師?)場景,並創建攝像機和光照到場景中。

ResourceDemo.ts:
export default class ResourceDemo extends Laya.Script{
constructor() {
super();
//3d場景加載
Laya.Scene3D.load("res/threeDimen/scene/XunLongShi/XunLongShi.ls",Laya.Handler.create(this,function(scene){
Laya.stage.addChild(scene);
//添加相機
var camera = new Laya.Camera();
scene.addChild(camera);
//設置相機清楚標記,使用天空
camera.clearFlag = Laya.BaseCamera.CLEARFLAG_SKY;
//調整相機的位置
camera.transform.translate(new Laya.Vector3(3, 20, 47));
//添加光照
var directionLight = scene.addChild(new Laya.DirectionLight());
directionLight.color = new Laya.Vector3(1, 1, 1);
directionLight.transform.rotate(new Laya.Vector3( -3.14 / 3, 0, 0));
}));
}
}
加載后顯示效果

加載場景時,雖然只加載.ls文件。但是.ls文件內所有的相關資源都加載了下來。例如下圖中的Skybox.lmat等。
場景.ls、材質.lmat等加載方式也是一樣,凡是文件內的資源都會被自動加載。
XunLongShi.ls:

三 材質加載
下面加載天空盒材質,並賦值給天空渲染器。

| - 天空網格
天空的組成 = 天空渲染器模型 -|
| - 天空材質 - 天空紋理
ResourceDemo.ts:
//材質加載
Laya.BaseMaterial.load("res/threeDimen/skyBox/skyBox2/skyBox2.lmat", Laya.Handler.create(null, function(mat){
//獲取相機的天空渲染器
var skyRenderer:Laya.SkyRenderer = camera.skyRenderer;
//創建天空盒的mesh
skyRenderer.mesh = Laya.SkyBox.instance;
//設置天空盒材質
skyRenderer.material = mat;
}));
加載skyBox2.lmat文件時,它所包含的文件以及子文件都會被加載。
skyBox2.lmat:

天空顯示效果

四 紋理加載
加載地球紋理,並賦值給一個球體模型。

|- 網格PrimitiveMesh
地球的組成 = 地球模型MeshSprite3D -|
|-材質 BlinnPhongMaterial - 紋理earth.png
ResourceDemo.ts:
Laya.Texture2D.load("res/threeDimen/texture/earth.png", Laya.Handler.create(null, function(tex):void {
//使用紋理
var earth1 = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createSphere(5, 32, 32))) as Laya.MeshSprite3D;
earth1.transform.translate(new Laya.Vector3(17, 20, 0));
var earthMat = new Laya.BlinnPhongMaterial();
earthMat.albedoTexture = tex;
earthMat.albedoIntensity = 1;
earth1.meshRenderer.material = earthMat;
}));
顯示效果

五 網格加載
下面加載猴子網格,並賦值給一個模型。

|- 網格MeshSprite3D
猴子組成 = -|
|- 材質 (沒有材質,猴子是白色的)
Laya.Mesh.load("res/threeDimen/skinModel/LayaMonkey/Assets/LayaMonkey/LayaMonkey-LayaMonkey.lm", Laya.Handler.create(this, function(mesh) {
var layaMonkey = scene.addChild(new Laya.MeshSprite3D(mesh));
layaMonkey.transform.localScale = new Laya.Vector3(4, 4, 4);
layaMonkey.transform.rotation = new Laya.Quaternion(0.7071068, 0, 0, -0.7071067);
layaMonkey.transform.translate(new Laya.Vector3(5, 3, 13));
}));
顯示效果

六 預設加載
下面加載預設,一只猴子。

|- 猴子網格
猴子預設(精靈) = 猴子模型 -|
|- 猴子材質 - 猴子紋理
Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(null, function(sp){
var layaMonkey2 = scene.addChild(sp);
layaMonkey2.transform.localScale = new Laya.Vector3(4, 4, 4);
layaMonkey2.transform.translate(new Laya.Vector3(-10, 13, 0));
}));
顯示效果。 猴子添加到舞台后,是帶動畫的。

七 加載動畫
下面加載一個胖子預設,並給胖子預設增加一個動畫。
如果沒Laya.AnimationClip.load加載動畫的話,胖子是靜止的。


|- 胖子網格
| 胖子模型 -|
胖子預設 = -| |- 胖子材質 - 胖子紋理
|
| 動畫組件 -| 動畫狀態1 - 動畫 lani
-| 動畫狀態2 - 動畫2 lani
//加載胖子精靈
Laya.Sprite3D.load("res/threeDimen/skinModel/BoneLinkScene/PangZiNoAni.lh", Laya.Handler.create(null, function(sp) {
let pangzi:Laya.Sprite3D;
pangzi = scene.addChild(sp);
pangzi.transform.localScale = new Laya.Vector3(4, 4, 4);
pangzi.transform.translate(new Laya.Vector3(10, 20, 0));
//獲取動畫組件
let pangziAnimator:Laya.Animator
pangziAnimator = pangzi.getChildAt(0).getComponent(Laya.Animator);
//AnimationClip的加載要放在Avatar加載完成之后
Laya.AnimationClip.load("res/threeDimen/skinModel/BoneLinkScene/Assets/Model3D/PangZi-Take 001.lani", Laya.Handler.create(null, function(aniClip) {
//創建動作狀態
var state1 = new Laya.AnimatorState();
//動作名稱
state1.name = "hello";
//動作播放起始時間
state1.clipStart = 0 / 581;
//動作播放結束時間
state1.clipEnd = 581 / 581;
//設置動作
state1.clip = aniClip;
//設置動作循環
state1.clip.islooping = true;
//為動畫組件添加一個動作狀態
pangziAnimator.addState(state1);
//播放動作
pangziAnimator.play("hello");
}));
}));
實際顯示效果

八 加載粒子
粒子就是一個lh,就是一個預設
Laya3D.init(0, 0);
Laya.stage.scaleMode = Laya.Stage.SCALE_FULL;
Laya.stage.screenMode = Laya.Stage.SCREEN_NONE;
Laya.Stat.show();
var scene:Laya.Scene3D = Laya.stage.addChild(new Laya.Scene3D()) as Laya.Scene3D;
var camera:Laya.Camera = scene.addChild(new Laya.Camera(0, 0.1, 100)) as Laya.Camera;
camera.transform.translate(new Laya.Vector3(0, 2, 4));
camera.transform.rotate(new Laya.Vector3( -15, 0, 0), true, false);
Laya.Sprite3D.load("threeDimen/particle/ETF_Eternal_Light.lh",Laya.Handler.create(this,function(sprite:Laya.Sprite3D):void{
scene.addChild(sprite) as Laya.Sprite3D;
}))
顯示效果

九 批量預加載
2D中使用Laya.loader.load批量加載資源
3D中使用Laya.loader.create批量加載資源
//批量預加載方式
PreloadingRes(){
//預加載所有資源
var resource:Array = ["res/threeDimen/scene/TerrainScene/XunLongShi.ls",
"res/threeDimen/skyBox/skyBox2/skyBox2.lmat",
"res/threeDimen/texture/earth.png", "res/threeDimen/skinModel/LayaMonkey/Assets/LayaMonkey/LayaMonkey-LayaMonkey.lm",
"res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh",
"res/threeDimen/skinModel/BoneLinkScene/PangZiNoAni.lh",
"res/threeDimen/skinModel/BoneLinkScene/Assets/Model3D/PangZi-Take 001.lani",];
Laya.loader.create(resource, Laya.Handler.create(this, this.onPreLoadFinish));
}
onPreLoadFinish() {
//初始化3D場景
_scene = Laya.stage.addChild(Laya.Loader.getRes("res/threeDimen/scene/TerrainScene/XunLongShi.ls"));
//獲取相機
var camera = _scene.getChildByName("Main Camera");
//設置相機清楚標記,使用天空
camera.clearFlag = Laya.BaseCamera.CLEARFLAG_SKY;
//調整相機的位置
camera.transform.translate(new Laya.Vector3(0, 45, -60));
camera.transform.rotate(new Laya.Vector3(0, 180, 0), false, false);
//相機視角控制組件(腳本)
camera.addComponent(CameraMoveScript);
}

