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

Unity3d C# 摄像头检测敌方单位(目标层级)并在画面中标注(含源码)

前言

需要实现的功能是通过一个专门的检测摄像头将出现在摄像头画面内的敌方单位检测出来,并通过框选的UI框在画面中标记出来。检测摄像头支持自动检测和手动控制检测,同时需要实现锁定模式,检测到一个敌方单位直接锁定到对象上等功能。

效果

自动检测并锁定:
在这里插入图片描述

自动检测并标注:
在这里插入图片描述

实现

主要的实现思路通过检测摄像头中调用 Physics.OverlapSphere函数,处理检测的层级存在的敌方单位后根据扫描角度筛选出画面中的敌方单位,然后通过 lookCam.WorldToScreenPoint和RectTransformUtility.ScreenPointToLocalPointInRectangle函数计算出敌方单位在摄像头画面中的位置,在对应位置上添加选框UI即可。

UI搭建

敌方单位的标注就用一个Image对象来处理,所以UI搭建比较简单如下图:
在这里插入图片描述

不过MarkerCanvas的Render Mode就将其设置为Screen Space-Camera模式,RenderCamera就是检测摄像头。

检测配置

    [Header("检测的层级")]public LayerMask scanLayer = 1;[Header("检测半径(远近)")]public float viewRadius = 10000;[Header("检测角度范围(扇形)")]public float detectionAngle = 90;[Header("检测旋转速度")]public float rotationSpeed = 5.0f; // 旋转速度[Header("是否自动旋转检测")]public bool isAutoScan = true;bool AutoDoing = false;float resumeDura = 5; //无目标时,无手动操作5秒后自动扫描。Vector3  AutoDir = Vector3.up;[Header("是否自动锁定")][Tooltip("检测到后会锁定到对象,只会有一个锁定对象")]public bool isTargetLock = false;[Header("标记")]public TargetMarker marker;

这些是Inspector中暴露出来用于配置的变量,效果如下:
在这里插入图片描述

其中检测的层级可以多选:
在这里插入图片描述

检测逻辑

    float angle = Mathf.Deg2Rad * (detectionAngle * 0.5f);Collider[] hitColliders = Physics.OverlapSphere(transform.position, viewRadius, scanLayer);targets.Clear();foreach (var hitCol in hitColliders){Vector3 dir = (hitCol.transform.position - transform.position).normalized;if (Mathf.Acos(Vector3.Dot(transform.forward, dir)) > angle)continue;targets.Add(hitCol.transform);// 处理检测到// Debug.Log(hitCol.gameObject.name);if (isTargetLock){scanState = false;nowLock = hitCol.transform;DoLockAnima();break;}}

调用 Physics.OverlapSphere函数找到scanLayer层级的对象,然后判断画面角度找出敌方单位。

标记实现

   if (LockTran != null){if (isInFront()){Vector2 mScreenPos = lookCam.WorldToScreenPoint(LockTran.position);Vector2 mRectPos;RectTransformUtility.ScreenPointToLocalPointInRectangle(ParentTran, mScreenPos, lookCam, out mRectPos);Rtran.localPosition = mRectPos + Offset;DisScale = ScaleRate / Vector3.Distance(LockTran.position, lookCam.transform.position);Rtran.localScale = Vector3.one * (DisScale < MinScale ? MinScale : DisScale > MaxScale ? MaxScale : DisScale);//Rtran.localScale = Vector3.one;}elseRtran.localScale = Vector3.zero;}elseRtran.localScale = Vector3.zero;

其中LockTran 就是这边标记框需要标记的对象,详情可查改该博客“Unity3d C# 实现UGUI面板跟随标注3D模型功能”。
通过localScale 同时设置了标记框的远小近大,其思路参照这篇博文“Unity3d C#实现三维场景中图标根据相机距离动态缩放功能”。

源码

https://download.csdn.net/download/qq_33789001/90056743

相关文章:

Unity3d C# 摄像头检测敌方单位(目标层级)并在画面中标注(含源码)

前言 需要实现的功能是通过一个专门的检测摄像头将出现在摄像头画面内的敌方单位检测出来&#xff0c;并通过框选的UI框在画面中标记出来。检测摄像头支持自动检测和手动控制检测&#xff0c;同时需要实现锁定模式&#xff0c;检测到一个敌方单位直接锁定到对象上等功能。 效…...

js 16进制加密

function hexEncode(str) { let hexEncodedStr ‘’; for (let i 0; i < str.length; i) { let charCode str.charCodeAt(i); let hexCode charCode.toString(16).padStart(2, ‘0’); hexEncodedStr ‘\x’ hexCode; } return hexEncodedStr; } // 示例用法 let ori…...

性能测试之压测

1、首先需要提前准备好需要压测的接口地址及对应的接口参数 写好对应的压测接口及对应参数脚本 2、添加线程组&#xff08;根据对应的需求提供的QPS及需要压测的数量如有&#xff09; 如&#xff1a;40个线程&#xff0c;循环次数为永远&#xff08;或者根据自身情况设置循…...

CentOS修改yum.repos.d源,避免“Could not resolve host: mirrorlist.centos.org”错误

1、问题现象 由于CentOS停止维护&#xff0c;mirrorlist.centos.org网站也关闭不可访问。导致CentOS默认配置的yum.repos.d源也不可用&#xff0c;所以执行yum命令会报“Could not resolve host: mirrorlist.centos.org”错误。具体如下&#xff1a; Could not retrieve mirror…...

Python 三目运算实战详解

Python 的三目运算符&#xff08;也称为条件表达式&#xff09;是一种简洁的方式来执行基于条件的赋值或返回值。它的语法类似于其他编程语言中的三元运算符&#xff0c;但有一些细微的不同。在 Python 中&#xff0c;三目运算符的语法如下&#xff1a; value_if_true if cond…...

JVM 性能调优 -- CMS 垃圾回收器 GC 日志分析【Full GC】

前言&#xff1a; 上一篇我们分析了 Minor GC 的发生过程&#xff0c;因为 GC 日志没有按我们预估的思路进行打印&#xff0c;其中打印了 CMS 垃圾回收器的部分日志&#xff0c;本篇我们就来分析一下 CMS 垃圾收集日志。 JVM 系列文章传送门 初识 JVM&#xff08;Java 虚拟机…...

PS的学习

背景差色较大&#xff0c;就魔棒 魔棒的连续就是倒水点的跨越问题 魔棒的容差的选择就有点看经验了&#xff0c;看颜色的统一程度选择 Ctrl D 取消当前所有的选区 至于快速选择工具&#xff0c;和对象选择工具也差不多&#xff0c;只不过控制范围变成了一块一块的&#x…...

数据集搜集器(百科)008

对数据集搜集器&#xff08;百科&#xff09;007进行一下改进&#xff1a; 错误处理&#xff1a;增加更多的错误处理&#xff0c;比如网络请求超时、解析错误等。 用户界面&#xff1a;增加一些提示信息&#xff0c;让用户更清楚当前的操作状态。 多线程处理&#xff1a;确保多…...

Java学习,反射

Java反射是Java编程语言的一个重要特性&#xff0c;它允许程序在运行时查看任意对象所属的类&#xff0c;获取类的内部信息&#xff08;包括构造器、字段和方法等&#xff09;&#xff0c;并能动态地调用对象的方法或构造器。 反射概念 反射&#xff08;Reflection&#xff09…...

数据结构 (18)数的定义与基本术语

前言 数据结构是计算机科学中的一个核心概念&#xff0c;它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中&#xff0c;“数”通常指的是树形数据结构&#xff0c;它是一种非线性的数据结构&#xff0c;由节点&#xff08;或称为元素…...

Flink的双流join理解

如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL&#xff0c;通过将订单表的id和订单详情表ord…...

《使用Python进行数据挖掘:理论、应用与案例研究》

嘿&#xff0c;今天我要给你们介绍一本使用Python进行数据挖掘的好书。这本书是由吴迪博士撰写的&#xff0c;他是雷曼学院商学院的助理教授&#xff0c;也是数据科学的实战派。 在这个时代&#xff0c;数据多得让人眼花缭乱&#xff0c;要从中找出有用的信息&#xff0c;那可不…...

Go语言技巧:快速统一字符串中的换行符,解决跨平台问题

统一字符串中的 Windows \r\n 换行符 — Go语言实现 在编程中&#xff0c;尤其是处理跨平台的文本数据时&#xff0c;换行符的处理是一个常见的问题。Windows 系统使用 \r\n 作为换行符&#xff0c;而 Unix-like 系统&#xff08;如 Linux 和 macOS&#xff09;使用 \n。在 Go…...

算法训练营day20(二叉树06:最大二叉树,合并二叉树,搜索二叉树,验证搜索二叉树)

第六章 二叉树 part06 今日内容 ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树 详细布置 654.最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视…...

Leetcode(区间合并习题思路总结,持续更新。。。)

讲解题目&#xff1a;合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c; 并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间。示例 1&#xff1a;输入&a…...

『python爬虫』使用docling 将pdf或html网页转为MD (保姆级图文)

目录 预览效果安装下载模型测试代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 预览效果 支持转化pdf的表格 安装 Docling 本身是专注于文档转换的工具&#xff0c;通常用于将文件&#xff08;如 PDF&…...

elasticsearch现有集群扩展节点

原文地址&#xff1a;elasticsearch现有集群扩展节点 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 给现有的 elasticsearch 集群扩展节点比较容易&#xff0c;已有的集群不需要做任何修改&#xff0c;也不用对服务做任何处理&#xff0c;只需…...

力扣162:寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...

Kafka-Connect

一、概述 Kafka Connect是一个在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具。细心的你会发现&#xff0c;我们编写的producer、consumer都有很多重复的代码&#xff0c;KafkaConnect就是将这些通用的api进行了封装。让我们可以只关心业务部分&#xff08;数…...

递归、搜索与回溯算法 - 3 ( floodfill 记忆化搜素 9000 字详解 )

一&#xff1a;floodfill 算法 1.1 图像渲染 题目链接&#xff1a;图像渲染 class Solution {// 首先先定义四个方向的向量int[] dx {0, 0, 1, -1};int[] dy {1, -1, 0, 0};// 接着用 m 记录行数&#xff0c;n 记录列数&#xff0c;prev 记录 (sr&#xff0c; sc) 位置的…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...