Unity一些很有用的技巧

2023-11-18

一: 性能:多线程射线检测

在使用中经常需要每帧进行射线,性能消耗比较大,那么可以使用Unity.Collections.RaycastCommand进行多线程的检查,将耗能操作放到子线程去.同样其他的形状检测.Unity官方文档:

RaycastCommand

struct in UnityEngine

描述

用于设置要在作业过程中异步执行的射线投射命令的结构。

使用此结构计划一批射线投射时,它们会以异步方式并行执行。射线投射的结果会写入结果缓冲区。由于结果是异步写入,因此在作业完成之前无法访问结果缓冲区。

命令缓冲区中索引 N 处的命令的结果会存储在结果缓冲区中索引 N * maxHits 处。

如果 maxHits 大于命令的实际结果数,则结果缓冲区会包含一些未命中任何对象的无效结果。第一个无效结果通过为 null 的碰撞体进行标识。第二个以及随后的无效结果不会由射线投射命令写入,因此其碰撞体不保证为 null。遍历结果时,循环应在发现第一个无效结果时停止。

示例:

胶囊体落地就会变红,因为检测到了地面,性能可以查看性能监视器,发现所有操作移到了子work中去了 

using UnityEngine;
using Unity.Collections;
using Unity.Jobs;

/// <summary>
/// 多线程射线检测测试
/// </summary>
public class RaycastCommandTest : MonoBehaviour
{

    Material myMaterial;
    NativeArray<RaycastCommand> raycastRaycastCommandNativeArray;
    NativeArray<RaycastHit> raycastHitNativeArray;
    JobHandle jobHandle;

    void Start()
    {
        myMaterial = this.GetComponent<MeshRenderer>().material;
        raycastRaycastCommandNativeArray = new NativeArray<RaycastCommand>(1, Allocator.Persistent);
        raycastHitNativeArray = new NativeArray<RaycastHit>(10, Allocator.Persistent);
    }

    // Update is called once per frame
    void Update()
    {

        //this.OldPhysicsTest();
        this.RaycastCommandTestFuc();

    }
    /// <summary>
    /// 异步的检测方式
    /// </summary>
    private void RaycastCommandTestFuc()
    {
        //---完成上一帧的job
        this.jobHandle.Complete();
        //---检查结果
        for (int i = 0; i < raycastHitNativeArray.Length; i++)
        {
            if (raycastHitNativeArray[i].collider != null && raycastHitNativeArray[i].collider.tag == "Ground")
            {
                myMaterial.SetColor("_BaseColor", Color.red);
                break;
            }
            else
            {
                myMaterial.SetColor("_BaseColor", Color.white);
            }
        }

        //----设置这一帧的射线检测参数


        raycastRaycastCommandNativeArray[0] = new RaycastCommand(this.transform.position, Vector3.down, 1.1f, -5, 10);

        this.jobHandle = RaycastCommand.ScheduleBatch(raycastRaycastCommandNativeArray, raycastHitNativeArray, 1);

    }
    /// <summary>
    /// 旧的使用方式
    /// </summary>
    private void OldPhysicsTest()
    {
        RaycastHit hitInfo = new RaycastHit();


        if (Physics.Raycast(this.transform.position, Vector3.down, out hitInfo, 1.1f) && hitInfo.collider.tag == "Ground")
        {
            myMaterial.SetColor("_BaseColor", Color.red);

        }
        else
        {
            myMaterial.SetColor("_BaseColor", Color.white);
        }
    }


    void OnDestroy()
    {
        this.jobHandle.Complete();
        this.raycastRaycastCommandNativeArray.Dispose();
        this.raycastHitNativeArray.Dispose();
    }
}

 二:批量规则放置物体

当需要有规则或者随机放置多个物体的时候,可以一起选择他们,然后再position里面输入函数来放置他们,如果现有将他们排队放置 那么在X里面输入 L(0,12),代表将这13个物体每单位放一个,R(-5,5)即在-5到5的范围内随机放置他们

三:独立的物体属性窗口,提高工作效率

选择物体,然后点击右键-点击properties,可以开启这个物体的独立属性窗口,当你选择其他物体的时候,这个窗口依然可以对原物体有效,相当于inspector窗口锁定某个物体的状态,那么我们就不再需要在Inspector窗口锁定物体才能拖入拖出赋值了,当然也可以将某个物体的某个组件独立打开properties窗口,只需要在组件上点右键选择properties即可

 

四:c#新的语法糖,将默认属性的值作为序列化对象

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity一些很有用的技巧 的相关文章

  • 三步在两台服务器间迁移conda环境

    引言 背景是我现在要跑的实验在一台服务器上跑有点来不及了 需要将conda环境和文件一起迁移到另一台服务器上 文件的迁移可以用scp或者rsync 但是conda虚拟环境的迁移则不行 步骤 step 1 将当前的虚拟幻境信息写入enviro
  • 制造业基本ERP管理系统模块全解析

    一 销售模块 1 成品分类 客户分类需要能做到多维统计 比如一个产品既属于成品又属于机架 还可以属于铝制品 成品和客户都必须能实现这种多维分类 相应报表也能根据这些多维分类进行分析统计 2 查看该销售订单时 可以直接查看到该张销售订单的执行
  • 最好不要过度处理EEG数据

    自动预处理方法对于处理大量公开可用的EEG 脑电图 数据库至关重要 但由于我们缺乏用于比较这些方法的数据质量指标 因此最佳方法仍然未知 在这里 我们设计了一个简单但稳健的EEG数据质量度量标准 用于评估两个实验条件之间在100毫秒刺激后时间

随机推荐

  • 报错为method does not override method from its superclass解决

    你要重写接口的方法就得让实现类实现接口 public class UserServiceImpl implements UserService 没有实现接口就加重写注解 Override 系统不知道重写了什么接口方法 肯定报错 建议巩固一下
  • 为什么函数y=f(x)的导数dy/dx可以适用分数运算呢?

    一 问题背景 在同济大学高等数学关于导数的内容中 如果函数y f x 可以由参数方程 表示 且三个函数皆可导 且x的值不为0 则 才开始看这个公式推导时 觉得没什么问题 仔细一想 dy dx是导数的表示符号 为什么这个符号可以适用分数运算公
  • Hive 视图和索引

    一 视图 1 1 简介 Hive 中的视图和 RDBMS 中视图的概念一致 都是一组数据的逻辑表示 本质上就是一条 SELECT 语句的结果集 视图是纯粹的逻辑对象 没有关联的存储 Hive 3 0 0 引入的物化视图除外 当查询引用视图时
  • Spring的Factories机制介绍

    项目场景 Spring的Factories机制介绍 Spring的Factories机制介绍
  • 如何使用vscode开发uniapp并运行

    如何使用vscode开发uniapp并运行 1 必须先下载HBuilderX然后导入你需要开发的uni项目 2 然后在vscode中再次打开你的uni项目 3 去vscode插件市场安装一个uni helper这个插件 4 即可在vscod
  • java 利用ganymed-ssh2 远程执行linux shell 命令

    早期的ganymed ssh2包也可以实现远程调研linux shell 命令 但是这个包最新版本是2014年之后 就没有更新了 发现linux 操作系统安装 open ssh 8 5及更高级版本 就一直提示连接失败 可以使用jsch 最新
  • linux内存利用率计算方式

    一 查看内存的方式 root vmware free h root vmware cat proc meminfo 需要使用的指标有 MemTotal MemFree Buffers Cached MemTotal 总内存大小 MemFre
  • 计算半圆弧的周长及半圆的面积

    3 计算半圆弧的周长及半圆的面积 编程并输出半径r 5 3的半圆弧长 提示 半圆弧长不应该加直径的长度 及该半圆弧与直经围成的半圆的面积 的取值为3 14159 要求半径r和必须利用宏常量表示 include
  • MacOS怎么查看进程占用内存是多少

    一 背景 在Linux下可以使用 free 命令来方便的查看内存占用情况 如 free g free m等 但MacOS下没有这个命令 既然如此 那么MacOS里是否有类似的工具呢 而我们又该如何查看整个PC的内存占用情况 及指定进程的内存
  • 慢慢欣赏linux pud_offset解析

    typedef struct pudval t pud pud t gt typedef u64 pudval t dir表示L0页表索引的指针 指向PUD页表的基地址 define pud offset dir addr pud t va
  • 《计算机工程》期刊 从投稿到录用过程

    本人 18级双一流院校全日制研究生在读 专业 地理学 研究方向 激光雷达数据处理与三维点云语义分割 文章投计算机工程期刊从投稿到可刊总周期 两个月之内 审稿费100元 可加急 发表情况 预计十月发表 期刊选择 论文修改完成之后 自己有上网了
  • 教你利用IBM的开发手册

    在IBM AIX下做开发的不少人一直都不知道IBM其实已经提供了详尽的开发文档及手册供开发人员使用 很多人仍然使用很原始的方式 例如在GOOGLE中搜索 或者买本手册型的书放在边上 更有甚者直接记在脑子里 这算是相当聪明的了 但是 有许多与
  • 山石发声

    技术变化快 投入不可控 攻击侧升级 攻防不对等 人才缺口大 维护成本高 山石网科安全运营体系 让安全运营挑战迎刃而解 近年来 全球安全服务市场景气度较高 行业增速远高于安全行业的整体水平 究其原因 首先是IT基础架构的变化驱动安全服务体系的
  • java每日一题:手动触发垃圾回收(GC)

    面试官 首先 我想问一下 你能向我解释一下 手动触发Java垃圾回收 的过程吗 面试者 在Java中 垃圾回收是自动进行的 由Java虚拟机 JVM 负责管理 但是 有时候我们可能希望手动触发垃圾回收以释放一些无用的对象 这可以通过调用Sy
  • Scrapy的基本介绍、安装及工作流程

    一 Scrapy介绍 Scrapy是什么 Scrapy 是用 Python 实现的一个为了爬取网站数据 提取结构性数据而编写的应用框架 异步爬虫框架 通常我们可以很简单的通过 Scrapy 框架实现一个爬虫 抓取指定网站的内容或图片 Scr
  • 程序员搜索技巧

    1 搜索时 一定使用关键字搜索 空格 浓缩减少废话与口语 不断负反馈增添修改关键词 再不行就英文 2 精确搜索 作为整体 用 双引号 3 查找标题含有的确定关键词 intitle 英文冒号 4 站内搜索 过滤垃圾广告 定位某一网址答案 xx
  • Cobertura 统计多模块maven项目测试覆盖率

    Cobertura 统计单元测试覆盖率的机制 运行类 并在一个log文件中记录哪一行被执行 然后将源代码和log文件进行比对 1 简单的情况 单模块maven项目 项目结构 源代码 src main java se sigma calcul
  • OpenCV图像人脸检测及视频中的人脸检测(附源码)

    文章目录 一 数据和知识准备 1 下载HAAR与LBP数据 2 opencv相关知识 二 python opencv实现人脸检测 1 图像单人脸检测 2 图像多人脸检测 3 视频中人脸检测 4 摄像头人脸检测 一 数据和知识准备 1 下载H
  • java中的垃圾回收机制

    概述 JAVA中的垃圾回收机制是自动的 它是保证程序健壮的主要手段 同时也避免了回收内存带来的代码繁琐 注意 1 java中的垃圾回收机制采用的是多线程技术实现的 垃圾回收功能是一条优先级比较低的线程 2 垃圾回收机制仅仅作用于堆内存 和栈
  • Unity一些很有用的技巧

    一 性能 多线程射线检测 在使用中经常需要每帧进行射线 性能消耗比较大 那么可以使用Unity Collections RaycastCommand进行多线程的检查 将耗能操作放到子线程去 同样其他的形状检测 Unity官方文档 Rayca