Example #1
0
    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);
            }
        }
    }