博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3鼠标点击移动
阅读量:6211 次
发布时间:2019-06-21

本文共 2373 字,大约阅读时间需要 7 分钟。

这个总共可以分为三个部分:

第一:
如何取得目标地点

第二:看向目标地点,并向其移动

第三:障碍物判断

我们先看第一个问题如何获得目标点:首先打开
,新建一个工程档。

创建一个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, 
 * 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);

                        


        }

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

本文转自 宁金峰 51CTO博客,原文链接:http://blog.51cto.com/13243523/1976750,如需转载请自行联系原作者

你可能感兴趣的文章
coreData
查看>>
使用Matrix对象旋转和缩放图像
查看>>
JS 固定图片背景
查看>>
PreparedStatement
查看>>
错误: ‘EOF’在此作用域中尚未声明
查看>>
ajax跨域提交
查看>>
try_catch_finally的注意事项
查看>>
黄健:开放沟通,一”触“即发
查看>>
陆怡-互联网金融系统中的资金正确性保障
查看>>
Android Studio Gradle编译项目报错弹出一个提示框没有具体的错误信息
查看>>
数独游戏
查看>>
vImageCategory
查看>>
PopupView
查看>>
(java)实现进度条开发过程
查看>>
Python --- pyExcelerator库和xlrd库
查看>>
saltstack 基础入门文档
查看>>
mysql常用函数
查看>>
weblogic简单笔记
查看>>
Android工程出现红色感叹号
查看>>
每天一个linux命令(22):tar命令
查看>>