Unity 获取屏幕点击对象二

这篇博客介绍了在Unity引擎中如何实现通过鼠标点击进行对象的点选和框选操作。作者提供了使用`OnUpdate`方法监听鼠标输入,通过计算开始和结束位置来确定选择区域,并根据点选范围判断是否为点选或框选。在遍历场景中的物体时,检查物体位置是否在选择区域内,从而实现选择目标物体的功能。
摘要由CSDN通过智能技术生成

框选屏幕中的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
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值