美文网首页
Unity学习笔记——地图上放置和移动建筑(未完成)

Unity学习笔记——地图上放置和移动建筑(未完成)

作者: 阿克西亚 | 来源:发表于2018-02-07 17:19 被阅读87次

具体思路为鼠标向建筑发射一条射线,建筑沿着方向再发射一条射线检测是否有其他建筑,但是这样是以点来检测的,需要改为范围检测。如果实现了放置需要检测射线点距离格子四点距离来修改标志位,判断格子是否被放置,更为准确。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClickModels : MonoBehaviour {
    public string clickObjName = null;//被射线击中的第一个对象的名称
    public string clickObjName2 = null;//被射线击中的第一个对象的名称
    public bool putDown = true;//对象是否被放下标志位
    public GameObject clickedBuilding;//鼠标选中的对象
    public GameObject terrain;//获取地图
    void Update () {
        ClickBuildings();
    }
    void ClickBuildings() {
        //声明屏幕到3D世界的射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit = new RaycastHit();
        if (Physics.Raycast(ray, out hit)) {
            Debug.DrawLine(ray.origin, hit.point, Color.red);//从鼠标到碰撞点画线
            if(putDown)//如果对象已经被放下才能更新射线集中的建筑
                clickObjName = hit.transform.name;
            if (clickObjName == "Terrain")//如果射线击中了地形,返回
                return;
            Vector3 clickedPos = hit.point;//声明对象被选中后的坐标
            clickedPos.y = terrain.transform.position.y+0.1f;//修改物体y坐标比地形y坐标高0.1
            clickedBuilding = GameObject.Find(clickObjName);//声明被选中的对象
            //clickObjName2 = null;
            if (Input.GetMouseButtonDown(0)) {//如果按下鼠标左键,对象被抬起
                Ray ray2 = new Ray(hit.point, ray.direction);
                RaycastHit hit2 = new RaycastHit();
                if(Physics.Raycast(ray2,out hit2)) {
                    clickObjName2 = hit2.transform.name;
                    if (clickObjName2 != null) {
                        if (clickObjName2 != "Terrain") {
                            Debug.Log("此处无法放置建筑!");
                            return;
                        } 
                    }
                }
                putDown = !putDown;
            }
            if (putDown == false) {//如果对象没有放下
                clickedBuilding.transform.position = clickedPos;//更新对象世界坐标
                if (Input.GetKeyDown(KeyCode.Q)) {//如果按下Q、E,旋转对象
                    clickedBuilding.transform.Rotate(0,-90,0);
                }else if (Input.GetKeyDown(KeyCode.E)) {
                    clickedBuilding.transform.Rotate(0, 90, 0);
                }
            }
        }
    }
}

相关文章

网友评论

      本文标题:Unity学习笔记——地图上放置和移动建筑(未完成)

      本文链接:https://www.haomeiwen.com/subject/hqjazxtx.html