Unity3D中实现箭头指向目标点的效果(shader)

系列文章目录

Unity工具


文章目录

  • 系列文章目录
  • 前言
  • 一、效果如下
  • 二、制作步骤
    • 2-1、制作shader
    • 2-2、shader代码
    • 2-3、制作材质球
    • 2-4、新建Quad
    • 2-5、制作预制体
    • 2-6 、实现代码
    • 2-7、设置Quad到脚本
    • 2-8、路径设置如下
  • 三、说明
  • 四、运行程序
  • 总结


前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。


提示:以下是本篇文章正文内容,下面案例可供参考

一、效果如下

Unity箭头指向目标点视频

二、制作步骤

2-1、制作shader

首先先生成shader文件
在这里插入图片描述

2-2、shader代码

Shader "Custom/ZhiXiangJianTou"
{Properties{_MainTex("Texture", 2D) = "white" {}_ScrollYSpeed("Y Scroll Speed", Range(-20, 20)) = 2}SubShader{Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }LOD 100//双面渲染Cull Off//Alpha混合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;};sampler2D _MainTex;float4 _MainTex_ST;fixed _ScrollYSpeed;v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{fixed2 uv = i.uv;uv.y += _ScrollYSpeed * _Time;fixed4 col = tex2D(_MainTex, uv);return col;}ENDCG}}
}

2-3、制作材质球

在这里插入图片描述
在这里插入图片描述
所需要的贴图
请添加图片描述

2-4、新建Quad

新建一个Quad的对象,给他换上刚刚的材质球
在这里插入图片描述
做成预制体一会用

2-5、制作预制体

1.拖到Project自己创的文件夹下面
在这里插入图片描述
2.如箭头就是刚刚生层的预制体,留着一会用

2-6 、实现代码

预制体一拖,路径点一拖,运行即可看到效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ZhiXiangJianTou : MonoBehaviour
{public MeshRenderer meshRenderer;//箭头3D对象Quad 预制体public List<Transform> points = new List<Transform>();//路径点private List<MeshRenderer> lines = new List<MeshRenderer>();//显示的路径public float xscale = 1f;//缩放比例public float yscale = 1f;void Start(){//箭头宽度缩放值xscale = meshRenderer.transform.localScale.x;//箭头长度缩放值yscale = meshRenderer.transform.localScale.y;}//画路径public void DrawPath(){if (points == null || points.Count <= 1)return;for (int i = 0; i < points.Count - 1; i++){DrawLine(points[i].position, points[i + 1].position, i);}}//画路径 参数为路径点数组public void DrawPath(Vector3[] points){if (points == null || points.Length <= 1)return;for (int i = 0; i < points.Length - 1; i++){DrawLine(points[i], points[i + 1], i);}}//隐藏路径public void HidePath(){for (int i = 0; i < lines.Count; i++)lines[i].gameObject.SetActive(false);}//画路径private void DrawLine(Vector3 start, Vector3 end, int index){Debug.Log(transform.gameObject.name);MeshRenderer mr;if (index >= lines.Count){mr = Instantiate(meshRenderer);lines.Add(mr);}else{mr = lines[index];}var tran = mr.transform;var length = Vector3.Distance(start, end);tran.localScale = new Vector3(xscale, length, 1);tran.position = (start + end) / 2;//指向endtran.LookAt(end);//旋转偏移tran.Rotate(90, 0, 0);mr.material.mainTextureScale = new Vector2(1, length * yscale);mr.gameObject.SetActive(true);}void OnGUI(){if (GUI.Button(new Rect(20, 40, 80, 20), "显示路径")){DrawPath();}if (GUI.Button(new Rect(20, 80, 80, 20), "隐藏路径")){HidePath();}}
}

2-7、设置Quad到脚本

在这里插入图片描述

2-8、路径设置如下

在这里插入图片描述

三、说明

这个是已经计算过根据距离算shader的间隔,不论两个点的间隔多远,shader的渲染间隔是一样的,所以不用担心每个点的间隔不一样了,毫无影响,代码直接用就好了

四、运行程序

Unity箭头指向目标点视频


总结

你的点赞就是对博主的支持,有问题记得留言:
不定时更新Unity开发技巧,觉得有用记得一键三连哦。

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

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

相关文章

鸿蒙开发—UI框架概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术背景的…

数据结构与算法编程题47

无向图的邻接表 #include <iostream> using namespace std;#define MVnum 100 typedef string VertexType;typedef struct ArcNode {int adjvex;struct ArcNode* nextarc;int weight; }ArcNode;typedef struct VNode {VertexType data;struct ArcNode* firstarc; }VNode,…

性能测试工具:Jmeter介绍

JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 1. 原理 JMeter的基本原理是模拟多用户并发访问应用程序&#xff0c;通过发送HTTP请求或其他协议请求&#xff0c;并测量响应时间、吞吐量、并发…

关于对Spring事件监听机制相关解析

1、Spring事件监听器使用 Spring事件监听体系包括三个组件&#xff1a;事件、事件监听器&#xff0c;事件广播器 事件&#xff1a;定义事件类型和事件源&#xff0c;需要继承ApplicationEvent import org.springframework.context.ApplicationEvent; public class OrderEvent…

虹科新闻丨虹科正式加入广州市新联会科创分会

来源&#xff1a;虹科电子科技有限公司 虹科新闻丨虹科正式加入广州市新联会科创分会 11月7日&#xff0c;由广州市委统战部、广州开发区管委会、黄埔区人民政府指导&#xff0c;佳都集团、佳都科技集团、广州开发区投资集团共同主办的未来之城大湾区元宇宙创新示范中心&#…

金鸣表格文字识别大师扫描仪使用技巧

所需硬件&#xff1a;PC&#xff08;电脑&#xff09;、扫描仪 所需软件&#xff1a;金鸣表格文字识别大师5.0以上版本&#xff08;以下简称“本软件”&#xff09; 实现功能&#xff1a;直接用扫描仪扫描图片并将其转换为可编辑的excel或word. 实现原理&#xff1a;本软件利…

DevEco Studio集成ArkUI-X

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 在上篇文章(HarmonyOS应用开发工具DevEco Studio安装与使用)中我说到官方推出了4.0 Beta版本的IDE&#xff0c;这篇文章就来介绍这个版本的安装与使用 该版本集成了HarmonyOS多…

利用ChatGPT的写作能力,可以更好地组织思路、提升论文的逻辑性和质量

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

UE4.27-UE5.1设置打包Android环境

打包Android配置文件 1. 配置打包Android的SDK需求文件位于下面文件中&#xff1a; 2. 指定了对应的SDK环境变量名字以及NDK需求等&#xff1a; UE4.27-UE5.1--脚本自动配置 安装前提 1. 务必关闭虚幻编辑器和Epic Games Launcher&#xff0c;以确保NDK组件的安装或引擎环境…

P1005 [NOIP2007 提高组] 矩阵取数游戏

网址&#xff1a;P1005 [NOIP2007 提高组] 矩阵取数游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 动态规划和高精度的组合&#xff0c;使我的滨州旋转 最后只得了80&#xff0c;两个测试点超时了 看题解有人是用了int128来做的&#xff0c;明天学一下 我的递归思路和…

关于 mapboxgl 的常用方法及效果

给地图标记点 实现效果 /*** 在地图上添加标记点* point: [lng, lat]* color: #83f7a0*/addMarkerOnMap(point, color #83f7a0) {const marker new mapboxgl.Marker({draggable: false,color: color,}).setLngLat(point).addTo(this.map);this.markersList.push(marker);},…

AI必然成为未来的OS

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 ChatGPT引入插件&#xff0c;AI必然成为未来OS&#xff0c;或至少成为绝大多数APP首选入口。未来软件开发根据任务不同&#xff0c;有两种不同范式&#xff1a; &a…

unity 2d 入门 飞翔小鸟 场景淡入淡出功能(三)

1、在图层新建个空的图层 场景2 2创建c#脚本 脚本创建好后&#xff0c;将脚本推拽进空白图层里面&#xff0c;将黑色图片拉进去脚本的参数里面&#xff0c;如上面最后一张图&#xff0c;两个切换的场景都要进行上述操作 using System.Collections; using System.Collection…

识别低效io引起的free buffer waits

产生事发时间段的awr报告 Top 5 wait events 这里重点关注&#xff1a; 1.free buffer waits 2.enq_HW-contention 3.enq:tx-row lock contention enq:HW-contention属于水位线的争用&#xff0c;已经透过alter table allocate extent&#xff0c;提前分配空间,这里不做讨论 …

软件工程之需求分析

一、对需求的基本认识 1.需求分析简介 (1)什么是需求 用户需求&#xff1a;由用户提出。原始的用户需求通常是不能直接做成产品的&#xff0c;需要对其进行分析提炼&#xff0c;最终形成产品需求。 产品需求&#xff1a;产品经理针对用户需求提出的解决方案。 (2)为什么要…

【Python】Flask + MQTT 实现消息订阅发布

目录 Flask MQTT 实现消息订阅发布准备开始1.创建Flask项目2创建py文件&#xff1a;mqtt_demo.py3.代码实现4.项目运行5.测试5.1 测试消息接收5.2 测试消息发布6、扩展 Flask MQTT 实现消息订阅发布 准备 本次项目主要使用到的库&#xff1a;flask_mqtt pip install flask…

Leetcode刷题详解——最长湍流子数组

1. 题目链接&#xff1a;978. 最长湍流子数组 2. 题目描述&#xff1a; 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子…

ALPHA开发板烧录工具MfgTool简介

一. 简介 前面我们已经移植好了 uboot 和 linux kernle &#xff0c;制作好了根文件系统。但是我们移植都是通 过网络来测试的&#xff0c;在实际的产品开发中肯定不可能通过网络来运行。 因此&#xff0c;我们需要将 uboot 、 linux kernel 、 .dtb( 设备树 ) 和 rootf…

串口环形收发原理及实现

一、环形收发队列构建 1、构造环形收发数组及其长度 #define buff_size 10 Unsigned char buff[buff_size]; 2、定义环形收发读/写位置 u16 R_Buff; u16 W_Buff; 3、结构体封装 typedef struct Qbuff {u16 write; //写位置u16 read; //读位置u8 buf…

Zabbix自定义飞书webhook告警媒介1

说明&#xff1a;此配置仅适用于7版本及以上&#xff0c;低版本可能有问题 JavaScript 内容如下&#xff1a; try {var sourceData JSON.parse(value),req new HttpRequest(),response;if (sourceData.HTTPProxy) {req.setProxy(sourceData.HTTPProxy);}req.addHeader(Conte…