/// <summary> /// 当按下space时,捡起或放下工具或者材料 /// </summary> void PickOrLoad() { // 拾起的区域为角色面前的0.5格 Vector3 vecPickOrLoad = transform.position + transform.forward * 0.5f; // 画出单位方格,即可以碰撞的区域 DrawBoxForDebug(BoxExtents, new Vector3(vecPickOrLoad.x, 0.5f, vecPickOrLoad.z)); // 单位方格中的物体,只检测材料和工具 hitcollidersForward = Physics.OverlapBox(new Vector3(vecPickOrLoad.x, 0.5f, vecPickOrLoad.z), BoxExtents, Quaternion.identity, LayerMask.GetMask("Material", "Tool")); if (hitcollidersForward.Length >= 1) // 地上有东西 { // 查找最近的物体 closestObject = hitcollidersForward[0].gameObject; int i = 1; while (i < hitcollidersForward.Length) { // 比较距离,如果距离更近,则替换closestObject if (Vector3.Distance(transform.position, hitcollidersForward[i].transform.position) < Vector3.Distance(transform.position, closestObject.transform.position)) { closestObject = hitcollidersForward[i].gameObject; } i++; } // 根据角色手的状态捡起或放下工具或者材料 GameObject itemOnGround = closestObject.gameObject; // 地上的工具或材料 bool isTool = (itemOnGround.tag == "Tool"); switch (tm.handState) // 角色的手的状态 { case ToolManager.HANDSTATE.EMPTY: // 手里没有东西,可以拿工具或者材料 if (isTool) { tm.EquipTool(itemOnGround); } else { tm.EquipMaterial(itemOnGround); if (itemOnGround.name == "Rail") { tm.handState = ToolManager.HANDSTATE.RAIL; } } break; case ToolManager.HANDSTATE.TOOL: // 手里有工具,先放下工具,再拿起工具或者材料 if (isTool) { tm.UnloadTool(); tm.EquipTool(itemOnGround); } else { tm.UnloadTool(); tm.EquipMaterial(itemOnGround); } break; case ToolManager.HANDSTATE.MATERIAL: // 手里有材料,先放下材料,再拿起工具或者材料 if (isTool) // Todo : 判断手里材料类型 { tm.UnloadMaterial(); tm.EquipTool(itemOnGround); } else { if (tm.itemInHand.name == itemOnGround.name) // 如果是同种材料则堆叠 { tm.PileMaterial(itemOnGround); } else // 如果是不同种材料,则先放下材料,再拿起材料 { tm.UnloadMaterial(); tm.EquipMaterial(itemOnGround); } } break; default: break; } } else // 方格内的无工具或材料,即空地,可以放东西 { switch (tm.handState)// 角色的手的状态 { case ToolManager.HANDSTATE.EMPTY: // 手里没有东西,什么事也不做 Debug.Log("Nothing to pick up"); break; case ToolManager.HANDSTATE.TOOL: // 放下工具 tm.UnloadTool(); break; case ToolManager.HANDSTATE.MATERIAL: // 放下材料 Transform mat = tm.rightHand.transform.GetChild(0); if (mat.name == "Wood") { Transform wood = tm.GetWood(); if (!gameManager.BuildBridge(wood)) { tm.UnloadMaterial(); } else { tm.LessenMatNum(); } } else { tm.UnloadMaterial(); } break; case ToolManager.HANDSTATE.RAIL: Transform rail = tm.GetRail(); if (!gameManager.PutRail(rail.gameObject)) { tm.UnloadMaterial(); } else { tm.LessenMatNum(); } break; default: break; } } }