unity3鼠标点击移动

简介:
这个总共可以分为三个部分:
第一: 如何取得目标地点
第二:看向目标地点,并向其移动
第三:障碍物判断
我们先看第一个问题如何获得目标点:首先打开 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);
                        

        }

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



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

相关文章
|
7月前
|
图形学
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
|
图形学
Unity物体移动到点击位置
Camera 在正交模式下可以实现点击哪里就将物体移动到哪里。 public Vector3 tempPos; void Update() { if (Input.GetMouseButtonDown(0)) { tempPos = Input.mousePosition; tempPos = Camera.main.ScreenToWorldPoint(tempPos); tempPos.z = 0; transform.position = tempPos; } } Camera 在透视模式下可以实现点击哪里就将物体移动到哪里。
2037 0
|
测试技术 Android开发 iOS开发
Unity3D-实现连续点击两次返回键退出游戏(安卓/IOS)
Unity3D-连续点击两次返回键退出游戏 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例...
2812 0
|
图形学
[Unity UGUI]点击和长按组件
需求 游戏项目中卡片经常需要按钮/卡片的点击或者长按事件,这里提供一个好用的组件。 组件 using UnityEngine; using UnityEngine.
2016 0
|
图形学
Unity3d鼠标点击位置实例化点击动画特效-RPG游戏常用
///注明:需要特效动画 using UnityEngine; /// /// 鼠标点击位置实例化点击特效-RPG游戏常用,位于player /// public class PlayerDir : MonoBehaviour { ...
2040 0
|
图形学
[unity3d]鼠标点击地面人物自动走动(也包含按键wasd&space控制)
在漫游游戏中常用的功能就是人物在场景中行走,必要的功能就是鼠标点击地面人物就朝着那个方向行走,键盘方向键前后左右也能控制人物的行走和跳跃,在官方自带的第三人称视角中做了一点修改,官方自带的ThirdPersonController中的摄像机自动指向人物的背面,这样不能看到人物的正面或者侧面,对ThirdPersonController脚本做了修改之后,可以旋转摄像机的视角,可以摄像机跟随,类似smoothfollow的功能。
856 0
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
48 0