实现效果:
可以移动场景内物品放置到某个位置。通过射线检测,点击鼠标左键,移动物体,再点击左键放下物体。
效果:
移动物体
实现思路:
通过射线检测,将检测到的物体吸附到摄像机前的一个空物体处,作为该空物体的子物体,归零子物体坐标和旋转角度。需要有一个判定条件来判断物体是在被拖拽还是被放下,引入bool isDragging,点击左键,检测到的物体移动到空物体处,再点击左键,解除与空物体父子关系,从而实现拾取物体。
源码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///summary
///拖拽物体 移动到指定位置
///summary
public class DragCube : MonoBehaviour
{
public Transform carryParent; //拾取物体的父物体
private Transform carryCube; //拾取到的物体
public RaycastHit hit;
public Ray ray;
public LayerMask mask;
private bool isDragging = false;
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (!isDragging)
{
if (Physics.Raycast(ray, out hit,10, mask) && Input.GetMouseButtonDown(0))
{
isDragging = true; //更改可拖拽
carryCube = hit.transform;
carryCube.parent = carryParent;
carryCube.localPosition = Vector3.zero; //固定位置
carryCube.localEulerAngles = Vector3.zero; //固定角度
}
}
else
{
if(Input.GetMouseButtonDown(0))
{
isDragging = false;
carryCube.parent=null; //取消父子关系
carryCube.eulerAngles = new Vector3(0, carryCube.eulerAngles.y, 0); //限制物体x z轴角度,以免物体发生偏转
}
}
}
}