Unity 3D饼状图效果

一. 效果展示

二.基础类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DrawCylinder : MonoBehaviour
{// 网格渲染器MeshRenderer meshRenderer;// 网格过滤器MeshFilter meshFilter;// 用来存放顶点数据List<Vector3> verts;        // 顶点列表List<int> indices;          // 序号列表public int count = 270;private int preCount;private int height = 1;private Color preColor;public Color color = Color.blue;private Material material;public int Index;public static List<int> Counts = new List<int>() { 180,90,11,36,43};private void Start(){Debug.Log("DrawCylinder count " + count);verts = new List<Vector3>();indices = new List<int>();meshRenderer = GetComponent<MeshRenderer>();meshFilter = GetComponent<MeshFilter>();material = meshRenderer.material;Generate();}private void Update(){if (preCount != count) {preCount = count;verts.Clear();indices.Clear();Generate();}if (preColor != color) {preColor = color;material.SetColor("_Color", color);}}public void Generate(){int avgAngle = 1;Vector3 twoVert = new Vector3(1, 0, 0);for (int i = 0; i < count; i++){int angle = avgAngle * (i + 1);verts.Add(Vector3.zero);verts.Add(twoVert);verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(new Vector3(0, -height, 0));verts.Add(twoVert + new Vector3(0, -height, 0));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), -height, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(twoVert);verts.Add(twoVert + new Vector3(0, -height, 0));verts.Add(Vector3.zero);verts.Add(twoVert + new Vector3(0, -height, 0));verts.Add(new Vector3(0, -height, 0));verts.Add(Vector3.zero);verts.Add(Vector3.zero);verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), -height, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), -height, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(new Vector3(0, -height, 0));verts.Add(Vector3.zero);verts.Add(twoVert);verts.Add(twoVert + new Vector3(0, -height, 0));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(twoVert + new Vector3(0, -height, 0));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), -height, -Mathf.Sin(angle * Mathf.Deg2Rad)));verts.Add(new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, -Mathf.Sin(angle * Mathf.Deg2Rad)));for (int j = i * 24; j < 24 * (i + 1); j++){indices.Add(j);}twoVert = new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, -Mathf.Sin(angle * Mathf.Deg2Rad));}Mesh mesh = new Mesh();mesh.SetVertices(verts);mesh.SetIndices(indices, MeshTopology.Triangles, 0);// 自动计算法线mesh.RecalculateNormals();// 自动计算物体的整体边界mesh.RecalculateBounds();// 将mesh对象赋值给网格过滤器,就完成了meshFilter.mesh = mesh;//设置角度int c = 0;for (int i = 0; i < Counts.Count; i++){if (i > Index){break;}c += Counts[i];transform.localEulerAngles = new Vector3(0, -c, 0);}//设置位置int max = 0;for (int i = 0; i < Counts.Count; i++){if (Counts[i] > max){max = Counts[i];}}if (max == count){transform.localScale = new Vector3(1, 1, 1);transform.localPosition = Vector3.zero;}else {float h = count * 1f / max;transform.localScale = new Vector3(1, h, 1);transform.localPosition = new Vector3(0, -(height - h), 0);}}
}

三.UI目录

四. 子节点上添加MeshRender和MeshFilter组件, 把DrawCylinder脚本挂在每个子节点上,调整参数,count占的份额,总份额是360,index是索引。注意,子节点上面显示的count和index,需要和DrawCylinder类里面的Counts列表索引和数额对应一样。

五.给子节点换上Cull Off 的材质,新建材质球,把shader拖到材质球上,再把材质球给到每个子节点,shader代码如下

Shader "Unlit/DrawCylinderShader"
{Properties{_Color ("Color", Color) = (0,0,0,0)_Diffuse("Diffuse", Color) = (1,1,1,1)_Value("Diffuse", float) = 1}SubShader{Tags { "RenderType"="Opaque" }Cull OffPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};fixed4 _Color;uniform fixed4 _Diffuse;float _Value;struct v2f{float2 uv : TEXCOORD0;float3 worldNormal:TEXCOORD1;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 lambert = saturate(dot(worldNormal, worldLightDir));fixed3 albedo = (lambert * _Diffuse.xyz * _LightColor0.xyz + UNITY_LIGHTMODEL_AMBIENT.xyz) * _Value;return fixed4(_Color.xyz * albedo,1) ;}ENDCG}}
}

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

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

相关文章

MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?

MyBatis是什么&#xff1f; MyBatis是一个半自动的ORM持久层框架&#xff0c;内部封装了JDBC&#xff0c;mybatis是通过XML或注解的方式将需要执行的statement配置&#xff0c;支持定制化sql&#xff0c;存储过程以及高级映射。 解释 所谓的半自动ORM意思就是将JDBC的工作交…

吉利前端、AI面试

诸葛耘墒的在线视频面试 1、小程序端AI视频面试 虚拟人面试官提问 视频口述回答 1、最近的两份工作经历&#xff0c;以及上一份离职原因2、在过往的工作或生活中&#xff0c;需要学习掌握一项与工作有关的技能或兴趣爱好时&#xff0c;你会运用哪些方法和诀窍&#xff0c;投入…

基于容器的云原生,让业务更自由地翱翔云端

无论是要构建一个应用或开发一个更庞大的解决方案&#xff0c;在技术选型时&#xff0c;技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。 那么当你的业务已经上云&#x…

S32K324 Stack异常分析及解决方案

文章目录 前言正向排查尝试反向排查问题原因分析问题解决处理总结前言 在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。 正向排查尝试 由于问题复现的概率…

28、基于springboot的房屋租赁系统

房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高&#xff0c;为满足用户查询房屋、预约看房、房屋租赁的需求&#xff0c;特开发了本基于Spring Boot的房屋租赁系统。 本文重点阐述了房屋租赁系统的开发过程&…

[react] <NavLink>自带激活属性

NavLink v6.28.0 | React Router 点谁谁就带上类名 当然类名也是可以自定义 <NavLinkto{item.link}className{({ isActive }) > (isActive ? 测试 : )}>{item.title}</NavLink> 有什么用?他会监听你的路由,刷新的话也会带上激活效果

深入理解 HTTP HEAD 请求:节省带宽、提高效率的秘密武器

序言&#xff1a; 在HTTP协议中&#xff0c;HEAD请求是一种非常实用且被忽略的请求方法。与GET请求相似&#xff0c;HEAD请求同样从服务器获取资源&#xff0c;但与GET请求的最大不同之处在与&#xff0c;HEAD请求 仅返回响应的头部信息&#xff0c;不包含内容提。这使得HEAD请…

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息&#xff0c;据报道&#xff0c;OpenAI开启了第八天技术分享直播&#xff0c;对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中&#xff0c;实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化&#xff0c;使得用户提出问题后&…

如何利用webpack来优化前端性能?

使用Webpack来优化前端性能涉及到多个方面&#xff0c;以下是一些关键的策略和技巧&#xff1a; 1. 代码拆分&#xff08;Code Splitting&#xff09; 通过代码拆分&#xff0c;可以将代码分成不同的块&#xff08;chunks&#xff09;&#xff0c;按需加载&#xff0c;从而减…

Springboot 整合DL4J 打造智能写作助手(文本生成)

项目准备 环境要求: Java 1.8或以上 Maven 或 Gradle&#xff08;用于项目管理&#xff09; Spring Boot框架 DL4J库&#xff08;DeepLearning4J&#xff09; 创建 Spring Boot 项目 使用 Spring Initializr 来生成一个新的 Spring Boot 项目。选择合适的依赖&#xff0c;例如…

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

android studio更改应用图片,和应用名字。

更改应用图标&#xff0c;和名字 先打开AndroidManifest.xml文件。 更改图片文件名字&#xff08; 右键-->构建-->重命名&#xff08;R&#xff09;&#xff09;

Android 16 关于动态权限使用的变更

权限声明code 在 Android 中&#xff0c;权限的申请分为静态权限和动态权限。 静态权限 静态权限是指在应用的 AndroidManifest.xml 文件中声明的权限。这些权限在应用安装时就会被用户授予。常见的静态权限包括访问互联网、读取用户联系人等。 <manifest xmlns:android&…

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作 一、数据操作二、CRUD说明&#xff1a; 三、数据验证为什么需要数据验证&#xff1f;Go Web应用中的数据验证示例步骤 1: 定义订单结构体步骤 2: 实现验证逻辑步骤 3: 在HTTP处理函数中使用验证 四、数据格式化什么是数…

kali设置中文输入法

目录 下载 使用 下载 打开终端输入 sudo apt-get install ibus ibus-pinyin 点击y即可 使用 桌面右上角这里可以选择中文输入法 效果如下

VTK知识学习(27)- 图像基本操作(二)

1、图像类型转换 1&#xff09;vtkImageCast 图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑&#xff0c;会将结果存储为float或double类型&#xff0c;但在图像显示时&#xff0c;一般要求图像为 unsigned char 类型,…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来&#xff0c;云原生技术迅猛发展&#xff0c;成为企业数字化转型的关键动力&#xff0c;云原生不仅极大地提升了系统的灵活性和可扩展性&#xff0c;还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

lpips使用笔记

LPIPS指的是 Learned Perceptual Image Patch Similarity&#xff08;学习感知图像块相似度&#xff09;&#xff0c;它是一种用于衡量两张图像之间感知相似度的指标。 1. 安装 pip install lpips 2. 使用 import torch import lpips# 加载预训练的 LPIPS 模型 loss_fn lp…

学习因子异步化的粒子群优化算法(AsyLnCPSO)——源码

目录 1. 学习因子异步化的概念 2. 算法步骤 2.1 初始化 2.2 迭代过程 3.优势 4. 与传统粒子群算法的区别 5.代码下载&#xff1a; 学习因子异步化的粒子群优化算法&#xff08;AsyLnCPSO&#xff09;是一种改进的粒子群优化&#xff08;PSO&#xff09;算法&#xff0c;…

windows安装Elasticsearch及增删改查操作

1.首先去官网下载Elasticsearch 下载地址 我这里选择的是7.17.18 选择windows版本 下载完成后解压是这样的 下载完成后点击elasticsearch.bat启动elasticsearch服务 输入http://localhost:9200看到如下信息说明启动成功。 还有记得修改elasticsearch.yml文件,创建node名…