Unity鼠标带动物体运动的三种方法

这篇具有很好参考价值的文章主要介绍了Unity鼠标带动物体运动的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

第一种:物体跟随鼠标移动。

第二种:鼠标拖动物体运动。

第三种:鼠标点到哪,物体运动到哪。


第一种:物体跟随鼠标移动。

描述:鼠标左键点击物体,将物体拾起,松开鼠标左键,物体跟随鼠标光标移动。再次点击鼠标左键,物体不在跟随鼠标,处于静止状态。

实现方法:射线。

1657678042844

写在前面:什么是射线?

简单来说就是当鼠标点击某个物体时,通过摄像机camera发射射线,射线与物体碰撞在一个点上。我们通过这个点找到该点对应的物体,先判断该物体是否是我们想要移动的(是否为可以移动的)。

如果是,那我们就拿到要操作的对象了,接下来就是让其坐标位置和鼠标位置保持一致即可。

具体解释和详细使用方法读者可自行查阅相关文献。

由此我们可以得出,我们要先声明一个射线的变量,还有碰撞点,由于有碰撞点,我们就必需为物体添加刚体组件。为了判断是不是我们要的物体,就定义一个布尔值。此外,为了区分鼠标点击这一动作是拾起还是放下物体,我们要声明一个标志量flag。为了得到该碰撞点对应的物体,我们要声明一个GameObject组件来得到它。

    private Ray ra;//声明射线
    private RaycastHit hit;//声明碰撞点
    private bool is_element =false;//判断是否是我们要的物体
    private int flag = 0;//标志量
    private GameObject Element;//控件

接下来就是干正事儿了。

判断鼠标是否按下:

if (Input.GetMouseButtonDown(0))
        {
            
        }

鼠标按下后,摄像机往按下位置发射射线。

    ra = Camera.main.ScreenPointToRay(Input.mousePosition);

判断射线是否跟物体发生碰撞得到碰撞点hit,并且同时判断该点对应的物体是不是我们要的。

判断物体是不是我们要的,这里我使用的是判断其标签是不是'element',因此应该给先给物体添加一个标签。

以上检测完后将布尔值设为true,并将碰撞点对应的物体给Element。

if (Physics.Raycast(ra, out hit)&&hit.collider.tag=="element")
            {
                is_element = true;
                Element = hit.collider.gameObject;
            }

判断鼠标按下是拾起还是放下。

这里我规定,鼠标拾起物体时,flag=1,再次点击flag=0。

总的判断部分代码为:

if (Input.GetMouseButtonDown(0))
        {
            ra = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ra, out hit)&&hit.collider.tag=="element")
            {
                is_element = true;
                Element = hit.collider.gameObject;
                Debug.Log(Element.transform.position);
                if (flag == 0)
                {
                    flag = 1;
                }
                else
                {
                    flag = 0;
                }
            }
        }

改变物体位置和鼠标位置一致。

我们要先得到鼠标的位置。

鼠标只有x和y轴,为了和物体位置一致,这里将鼠标的z轴设置为物体的坐标。

Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,
                Element.transform.position.z);

由于鼠标位置是屏幕坐标,而物体坐标是世界坐标,那我们就要把鼠标的屏幕坐标换成世界坐标。

Vector3 mouseSToW = Camera.main.ScreenToWorldPoint(mousePos);

细心的人可以发现,这里有个“陷阱”。

我们在把鼠标的二位坐标用三位坐标表示时,其z轴就是物体的世界坐标的位置,然后我们之后又把它当作屏幕坐标转化成世界坐标,那么最后的坐标肯定和以前的不一样了。

所以我们要先将物体的世界坐标转化成成屏幕坐标,在把屏幕坐标的z轴坐标给鼠标的屏幕坐标,然后一同转化成世界坐标。然后将得到的世界坐标给物体。

Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(Element.transform.position);
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,targetScreenPos.z);
Element.transform.position = Camera.main.ScreenToWorldPoint(mousePos);

当flag=1时,我们是拾起物体的,因此在flag变为0之前,我们的物体都是跟着鼠标移动的。

因此以上操作都是在flag==1以及is_element=true的条件下进行的。

if (flag == 1&&is_element)
        {
            Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(Element.transform.position);
            Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,targetScreenPos.z);
            Element.transform.position = Camera.main.ScreenToWorldPoint(mousePos);
        }

代码汇总得:

using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;
using Unity.VisualScripting;
using UnityEngine;
 
public class camera : MonoBehaviour {
    //public Camera ca;
    private Ray ra;
    private RaycastHit hit;
    private bool is_element =false;
    private int flag = 0;
    private GameObject Element;

    // Use this for initialization
    void Start () {
        
    }
	
    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            ra = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ra, out hit)&&hit.collider.tag=="element")
            {
                is_element = true;
                Element = hit.collider.gameObject;
                if (flag == 0)
                {
                    flag = 1;
                }
                else
                {
                    flag = 0;
                }
            }
        }

        if (flag == 1&&is_element)
        {
            Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(Element.transform.position);
            Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,
                targetScreenPos.z);
            Element.transform.position = Camera.main.ScreenToWorldPoint(mousePos);
        }
    }
}

第二种:鼠标拖动物体运动。

描述:长按鼠标左键,物体跟随鼠标移动,松开鼠标左键,物体停止运动。

实现方法:协程或者射线。

有了前面的坐标转换基础,再加上对协程的基本了解,这个实现是非常容易的,我就直接上代码吧。

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

public class Cooperation : MonoBehaviour
{
    
    IEnumerator OnMouseDown()    //使用协程
    {
        Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标
        //将鼠标屏幕坐标转为三维坐标,再计算物体位置与鼠标之间的距离
        var offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPos.z));
        
        while (Input.GetMouseButton(0))
        {
            //将鼠标位置二维坐标转为三维坐标
            Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPos.z);
            //将鼠标转换的三维坐标再转换成世界坐标+物体与鼠标位置的偏移量
            var targetPos = Camera.main.ScreenToWorldPoint(mousePos) + offset;
            transform.position = targetPos;
            yield return new WaitForFixedUpdate();//循环执行
        }
    }
    }
    
}

使用射线的方法与之类似,这里就不在赘述。

第三种:鼠标点到哪,物体运动到哪。

描述:类似于英雄联盟的移动方式,鼠标点击平面任意位置,物体立即朝该方向移动。

1657681859641

首先,对移动物体和地面进行bake,操作如下:

选中Cube,点击window—>AI—>Navigation

unity物体跟随鼠标移动,鼠标控制物体,unity,游戏引擎

然后将Navigation Static勾选上

unity物体跟随鼠标移动,鼠标控制物体,unity,游戏引擎

 之后选择bake,地面和移动物体(Cube)都要勾选上。

unity物体跟随鼠标移动,鼠标控制物体,unity,游戏引擎

 代码我就直接给了,比较容易理解。文章来源地址https://www.toymoban.com/news/detail-782872.html

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

public class Nvgt : MonoBehaviour
{
    private NavMeshAgent navMeshAgent;
    void Start()
    {
        navMeshAgent = gameObject.GetComponent<NavMeshAgent>();//初始化navMeshAgent
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))//鼠标左键点下  
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//住摄像机向鼠标位置发射射线 
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))//射线检验 
            {
                if (hit.collider.gameObject.tag == "Plane")
                {
                    navMeshAgent.SetDestination(hit.point);//mHit.point就是射线和plane的相交点,实为碰撞点
                }
            }
        }
    }
}

到了这里,关于Unity鼠标带动物体运动的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity获取物体自身坐标轴的方向以及沿着该方向运动的方法

    有时候对于一个游戏对象,需要其沿着自身的坐标轴方向进行运动,那么首先如何获取自身的坐标轴方向? 获取自身的坐标轴方向可以通过transform组件进行获取(负方向加负号即可)  Vector3 moveDirection = transform.right;  获取自身的x轴的方向  Vector3 moveDirection = transform.forward;  获

    2024年02月12日
    浏览(56)
  • unity常用的三种拖拽方法

    在2d图片与3d场景中使用OnMouseDrag()的方法实现拖拽,而对于ui没有作用。 通过添加Event Tringger组件实现,按下Add New Event Type添加新的事件类型,下拉菜单中显示不同的事件类型,包括鼠标进入离开按下松开点击拖拽等,以及拖拽结束后的EndDrag事件。他看上去和Button组件中的o

    2024年02月04日
    浏览(57)
  • Unity 通过键盘鼠标控制物体移动、旋转、缩放的方法

    在Unity中,使用键盘ADWS键控制物体移动,通过鼠标左键控制物体旋转,鼠标中键控制物体缩放是再常见不过的方法。 方法如下:  效果如下:Unity 通过键盘鼠标控制物体移动、旋转、缩放_哔哩哔哩_bilibili

    2024年02月03日
    浏览(51)
  • 在Unity中挂载C#脚本的三种方法

    ①在Project(工程)窗口的某个文件夹中(也可以选择新建在Assets(资源根目录)中),然后单击鼠标右键,选择Create-C# Script 注意:扩展名在Unity编辑器中是隐藏的! ②然后再直接拖拽到Hierarchy(层级视图)你想要挂载的物体上 ①在Project(工程)窗口的某个文件夹中(也可

    2024年02月03日
    浏览(38)
  • 【Unity】 基础交互入门(按钮点击事件的三种方法)

    1、在资源面板创建C#脚本 2、创建点击事件需要执行的代码(这里以loadMain为例),新增一个叫OnStartButtonClick的Public方法。 可以选择生成或者调试,从VS更新代码到Unity。 3、场景中创建Button和empty(生成空的GameObject) 4、将代码挂在刚刚的GameObject上(这里将GameObject重命名为

    2024年02月09日
    浏览(50)
  • 【100个 Unity实用技能】☀️ | Unity读取本地文件(Json,txt等)的三种方法示例

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月08日
    浏览(66)
  • Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

    目录 内置方法OnMouseDrag【对象含有Collider组件】 配对小游戏 Event Trigger组件 接口 窗口小案例 OnMOuseOver()检测鼠标是否进入到这个2D贴图 当鼠标进入或离开2D贴图,会相应的放大、缩小 private   void   OnMouseEnter ()     {         transform.localScale += Vector3.one * 0.1f;     }    

    2024年01月21日
    浏览(38)
  • 7. unity脚本控制物体运动(转向、移动、旋转)

    1. 移动物体: 在界面中添加一个物体,并给这个物体添加一个脚本文件,在脚本文件当中如果想控制物体运动,就需要在 unity 每一帧更新的时候,给物体的坐标值重新赋值,这样就能按照帧更新速率实时的更改物体的位置,实现移动效果。 位置更新的代码应该写在***update

    2023年04月12日
    浏览(54)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(75)
  • unity物体运动经过特定点并绘出轨迹

    经过线如果有圆滑可以参考 Unity物体运动时画出轨迹_天人合一peng的博客-CSDN博客 并修改里面的数值轨迹会有变化 float angle = Mathf.Min(1, Vector3.Distance(this.transform.position, targetPos) / distanceToTarget) * 45;             this.transform.rotation = this.transform.rotation * Quaternion.Euler(Mathf.Clamp(-a

    2023年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包