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

这篇具有很好参考价值的文章主要介绍了【Unity】简单实现生成式电子围栏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

示例下载
实现效果

动态生成

【Unity】简单实现生成式电子围栏,Unity,unity,游戏引擎

区域标识

【Unity】简单实现生成式电子围栏,Unity,unity,游戏引擎

警报效果

【Unity】简单实现生成式电子围栏,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 update
    void 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:文章来源地址https://www.toymoban.com/news/detail-783076.html

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 100
		Cull Off  //关闭剔除
		Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            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
        }
    }
}

到了这里,关于【Unity】简单实现生成式电子围栏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简单的Unity中设置游戏死亡界面并实现跳转

    在Unity中设置游戏死亡界面可以通过以下步骤完成: 创建新的场景:在Unity的菜单栏中选择“File”,然后选择“New Scene”。这将创建一个新的、空的场景。 创建游戏死亡UI:在新的场景中创建一个游戏死亡界面。可以使用Unity的UI工具来创建UI元素,例如文本、按钮、背景等。

    2024年02月06日
    浏览(116)
  • Unity 游戏开发、01 基础篇 | 知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(59)
  • Unity 游戏开发、01 基础知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(62)
  • 【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

    【视频】:https://www.youtube.com/watch?app=desktopv=-QOCX6SVFsklist=PLcRSafycjWFenI87z7uZHFv6cUG2Tzu9vindex=1 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月03日
    浏览(48)
  • 【制作100个unity实战之2】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月04日
    浏览(67)
  • 【实现100个unity游戏之20】制作一个2d开放世界游戏,TileMap+柏林噪声生成随机地图(附源码)

    我的上一篇文章介绍了TileMap的使用,主要是为我这篇做一个铺垫,看过上一篇文章的人,应该已经很好的理解TileMap的使用了,这里我就不需要过多的解释一些繁琐而基础的知识了,省去很多时间。所有没看过上一篇文章的小伙伴我强烈建议先去看看:

    2024年01月20日
    浏览(52)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(79)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(78)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(66)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包