背景:依稀记得,Laya引擎版本2.3之后,3D物体对象属性的meshRender 就不暴露【_visible】属性,好像也找不到其他属性代替这个【不满足开发需求~】,至于为啥?
备菜环节【此改动是基于JS创建的3D示例项目,暂无TS跟AS版】:
1:导出一个结尾文件为【.ls】格式的、简陋的、落落大方的unity场景文件
为了体现区别,我先将两个3D物体移出摄像头范围内:啊【red】跟啊【blue】
导出场景文件就不介绍了~( 略 * 3 )
2: 【LayaAir IDE 2.8.0beta】 创建【3D示例项目】--> 构建UI --> 绑定场景runTime脚本
本来想图文并茂的,但是这些都不是重点,所以
laya场景编译运行效果图如下
重点
找到 bin/libs/laya.d3.js 文件,搜字眼:static _traversalCulling ,(大概在11747行)
static _traversalCulling(cameraCullInfo, scene, context, renderList, customShader, replacementTag, isShadowCasterCull) {
var renders = renderList.elements;
var boundFrustum = cameraCullInfo.boundFrustum;
var camPos = cameraCullInfo.position;
var cullMask = cameraCullInfo.cullingMask;
var loopCount = Laya.Stat.loopCount;
for (var i = 0, n = renderList.length; i < n; i++) {
var render = renders[i];
var canPass;
if (isShadowCasterCull)
canPass = render._castShadow && render._enable;
else
canPass = ((Math.pow(2, render._owner._layer) & cullMask) != 0) && render._enable;
if (canPass) {
Laya.Stat.frustumCulling++;
if (!cameraCullInfo.useOcclusionCulling || render._needRender(boundFrustum, context)) {
render._renderMark = loopCount;
render._distanceForSort = Vector3.distance(render.bounds.getCenter(), camPos);
var elements = render._renderElements;
for (var j = 0, m = elements.length; j < m; j++)
elements[j]._update(scene, context, customShader, replacementTag);
}
}
}
}
在这个代码块里面添加【_visible】属性;
static _traversalCulling(cameraCullInfo, scene, context, renderList, customShader, replacementTag, isShadowCasterCull) {
var renders = renderList.elements;
var boundFrustum = cameraCullInfo.boundFrustum;
var camPos = cameraCullInfo.position;
var cullMask = cameraCullInfo.cullingMask;
var loopCount = Laya.Stat.loopCount;
for (var i = 0, n = renderList.length; i < n; i++) {
var render = renders[i];
var canPass;
if (isShadowCasterCull)
canPass = render._castShadow && render._enable;
else
canPass = ((Math.pow(2, render._owner._layer) & cullMask) != 0) && render._enable;
if (canPass) {
Laya.Stat.frustumCulling++;
if (!cameraCullInfo.useOcclusionCulling || render._needRender(boundFrustum, context)) {
render._renderMark = loopCount;
render._visible = true;
render._distanceForSort = Vector3.distance(render.bounds.getCenter(), camPos);
var elements = render._renderElements;
for (var j = 0, m = elements.length; j < m; j++)
elements[j]._update(scene, context, customShader, replacementTag);
}else{
render._visible = false;
}
}else{
render._visible = false;
}
}
}
然后保存,编译运行,实时输出3D物体是否在摄像机视野范围内的真假状态
附上场景UI截图 与 测试代码:
export default class Main01 extends Laya.Scene {
constructor() {
super()
Main01.instance = this;
}
onAwake() {
// 获取UI根文件
this.root = Laya.stage.getChildByName("root");
}
/**
* 测试物体是否在摄像机范围内
*/
onOpened() {
let _this = this;
Laya.loader.create(["scenes/LayaScene_Main/Conventional/Main.ls"], Laya.Handler.create(this, function () {
_this.Main = Laya.loader.getRes("scenes/LayaScene_Main/Conventional/Main.ls");
_this.Main.name = "Main";
_this.camera = this.Main.getChildByName("Main Camera");
_this.camera.addComponent(CameraMoveScript);
Laya.stage.addChild(_this.Main);
Laya.timer.loop(1, this, function () {
console.log("【")
console.log("white is visible:", _this.Main.getChildByName("white").meshRenderer._visible)
console.log("pick is visible:", _this.Main.getChildByName("pick").meshRenderer._visible)
console.log("blue is visible:", _this.Main.getChildByName("blue").meshRenderer._visible)
console.log("red is visible:", _this.Main.getChildByName("red").meshRenderer._visible)
console.log("】")
_this.tips.text =
"【white:" + _this.Main.getChildByName("white").meshRenderer._visible+ "】" +
"【pick:" + _this.Main.getChildByName("pick").meshRenderer._visible+ "】" +
"【blue:" + _this.Main.getChildByName("blue").meshRenderer._visible+ "】" +
"【red:" + _this.Main.getChildByName("red").meshRenderer._visible + "】"
})
// 确保UI层级比三维场景层级高
_this.root.zOrder = _this.Main.zOrder + 1
}))
}
}
最后,附上测试结果图:
================>>>>>>>>>>>>>>>>>>>> 终。