注:本文章只是学习总结的笔记,视频链接
一、获取到点击物体的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;
}
}
}
总结
射线生成,射线检测,射线+距离获得坐标