Unity脚本修改GameObject层失败:掉落物品层始终为Default的问询
解决Unity掉落物品层设置无效的问题
核心问题分析
你遇到的情况大概率是两个原因:一是层名拼写错误(你注释里写的Grababbles比目标层名Grabbables少了一个b),二是仅设置了父物体的层,但预制体包含子物体,子物体的层仍为Default,导致编辑器视觉上显示异常;另外也可能有其他脚本在实例化后覆盖了层设置。
有效解决方案
直接使用层编号(你指定的9)来设置,同时递归同步所有子物体的层,避免名称拼写问题和子物体层不同步的情况。
修改后的掉落逻辑代码
在实例化物品后,添加统一的层设置逻辑(可以放在所有物品类型判断之外,确保所有掉落物品都生效):
if(newClickedName == "Drop_Button"){ string tempItemName; int tempItemAmt; int tempItemWeight; var itemData = inventory.GetItemList()[itemElem]; tempItemName = itemData.itemType.ToString(); tempItemAmt = itemData.amount; tempItemWeight = itemData.weight; GameObject itemDropped = Instantiate(itemData.GetModel(), player.position, Quaternion.identity); itemDropped.SetActive(true); // --- 新增:统一设置掉落物品的层 --- int targetLayer = 9; // 对应Grabbables层的编号 SetLayerRecursively(itemDropped, targetLayer); // ------------------------------- // Edgecase to check if its Money: if(tempItemName == "Money"){ itemDropped.GetComponent<GrabMoneyStack>().currentMoneyAmt = tempItemAmt; itemDropped.GetComponent<GrabMoneyStack>().beingDropped = true; }else if(tempItemName == "Meth"){ itemDropped.GetComponent<DrugMethScript>().currentDrugAmt = tempItemAmt; itemDropped.GetComponent<DrugMethScript>().beingDropped = true; } } // 新增递归设置层的方法 void SetLayerRecursively(GameObject obj, int layer) { obj.layer = layer; foreach (Transform child in obj.transform) { SetLayerRecursively(child.gameObject, layer); } }
额外排查点
- 确认Unity编辑器中层编号9确实对应Grabbables:打开Edit > Project Settings > Tags and Layers,检查Layers列表里的编号。
- 检查物品预制体的脚本:如果预制体上的Awake/Start方法里有设置层的代码,会覆盖你在掉落逻辑中的设置,需要移除或调整执行顺序。
- 验证Debug输出:在设置层后添加
Debug.Log($"物品{tempItemName}的层已设置为:{itemDropped.layer},目标层编号:{targetLayer}");,确认层值是否正确。
内容的提问来源于stack exchange,提问作者EsC369
相关产品推荐
相关产品推荐

