Unity_通过鼠标点击屏幕移动屏幕里的一个对象

发布于:2025-07-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

注:本文章只是学习总结的笔记,视频链接


一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)

实现思路:通过Camera的ScreenPointToRay方法和Input.mousePosition鼠标坐标生成创建Ray射线,再通过Physics的Raycast方法和射线,获得被碰撞的物体相关信息存储在RaycastHit里。
实现代码:

using UnityEngine;

public class 点击移动物体 : MonoBehaviour
{
    public Camera cam;
    public Transform 被点击物体;//clickedOBJ
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            Physics.Raycast(ray, out hit);
            被点击物体 = hit.transform;
        }
    }
}

二、移动点击的物体(摁着鼠标左键不放)

思路:通过相机的射线和距离获得一个点,设置给物体从而达到移动物体。
距离如何获取:
方法一:获取到点击物体时hit对象中存射线起点到碰撞点的距离
方法二:通过两个点算一个距离,也就的那被移动对象的坐标和相机坐标算一个距离
代码如下:

using System.Globalization;
using UnityEngine;

public class 点击移动物体 : MonoBehaviour
{
    public Camera cam;
    public Transform 被点击物体;//clickedOBJ
    public float 距离;//distance
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit))
            {
                被点击物体 = hit.transform;
                距离 = Vector3.Distance(cam.transform.position, hit.transform.position);
                float 距离1 = hit.distance; //这是视频老师写的获取应该相机和碰撞点的距离
                Debug.Log($"1:{距离}\n2:{距离1}");
            }

        }
        if(Input.GetMouseButton(0))
        {
            if(被点击物体)
            {
                Ray ray = cam.ScreenPointToRay(Input.mousePosition);
                被点击物体.position = ray.GetPoint(距离);
            }
        }
    }
}

三、松开左键清理被移动对象属性

using System.Globalization;
using UnityEngine;

public class 点击移动物体 : MonoBehaviour
{
    public Camera cam;
    public Transform 被点击物体;//clickedOBJ
    public float 距离;//distance
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit))
            {
                被点击物体 = hit.transform;
                距离 = Vector3.Distance(cam.transform.position, hit.transform.position);
                float 距离1 = hit.distance; //这是视频老师写的获取应该相机和碰撞点的距离
                Debug.Log($"1:{距离}\n2:{距离1}");
            }

        }
        if(Input.GetMouseButton(0))
        {
            if(被点击物体)
            {
                Ray ray = cam.ScreenPointToRay(Input.mousePosition);
                被点击物体.position = ray.GetPoint(距离);
            }
        }
        if (Input.GetMouseButtonUp(0)) {
            被点击物体 = null;
        }
    }
}

总结

射线生成,射线检测,射线+距离获得坐标


网站公告

今日签到

点亮在社区的每一天
去签到