当前位置: 首页 > article >正文

Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框

前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(1) 基础要素-CSDN博客

本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程

【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered By EduSoho (taikr.net)

我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人

本案例的实现流程图 

框选功能要素图 

本文实现可视框部分,其中重置框作为一个小函数,并不用详解

分析

对于可视化线条,自然而然想到的是Line Render组件

unity保姆级教程之 Line Renderer_unity linerenderer-CSDN博客

当鼠标左键按下的时候,就记录第一个点,鼠标抬起就记录最后一个点

然后根据这两个点的坐标,进行矩形的四角分配,其中z轴可以自行分配值

基本字段

    //画线组件
    private LineRenderer lineRenderer;
    //鼠标按下检测
    private bool isMouseDown;
    //四个点
    private Vector3 leftUpPos;//1
    private Vector3 rightUpPos;//2
    private Vector3 leftDownPos;//3
    private Vector3 rightDownPos;//4

但是,还有一个问题,目前的四个点是在相机面前的也就是2D的,而项目是3D的

可能出现绘制出来了线框但是并没有出现在实际3D世界的位置中,而且相机旋转也可能导致绘制框的不准确,所以需要将其转为世界坐标系

画线函数

    private void DrawLine()
        { 
        if(Input.GetMouseButtonDown(0))
            {
            isMouseDown=true;
            leftUpPos = Input.mousePosition;
            leftUpPos.z = 5; // 设置z轴值
            RayBegin();
        }
        if(Input.GetMouseButtonUp(0))
            {
            isMouseDown = false;
            lineRenderer.positionCount = 0;
            ResetSelect();
            RaySelect();
        }
       
        FourFarmePos();
    }

 处理四点的函数

    /// <summary>
    /// 处理框选框四个点的位置
    /// </summary>
    private void FourFarmePos()
        {
        if (isMouseDown){
            rightDownPos = Input.mousePosition;
            rightDownPos.z = 5;

            rightUpPos = new Vector3(rightDownPos.x, leftUpPos.y, 5);
            leftDownPos = new Vector3(leftUpPos.x, rightDownPos.y, 5);

            lineRenderer.positionCount = 4;
            lineRenderer.SetPosition(0, Camera.main.ScreenToWorldPoint(leftUpPos));
            lineRenderer.SetPosition(1, Camera.main.ScreenToWorldPoint(rightUpPos));
            lineRenderer.SetPosition(2, Camera.main.ScreenToWorldPoint(rightDownPos));
            lineRenderer.SetPosition(3, Camera.main.ScreenToWorldPoint(leftDownPos));    
            }
    }

总览 

    private void Start() {
        lineRenderer = GetComponent<LineRenderer>();
        isMouseDown =false;
        layermask = LayerMask.GetMask("Bk");
        soliderObjs = new List<SoliderObj>();
    }

    private void Update() {
        DrawLine();
    }
    
    private void DrawLine()
        { 
        if(Input.GetMouseButtonDown(0))
            {
            isMouseDown=true;
            leftUpPos = Input.mousePosition;
            leftUpPos.z = 5; // 设置z轴值
            RayBegin();
        }
        if(Input.GetMouseButtonUp(0))
            {
            isMouseDown = false;
            lineRenderer.positionCount = 0;
            ResetSelect();
            RaySelect();
        }
       
        FourFarmePos();
    }
    /// <summary>
    /// 处理框选框四个点的位置
    /// </summary>
    private void FourFarmePos()
        {
        if (isMouseDown){
            rightDownPos = Input.mousePosition;
            rightDownPos.z = 5;

            rightUpPos = new Vector3(rightDownPos.x, leftUpPos.y, 5);
            leftDownPos = new Vector3(leftUpPos.x, rightDownPos.y, 5);

            lineRenderer.positionCount = 4;
            lineRenderer.SetPosition(0, Camera.main.ScreenToWorldPoint(leftUpPos));
            lineRenderer.SetPosition(1, Camera.main.ScreenToWorldPoint(rightUpPos));
            lineRenderer.SetPosition(2, Camera.main.ScreenToWorldPoint(rightDownPos));
            lineRenderer.SetPosition(3, Camera.main.ScreenToWorldPoint(leftDownPos));    
            }
    }


http://www.kler.cn/a/331138.html

相关文章:

  • vue css box-shadow transition实现类似游戏中的模糊圈游走的感觉
  • Nginx的性能分析与调优简介
  • 智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计
  • qt QZipReader详解
  • 使用FFmpeg进行拉流和推流操作
  • 基础优化方法
  • Servlet的生命周期及用户提交表单页面的实现(实验报告)
  • ENV | WSL 拓展虚拟磁盘空间
  • 【mod分享】极品飞车12无间风云高清重置mod,车模重构和材质贴图高清化
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
  • Element UI教程:如何将Radio单选框的圆框改为方框
  • 通信工程学习:什么是DNS域名系统
  • 做数据抓取工作要如何选择ip池
  • Windows 11 24H2正式发布
  • Linux如何查看每个文件及文件夹的大小
  • C语言复习概要(一)
  • 链表面试编程题
  • 在中序线索树中找到数据域A,并在其左子树中插入数据域为x的结点
  • Java JUC(三) AQS与同步工具详解
  • 机器学习【教育领域及其平台搭建】
  • 用好AI告别灵感枯竭!如何用300个选题提示词打造病毒式内容?
  • Python笔记 - 函数、方法和类装饰器
  • react-问卷星项目(4)
  • Django一分钟:DRF模型序列化器处理关联关系的示例与注意事项
  • 高校实训产品:动漫和游戏场景AI实训平台建设方案
  • 《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》