void Update() { if (isBuilding)//点击了按钮 { ray = mainCamera.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(ray.origin, ray.direction, Color.red); if (Physics.Raycast(ray, out hit, 100, ~(1 << 5) | ~(1 << 8) | ~(1 << 11) | ~(1 << 12))) //射线检测,除去人和UI { if (isDeleting == true) //如果是删除状态 { requiredQuad.SetActive(true); requiredQuad.transform.position = new Vector3(Round(hit.point.x, 0), 0.031f, Round(hit.point.z, 0)); //quad.transform.position = hit.collider.gameObject.GetComponent<Transform>().position; if (Input.GetMouseButtonDown(0))//删除物体 { var cols = Physics.OverlapBox(requiredQuad.transform.position, new Vector3(0.5f, 0.5f, 0.5f), requiredQuad.transform.rotation); GameObject obj = null; foreach (var c in cols) { if (c.gameObject.tag == "spacers") { obj = c.gameObject; } } if (obj != null) { Destroy(obj); } foreach (var keyvalue in CitizenMgr.CitizensDict) { Citizen c = keyvalue.Value; if (c.bMovingToHosp || c.bWaitingForHosp) { c.bRecalculatePathKey = true; } } } } //Debug.Log(hit.collider.gameObject.name); else if (hit.collider != null)//碰撞体不为空,打开格子 { requiredQuad.SetActive(true); //quad.transform.position = hit.collider.gameObject.GetComponent<Transform>().position; requiredQuad.transform.position = new Vector3(Round(hit.point.x, 0), 0.031f, Round(hit.point.z, 0)); //Debug.Log(hit.collider.gameObject.name); if (Input.GetMouseButtonDown(0)) //点击左键生成物体 花费金钱 进入冷却 { if (!UIControl.GetOverUI()) //判断是否在建造前点击其他建造按钮 { if (hit.collider.gameObject.tag == "SpawnPlane" || hit.collider.gameObject.tag == "Plane" || hit.collider.gameObject.tag == "road" || needTag == "all") //如果已经有建筑 { if (needTag == hit.collider.gameObject.tag || needTag == "all") //判断需要建造在路上还是plane { GameObject[] objs = ScanAround(requiredQuad.transform.position); int[] dir = roadDir(objs); if (dir[0] == 1 && preBuildGameObject == spacers)//如果是十字路且是隔离带 { Broadcast.Instance.AddString("十字路口不能建造隔离带", Color.red); } else if (dir[0] == -1 && preBuildGameObject == hosipatal) { Broadcast.Instance.AddString("医院旁需要道路", Color.red); } else if (selectedObject.GetComponent <CDControl>().isCoolingDown())//判断是否冷却完成 { selectedObject.GetComponent <CDControl>().startCooling(coolingTime); if (preBuildGameObject == AmbulancePrefab) { //救护车代码 救助位置 requiredQuad.transform.position + offsetValue - new Vector3(0, 0.031f, 0) // Broadcast._instance.AddString("救护车出动",Color.black); Vector3 rescurePos = requiredQuad.transform.position + offsetValue - new Vector3(0, 0.031f, 0); float minDist = float.MaxValue; Hospital nearHospital = CitizenMgr.HospitalsList[0]; foreach (Hospital hos in CitizenMgr.HospitalsList) { float dist = Vector3.Distance(rescurePos, hos.CheckPoint.position); if (minDist > dist) { minDist = dist; nearHospital = hos; } } Ambulance ambulance = Instantiate <GameObject>(Resources.Load <GameObject>("MaxLykoS/Prefabs/Ambulance"), nearHospital.CheckPoint.position, Quaternion.Euler(0, 90, 0)).AddComponent <Ambulance>(); ambulance.Init(nearHospital, rescurePos); } else { var o = Instantiate(preBuildGameObject); o.GetComponent <Transform>().position = requiredQuad.transform.position + offsetValue - new Vector3(0, 0.031f, 0); //暂时调整y,之后用shader调整 if (preBuildGameObject == spacers) //如果是隔离带,则需要判断方向 { if (hit.collider.gameObject.GetComponent <Transform>().localScale.x > hit.collider.gameObject.GetComponent <Transform>().localScale.y) { o.transform.eulerAngles = new Vector3(0, 90, 0); } foreach (var keyvalue in CitizenMgr.CitizensDict) { Citizen c = keyvalue.Value; if (c.bMovingToHosp || c.bWaitingForHosp) { c.bRecalculatePathKey = true; } } } else if (preBuildGameObject == hosipatal) { o.transform.SetParent(GameObject.Find("Scene/HospitalsRoot").transform); Hospital newHosp = o.GetComponent <Hospital>(); newHosp.Init(); CitizenMgr.HospitalsList.Add(newHosp); //触发器绕医院旋转角度 Vector3 point = Quaternion.AngleAxis(dir[1] * -1 * 90, Vector3.up) * (o.transform.GetChild(0).position - o.transform.position); o.transform.GetChild(0).position = o.transform.position + point; //o.transform.eulerAngles = new Vector3(0, dir[1] * -1 * 90 + o.transform.eulerAngles.y, 0); } } if (GameManager._instance.money - costValue > 0) { GameManager._instance.money -= costValue; } else { Broadcast.Instance.AddString("金钱不足", Color.red); } requiredQuad.SetActive(false); isBuilding = false; } else//控制冷却 { Broadcast.Instance.AddString("冷却未完成", Color.red); } } else//控制建造位置 { Broadcast.Instance.AddString("这里不能建造", Color.red); } } else { Debug.Log(hit.collider.gameObject.tag); Broadcast.Instance.AddString("这里不能建造", Color.red); } } } } else//如果射线碰到物体时显示格子 { requiredQuad.SetActive(false); } } if (Input.GetMouseButtonDown(1))//右键取消建造 { isBuilding = false; requiredQuad.SetActive(false); } } }