Three.js数组存储对象位置设置:遇无法读取x属性未定义错误
解决“无法读取undefined的x属性”问题
我来帮你梳理下这个问题的可能原因和解决方案~
首先,你遇到的核心矛盾是:明明console.log(sceneObjects['player'])能输出完整的THREE.MorphAnimMesh对象,但在animate函数里访问它的position.x时却报错,这大概率是执行时机或者数据结构使用不当导致的。
1. 先修正sceneObjects的数据结构
你现在用数组来存储对象,同时又给数组添加字符串键(sceneObjects[name] = what),这其实违背了数组的设计初衷——数组是用来存储有序、数字索引的集合,而键值对存储更适合用普通对象。这种混用可能会导致一些意想不到的访问异常。
建议把sceneObjects改成普通对象:
// 初始化时用对象而非数组 const sceneObjects = {};
然后修改addToGlScene函数,去掉不必要的数组push操作(如果不需要维护有序对象列表的话):
function addToGlScene(what, name, glow, storage) { glScene.add(what); what.name = name; // 直接以键值对形式存储对象 sceneObjects[name] = what; what.userData.glow = { glow: glow }; what.userData.storage = { storage: storage }; }
2. 确保animate执行时对象已存在
另一个常见原因是:animate函数可能在你调用addToGlScene添加player对象之前就已经启动了。第一次执行animate时,sceneObjects['player']还未被赋值,自然会触发“无法读取undefined的x属性”的错误。
你可以在animate里先做存在性检查,再执行移动逻辑:
function animate() { requestAnimationFrame(animate); // 先确认player对象已存在,再操作position if (sceneObjects.player) { sceneObjects.player.position.x += 1; } // 其他渲染逻辑 renderer.render(glScene, camera); }
3. 排查作用域问题
还要确保sceneObjects是在animate和addToGlScene都能访问到的作用域里(比如全局作用域,或者同一个模块作用域),如果其中一个函数无法访问到这个变量,也会导致类似的错误。
按照上面的步骤调整后,应该就能正常修改对象的x轴位置了~
内容的提问来源于stack exchange,提问作者Nik Hendricks
相关产品推荐
相关产品推荐

