框选屏幕中的gameobject,或者点选(处理当场景中的物体可以重叠的时候)屏幕中的gameobject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Mathematics;
public class SelectControl : MonoBehaviour
{
private float3 startPos;
private float3 endPos;
public void OnUpdate()
{
if (Input.GetMouseButtonDown(0))
{
startPos = WorldTouchPos();
}
if (Input.GetMouseButtonUp(0))
{
endPos = WorldTouchPos();
float3 downLeftPos = new float3(math.min(startPos.x, endPos.x), 0, math.min(startPos.z, endPos.z));
float3 upRightPos = new float3(math.max(startPos.x, endPos.x), 0, math.max(startPos.z, endPos.z));
//设置点选(点选只选中,重叠的多个目标中的一个目标)
float minDis = 2;//点选范围
float dis = math.distance(downLeftPos, upRightPos);
int clickNum = dis < minDis ? 1: -1;
if (clickNum > 0)
{
downLeftPos += new float3(-1, 0, -1) * (minDis - dis) * 1f;
upRightPos += new float3(1, 0, 1) * (minDis - dis) * 1f;
}
List<GameObject> allObject = new List<GameObject>();//这里设置你想搜索的目标
for(int index =0; index < allObject.Count; index ++)
{
var pos = allObject[index].transform.position;
if (clickNum > 0)//点选直选中一个
{
if (pos.x >= downLeftPos.x && pos.z >= downLeftPos.z && pos.x <= upRightPos.x && pos.z <= upRightPos.z)
{
//这里是你点选到的目标
clickNum--;
}
}
else if(clickNum == -1)
{
if (pos.x >= downLeftPos.x && pos.z >= downLeftPos.z && pos.x <= upRightPos.x && pos.z <= upRightPos.z)
{
//这里是你框选的到目标
}
}
}
}
}
public static Vector3 WorldTouchPos()
{
return Camera.main.ScreenToWorldPoint(GetTouchPosition());//正交相机(orthographic)
}
public static Vector3 GetTouchPosition()
{
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
return Input.mousePosition;
#else
return Input.touches[0].position;
#endif
}
}
这篇博客介绍了在Unity引擎中如何实现通过鼠标点击进行对象的点选和框选操作。作者提供了使用`OnUpdate`方法监听鼠标输入,通过计算开始和结束位置来确定选择区域,并根据点选范围判断是否为点选或框选。在遍历场景中的物体时,检查物体位置是否在选择区域内,从而实现选择目标物体的功能。
769





