Unity3d 模拟鼠标框选物体

128 篇文章 1 订阅
64 篇文章 1 订阅

脚本需要挂载在相机上,材质球选择默认Sprites-Default.

/// <summary>
/// 鼠标框选屏幕选中物体
/// </summary>
public class RectRender : MonoBehaviour
{

    private bool onDrawingRect;//是否正在画框(即鼠标左键处于按住的状态)

    private Vector3 startPoint;//框的起始点,即按下鼠标左键时指针的位置
    private Vector3 currentPoint;//在拖移过程中,玩家鼠标指针所在的实时位置
    private Vector3 endPoint;//框的终止点,即放开鼠标左键时指针的位置

    private Selector selector;
   

    void Update()
    {
        //玩家按下鼠标左键,此时进入画框状态,并确定框的起始点
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            onDrawingRect = true;
            startPoint = Input.mousePosition;
            Debug.Log("开始画框,起点:"+ startPoint);
        }

        //在鼠标左键未放开时,实时记录鼠标指针的位置
        if (onDrawingRect)
        {
            currentPoint = Input.mousePosition;
        }

        //玩家放开鼠标左键,说明框画完,确定框的终止点,退出画框状态
        if (Input.GetKeyUp(KeyCode.Mouse0))
        {
            endPoint = Input.mousePosition;
            onDrawingRect = false;
            Debug.Log("画框结束,终点:"+endPoint);
            //当框画完时,创建一个生效的选定框selector
            selector = new Selector(startPoint, endPoint);
            //执行框选事件
            CheckSelection(selector, "Player");
        }
    }

    //框选事件
    //按照选定框的范围,捕获标签为tag的所有物体,并打印这些物体的名字
    void CheckSelection(Selector selector, string tag)
    {
        GameObject[] objs = GameObject.FindGameObjectsWithTag(tag);
        foreach (GameObject ob in objs)
        {
            Vector3 screenPos = Camera.main.WorldToScreenPoint(ob.transform.position);
            if (screenPos.x > selector.Xmin && screenPos.x < selector.Xmax && screenPos.y > selector.Ymin && screenPos.y < selector.Ymax)
            {
                if (ob.tag==(tag))
                {
                    Debug.Log("已选中目标:"+ ob.name);
                }
            }
        }
    }


    public Material GLRectMat;//绘图的材质,在Inspector中设置
    public Color GLRectColor;//矩形的内部颜色,在Inspector中设置
    public Color GLRectEdgeColor;//矩形的边框颜色,在Inspector中设置

    void OnPostRender()
    {
        if (onDrawingRect)
        {
            //准备工作:获取确定矩形框各角坐标所需的各个数值
            float Xmin = Mathf.Min(startPoint.x, currentPoint.x);
            float Xmax = Mathf.Max(startPoint.x, currentPoint.x);
            float Ymin = Mathf.Min(startPoint.y, currentPoint.y);
            float Ymax = Mathf.Max(startPoint.y, currentPoint.y);

            GL.PushMatrix();//GL入栈
                            //在这里,只需要知道GL.PushMatrix()和GL.PopMatrix()分别是画图的开始和结束信号,画图指令写在它们中间
            if (!GLRectMat)
            {
                Debug.Log("请设置材质");
                return;
            }

            GLRectMat.SetPass(0);//启用线框材质rectMat

            GL.LoadPixelMatrix();//设置用屏幕坐标绘图

            /*------第一步,绘制矩形------*/
            GL.Begin(GL.QUADS);//开始绘制矩形,这一段画的是框中间的半透明部分,不包括边界线

            GL.Color(GLRectColor);//设置矩形的颜色,注意GLRectColor务必设置为半透明

            //陈述矩形的四个顶点
            GL.Vertex3(Xmin, Ymin, 0);//陈述第一个点,即框的左下角点,记为点1
            GL.Vertex3(Xmin, Ymax, 0);//陈述第二个点,即框的左上角点,记为点2
            GL.Vertex3(Xmax, Ymax, 0);//陈述第三个点,即框的右上角点,记为点3
            GL.Vertex3(Xmax, Ymin, 0);//陈述第四个点,即框的右下角点,记为点4

            GL.End();//告一段落,此时画好了一个无边框的矩形


            /*------第二步,绘制矩形的边框------*/
            GL.Begin(GL.LINES);//开始绘制线,用来描出矩形的边框

            GL.Color(GLRectEdgeColor);//设置方框的边框颜色,建议设置为不透明的

            //描第一条边
            GL.Vertex3(Xmin, Ymin, 0);//起始于点1
            GL.Vertex3(Xmin, Ymax, 0);//终止于点2

            //描第二条边
            GL.Vertex3(Xmin, Ymax, 0);//起始于点2
            GL.Vertex3(Xmax, Ymax, 0);//终止于点3

            //描第三条边
            GL.Vertex3(Xmax, Ymax, 0);//起始于点3
            GL.Vertex3(Xmax, Ymin, 0);//终止于点4

            //描第四条边
            GL.Vertex3(Xmax, Ymin, 0);//起始于点4
            GL.Vertex3(Xmin, Ymin, 0);//返回到点1

            GL.End();//画好啦!

            GL.PopMatrix();//GL出栈
        }
    }

}

/// <summary>
/// 屏幕上框选范围
/// </summary>
public class Selector
{
    public float Xmin, Xmax, Ymin, Ymax;
    public Selector(Vector3 start, Vector3 end)
    {
        Xmin = Mathf.Min(start.x, end.x);
        Xmax = Mathf.Max(start.x, end.x);
        Ymin = Mathf.Min(start.y, end.y);
        Ymax = Mathf.Max(start.y, end.y);
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity3D模拟物体笔刷是一种功能强大的工具,可用于在Unity游戏引擎中快速创建和放置大量的物体。它的工作原理类似于绘图软件中的画笔工具,可以用来将预先定义好的物体复制到场景中的指定位置。 使用Unity3D模拟物体笔刷的方法比较简单。首先,我们需要创建一个空物体,并向其添加脚本来控制笔刷的行为。在脚本中,我们可以定义一个游戏对象的数组,存储我们想要在场景中复制的物体。 在场景中,我们需要定义一个可以触发笔刷功能的触发器,例如一个键盘按键、按钮或触屏事件。当触发器被激活时,我们的脚本会开始执行。在脚本中,我们可以使用Instantiate函数来实例化我们事先定义好的物体,并将其放置在指定位置。这个过程可以重复执行,直到我们完成了想要的物体布局。 为了提高笔刷的效率,我们可以通过在场景中绘制一个格子网格来将物体放置在规律的位置。我们可以使用循环来遍历整个网格,并在每个单元格中进行物体的复制。此外,我们还可以根据需要进行调整,例如在每个复制的物体周围进行旋转、缩放或随机化。 Unity3D模拟物体笔刷的应用非常广泛。它可以用于创建游戏中的环境、道具、粒子效果等等。通过灵活的参数设置和组合,我们可以在短时间内快速生成复杂的场景,提高开发效率。同时,将物体笔刷与其他Unity3D功能结合使用,我们还可以实现更多独特的效果,使我们的游戏更加丰富和引人入胜。 ### 回答2: Unity3D是一种用于开发三维游戏和应用程序的强大工具。在Unity3D中,我们可以使用脚本编写自定义的功能和特效。模拟物体笔刷是一种常用的功能,它允许玩家在游戏中使用笔刷工具来绘制、放置和操控物体。 实现一个unity3d模拟物体笔刷的步骤如下: 1. 首先,我们需要创建一个笔刷对象,并将其添加到场景中。这个笔刷对象可以是一个简单的3D模型,也可以是一个粒子系统。它的作用是指示玩家在何处绘制物体。 2. 接下来,我们需要定义要绘制的物体的属性,比如名称、模型、材质等。我们可以通过在脚本中创建一个物体模板,并在使用笔刷绘制物体时克隆该模板来实现。 3. 实现笔刷的交互功能。玩家可以通过鼠标或触摸手势在场景中绘制物体。我们可以在脚本中检测鼠标点击或触摸事件,并将物体根据玩家的位置和方向绘制到场景中。可以择性地在笔刷绘制的物体上添加物理效果,使其可以与场景中的其他物体发生交互。 4. 添加额外的功能来提高物体笔刷的灵活性。比如添加物体的旋转、缩放功能,使玩家可以在绘制物体时调整其大小和方向。还可以添加撤销和重做功能,以便玩家可以撤销不满意或错误的笔刷绘制操作。 总结起来,unity3d模拟物体笔刷是一种允许玩家在游戏中使用笔刷工具绘制、放置和操控物体的功能。实现这个功能需要创建一个笔刷对象,定义要绘制的物体属性,并实现交互功能,以及添加额外的功能来提高笔刷的灵活性。通过这样的模拟物体笔刷,玩家可以在游戏中自由创造并互动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值