unity3鼠标点击移动
admin
2023-03-15 07:41:21
0

这个总共可以分为三个部分:
第一:如何取得目标地点
第二:看向目标地点,并向其移动
第三:障碍物判断
我们先看第一个问题如何获得目标点:首先打开unity3d,新建一个工程档。
创建一个Cube调整大小,制作成地面的形式,并修改名称为“ floor ”把摄像机调整到适合的角度。
创建一个C#脚本,命名为“Pathfinding ”。
在脚本中输入以下代码:
void Update ()
        {
                
                //当单机鼠标
                void Update ()
        {
                
                if(Input.GetMouseButtonDown(0))
                {

                          //定义一条从主相机射向鼠标位置的一条射向
                        Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
                        RaycastHit hit;
                        //判断射线是否发生碰撞                
                        if (Physics.Raycast(ray, out hit, 100))
                        {
                                //判断碰撞物体是否为floor
                                if(hit.collider.gameObject.name=="floor")
                                {

                                        //打印出碰撞点的坐标
                                        Debug.Log(hit.point);
                                }
                        }
                }
           }
将代码添加到我们的相机物体上,运行游戏,鼠标在我们创建的地面上点击,控制台就会输出点击点的坐标,
通过上面的简单的例子,我们就可以得到目的点的坐标,具体做法:当我们点击鼠标时,从我们的摄像机朝我们鼠标的方向发射一条射线,当射线与地面发生碰撞时,输出碰撞点的坐标,这个坐标就是鼠标点击到地面的点的坐标,也就是目标点坐标。
  坐标点已经找到了,下面一部就是要让我们的游戏物体看向这个坐标点,
  有一种简单的方法就是直接让我们的主角lookat这个坐标点。
  下面我们新建一个游戏对象,作为我们的主角并修改名称为person”;
   补充脚本如下:
   private GameObject play;        
        void Start ()
        {
                play=GameObject.Find("person");
        }
        // Use this for initialization
        void Update ()
        {
                
                if(Input.GetMouseButtonDown(0))
                {
                        Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
                        RaycastHit hit;
                                        
                        if (Physics.Raycast(ray, out hit, 100))
                        {
                                
                                if(hit.collider.gameObject.name=="floor")
                                {
                                        Debug.Log(hit.point);
                                        play.transform.LookAt(hit.point);
                                        
                                }
                        }
                }

             }
运行游戏,当我们点击地面时,游戏物体旋转方向看向我们点击的点,
这样做有一个问题,主角会瞬间旋转到我们需要的角度,我们现在要控制他的旋转速度,让其缓慢旋转。
这就要用到另外一种做法;用到四元数组transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, Time.time * speed);
from.rotation为初始角度,
to.rotation为目标角度
  speed为旋转速度,
利用者个方法,我们就可以实现让物体缓慢旋转到我们要的指定角度,
具体做法,新建一个空物体,命名为To_rotation,将其作为person 物体的子物体,
代码补充如下:
        public Transform to;
        public float speed = 5F;
        private GameObject play;
        
        void Start ()
        {
                play=GameObject.Find("person");
                to=GameObject.Find("To_rotation ");
               
        }
        // Use this for initialization
        void Update ()
        {
                
                if(Input.GetMouseButtonDown(0))
                {
                        Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
                        RaycastHit hit;
                                        
                        if (Physics.Raycast(ray, out hit, 100))
                        {
                                
                                if(hit.collider.gameObject.name=="floor")
                                {
                                        Debug.Log(hit.point);
                                        //点击地面后解除to的父子关系;并让我lookat目标点;
                                        to.transform.parent = null;
                                        to.LookAt(hit.point);
                                }
                        }
                }

                //如果我们的play 的旋转角度与to的角度相同,则恢复其父子关系,并将其坐标归零
                if(play.transform.rotation==to.rotation)
                {
                        to.transform.parent=play.transform;
                        to.transform.localPosition = new Vector3(0, 0, 0);


                }
                else

                       //如果play  与to的角度不同,则旋转play至to所在的角度
                        play.transform.rotation = Quaternion.Slerp(play.transform.rotation, to.rotation, speed);
                        

        }
执行代码,的到我们想要的效果;

 


相关内容

热门资讯

【今日要闻】“巴郎新疆麻将.是... 您好:巴郎新疆麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款...
重磅消息“乐酷牛牛.开挂神器?... 您好:乐酷牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
今日重大发现“问鼎娱乐.有挂吗... 今日重大发现“问鼎娱乐.有挂吗?”透视曝光猫腻您好,问鼎娱乐这个游戏其实有挂的,确实是有挂的,需要了...
最新引进“棋乐麻将.可以开挂吗... 有 亲,根据资深记者爆料棋乐麻将是可以开挂的,确实有挂(咨询软件无需打开...
大批特战部队和装备进驻加勒比,... 【文/观察者网 柳白】加勒比海局势持续紧张。美国《华尔街日报》12月23日刊文称,本周美国已向加勒比...
终于了解“兴动棋牌麻将.可以开... 有 亲,根据资深记者爆料兴动棋牌麻将是可以开挂的,确实有挂(咨询软件无需...
最高检发布典型案例:恶势力团伙... 澎湃新闻记者 刘璐招募未成年学生到KTV、酒吧、音乐餐厅等娱乐场所从事有偿陪侍、卖淫活动,恶势力团伙...
终于懂了“微乐四川麻将.辅助器... 有 亲,根据资深记者爆料微乐四川麻将是可以开挂的,确实有挂(咨询软件无需...
玩家分享攻略“皇豪众娱牛牛.到... 网上科普关于“皇豪众娱牛牛有没有挂”话题很是火热,小编也是针对皇豪众娱牛牛作*弊开挂的方法以及开挂对...
英国政府宣布禁止活煮龙虾、螃蟹... 【文/观察者网 齐倩】“活煮龙虾和螃蟹,不可接受。”英国政府当地时间12月22日发布的动物保护新规,...