【Unity】简单实现生成式电子围栏

【Unity】简单实现生成式电子围栏

三维电子围栏是一种通过使用三维技术和电子设备来建立虚拟围栏,用于监控和控制特定区域的系统。它可以通过使用传感器和摄像头来检测任何越界行为,并及时发出警报。这种技术可以应用于安防领域以及其他需要对特定区域进行监控和防护的场合。

示例下载
实现效果

动态生成

区域标识

警报效果

实现方法

方法很简单下面附上全部代码。通过坐标位置、高度和颜色参数动态生成电子围墙。自由组合,生成多组多样式围栏。

实现代码:

使用两个点的坐标和它们的高度来构建基本网格,然后将其拼接起来形成一整列墙。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;public class ElectronicWallControl : MonoBehaviour
{public GameObject[] WallPiont;Vector3[] WallPos;Dictionary<string, GameObject> WallDic = new Dictionary<string, GameObject>();GameObject WallFa;// Start is called before the first frame updatevoid Start(){WallPos = new Vector3[WallPiont.Length];for (int i = 0; i < WallPiont.Length; i++){//提取gameobjct的坐标WallPos[i] = WallPiont[i].transform.position+new Vector3(0,0.5f,0);}CreateWallMesh("Wall_1", WallPos, 5, Color.blue, 1);}public Material WallMat;//参考材质public void CreateWallMesh(string id, Vector3[] pos, float high, Color colorNew, float intensity = 0.5f){if (!WallDic.ContainsKey(id)){GameObject area = new GameObject(id);if (!WallFa){WallFa = new GameObject();WallFa.name = "AreaFa";}MeshFilter filter = area.AddComponent<MeshFilter>();MeshRenderer renderer = area.AddComponent<MeshRenderer>();filter.mesh = CreateMesh(pos, high,out float uvy);//创建网格Material material = new Material(WallMat);//float factor = Mathf.Pow(2, intensity);//material.color = new Color(colorNew.r * factor, colorNew.g * factor, colorNew.b * factor);material.SetFloat("_UVy", uvy);material.SetFloat("_High", high);renderer.sharedMaterial = material;renderer.receiveShadows = false;renderer.shadowCastingMode = ShadowCastingMode.Off;area.transform.parent = WallFa.transform;WallDic.Add(id, area);}else{WallDic[id].SetActive(true);}}Mesh CreateMesh(Vector3[] pos, float high,out float dis){int length = pos.Length;int triLength = length * 6;Vector3[] vertices = new Vector3[length * 2];for (int i = 0; i < length; i++){vertices[i] = pos[i];vertices[i + length] = new Vector3(pos[i].x, pos[i].y + high, pos[i].z);}Vector2[] UV = new Vector2[length * 2];dis = 0;for (int i = 0; i < length; i++){if (i != 0){dis += Vector3.Distance(vertices[i], vertices[i - 1]);}UV[i] = new Vector2(0, dis);UV[i + length] = new Vector2(high, dis);}int[] NewTriangles = new int[triLength];for (int i = 0; i < length - 1; i++){NewTriangles[i * 6 + 0] = i + length;NewTriangles[i * 6 + 1] = i + 1;NewTriangles[i * 6 + 2] = i;NewTriangles[i * 6 + 3] = i + length + 1;NewTriangles[i * 6 + 4] = i + 1;NewTriangles[i * 6 + 5] = i + length;}Mesh newMesh = new Mesh();newMesh.vertices = vertices;newMesh.triangles = NewTriangles;newMesh.uv = UV;return newMesh;}
}

围栏shader:

Shader "Unlit/EWall"
{Properties{_MainTex ("Texture", 2D) = "white" {}[HDR] _Color("Color",Color) = (1,1,1,0)  _Speed("Speed",float) = 1  //幅度_UVy("UVy",float) = 0  //UV的y值}SubShader{Tags { "RenderType" = "TransparentCutout" "IgnoreProjector" = "True" "Queue" = "Transparent" }LOD 100Cull Off  //关闭剔除Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float alpha : TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;float _Speed;float _High;float     _UVy;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.alpha = v.vertex.y / _High;return o;}fixed4 frag (v2f i) : SV_Target{fixed2 uv = fixed2(i.uv.x - _Speed * _Time.y,i.uv.y );fixed4 col = tex2D(_MainTex, uv)* _Color;fixed speed = _Speed*5 * _Time.w+ uv.y;//围栏生成动画float lerpVauel;if (_UVy> speed){lerpVauel = 0;}else{lerpVauel = 1;}fixed4 newcol = lerp(fixed4(1, 1, 1, 0), fixed4(col.xyz, 1-i.alpha), lerpVauel);return newcol;}ENDCG}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs获取的微信小程序二进制图片无法展示

我们使用微信官方提供的接口getwxacode获取了微信小程序二维码&#xff0c;但是&#xff0c;获取的二进制图片无论如何都没法展示出来。 调用微信官方接口的方法为&#xff1a;使用Nodejs包request&#xff0c;调用方法为; // 获取小程序二维码 async queryQRCode(access_tok…

Leetcode—2413.最小偶倍数【简单】

2023每日刷题&#xff08;六十&#xff09; Leetcode—2413.最小偶倍数 class Solution { public:int smallestEvenMultiple(int n) {return (n % 2 1) * n;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏…

Mistral AI 为什么这么火

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【构建工具】vite2没捂热,vite5又来了,性能大幅提升!

vite2还没焐热&#xff0c;vite5又来了&#xff01;&#xff01;&#xff01; 就在一周前vite5重磅发布了&#xff01;性能大幅提升! 请看下面&#xff1a;下面是翻译过来的&#xff0c;原文&#xff1a;Vite 5.0 发布&#xff01; |维特 (vitejs.dev) Vite 4 大约在一年前发布…

项目中使用临时文件夹或获取文件资源路径

关于项目中使用临时文件夹的情况 1. 如果想要获取resource目录下的某个文件夹路径&#xff1a; ResourceUtils.getURL("classpath:").getPath() "/xxx" 注意&#xff1a; 1.1 不能直接使用ResourceUtils.getURL("classpath:xxx&quo…

算法训练day37|贪心算法part06

738.单调递增的数字 遇到了strNum[i - 1] > strNum[i]&#xff0c;让strNum[i - 1]--&#xff0c;然后strNum[i]及以后给为9 根据这种情况从后往前遍历 class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] chars s.toCha…

【全方位对比】前端vue2、vue3、vue3语法糖三种写法

Vue 前言1、点击切换页面数据实例对比1.1、vue21.2、vue31.3、vue3 setup语法糖 2、ref 和 reactive2.1、vue22.2、vue32.3、vue3 setup语法糖 3、生命周期4、使用mounted做对比4.1、vue24.2、vue34.3、vue3 setup语法糖 5、watch和computed5.1、vue25.2、vue35.3、vue3 setup语…

MODBUS协议

一、概念 modbus是一个公开免费的协议&#xff0c;广泛应用于工业控制领域&#xff08;PLC和仪器&#xff0c;PLC和PLC&#xff0c;PLC和上位机&#xff0c;PLC和触摸屏等等&#xff0c;其中PLC是可控制逻辑单元&#xff09; 他有两种物理接口&#xff08;硬件协议&#xff09;…

uniapp 蓝牙小程序-兼容安卓和iOS

withTimeout方法可以在搜寻设备时等待指定的秒数&#xff0c;如果30秒内未搜索到则取消搜索 /*** 超时控制函数* param {Promise} promise 回调函数* param {number} timeout 超时时间, 默认10s*/ export function withTimeout(promise, timeout 10000) {let timeoutEvent …

vba里字符串操作函数小结

目录 left,right,mid,LensplitvaljoininstrInStrRevReplacemid删除空格字符串与ASCIIleft,right,mid,Len left(字符串,截取长度) 返回从字符串左边算起指定截取长度的字符。 right(字符串,截取长度) 返回从字符串右边算起指定截取长度的字符。 mid(字符串,截取起始位置,截…

基于Netty连接池泄露问题了解客户端启动源码

连接池导致内存泄漏案例演示 简介 我们生产环境常常会用Netty客户端作为连接工具&#xff0c;尽管Netty强大且方便&#xff0c;但是使用不当的话也可能造成严重的生成事故。笔者本文就以一个连接池使用不当导致内存泄漏的案例来展开探讨。 问题复现 服务端代码 我们先贴出…

Sui承诺向流动性质押协议投入$SUI

Sui将提供SUI以支持三个流动性质押协议及其相应的流动性质押token&#xff08; Liquid Staking Tokens&#xff0c;LST&#xff09;&#xff0c;为网络上不断增长的DeFi领域增加了流动性。此次注入将加强LST在交易和其他DeFi 用途中的流动性。 流动性质押让SUI所有者通过将其t…

理德外汇:美联储降息风潮没吹到欧洲,挪威更是意外加息

随着周四凌晨美联储意外大谈降息&#xff0c;全球金融市场的讨论热点似乎一夜之间就从“保持高利率”转向“何时降息”。 然而&#xff0c;周四披露最新利率决议的英国央行和挪威央行联手告诉市场&#xff1a;通胀的故事还没有翻篇呢&#xff01; 英国央行&#xff1a;维持紧缩…

32、应急响应——linux

文章目录 一、linux进程排查二、linux文件排查三、linux用户排查四、linux持久化排查4.1 历史命令4.2 定时任务排查4.3 开机启动项排查 五、linux日志分析六、工具应用 一、linux进程排查 查看资源占用&#xff1a;top查看所有进程&#xff1a;ps -ef根据进程PID查看进程详细信…

ARM开发

ARM课程介绍 课程特点 ARM开发 --> Linux移植 --> 驱动开发 前后联系&#xff1a;ARM和系统移植为驱动开发学习做准备工作 所需知识&#xff1a;C语言基础及STM32需要的硬件知识 课程要求 目标&#xff1a;学习程序运行原理、硬件的控制原理 会看原理图、芯片手册、学习…

C语言常用字符串函数总结

1、将字符串转换为数字 strtol 根据进制转化为 long int型数字&#xff0c;比如要将字符串"1a"转化成16进制数字 0x1a strtoul 根据进制转化为 unsigned long int 型数字。比如要将字符串"1a"转化成16进制数字 0x1a atoi 将字符串转化为int型数字。…

C/C++ 知识点:类成员初始化方法

一、类成员初始化方法 C支持的类成员初始化方法有&#xff1a;初始化列表、构造函数初始化、声明时初始化&#xff08;C11后才支持&#xff09;。从C11之后&#xff0c;这三种初始化的方法都可以使用&#xff0c;并不会存在冲突&#xff0c;但是&#xff0c;他们之间是有优先级…

ChatGPT对话为什么不用WebSocket而使用EventSource?

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

Git 命令一览

一&#xff0c;常用操作 # 将所有修改的文件从工作区放入暂存区 git add ./ --> 放入暂存区 # 添加commit信息&#xff0c;文件从暂存区提交到本地仓库中 git commit -m xxx --> 提交到本地仓库 # 拉取远程主机某个分支&#xff0c;再与本地分支合并 git pull --&g…

SpringBoot+Netty+Websocket实现消息推送

这样一个需求&#xff1a;把设备异常的状态每10秒推送到页面并且以弹窗弹出来&#xff0c;这个时候用Websocket最为合适&#xff0c;今天主要是后端代码展示。 添加依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifact…