Unity利用shader实现自定义扇形技能范围显示

最终效果

在这里插入图片描述

用法

1.创建一个Plane
在这里插入图片描述

2.创建一个Material
3.创建一个Shader,内容如下:
在这里插入图片描述

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Indicator" {
	Properties{
		_MainTex("Main Texture", 2D) = "white" {}
		_Color("Color", Color) = (0.17,0.36,0.81,0.0)
		_Angle("Angle", Range(0, 360)) = 60
		_Gradient("Gradient", Range(0, 1)) = 0
	}

		SubShader{
		Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" }
			 Pass {
				ZWrite Off
				Blend SrcAlpha OneMinusSrcAlpha
				CGPROGRAM

				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"

				sampler2D _MainTex;
				float4 _Color;
				float _Angle;
				float _Gradient;

				struct fragmentInput {
					float4 pos : SV_POSITION;
					float2 uv : TEXTCOORD0;
				};

				fragmentInput vert(appdata_base v)
				{
					fragmentInput o;

					o.pos = UnityObjectToClipPos(v.vertex);
					o.uv = v.texcoord.xy;

					return o;
				}

				fixed4 frag(fragmentInput i) : SV_Target {
					// 离中心点的距离
					float distance = sqrt(pow(i.uv.x - 0.5, 2) + pow(i.uv.y - 0.5, 2));
				// 在圆外
				if (distance > 0.5f) {
					discard;
				}
				// 根据距离计算透明度渐变
				float grediant = (1 - distance - 0.5 * _Gradient) / 0.5;
				// 正常显示的结果
				fixed4 result = tex2D(_MainTex, i.uv) * _Color * fixed4(1,1,1, grediant);
				float x = i.uv.x;
				float y = i.uv.y;
				float deg2rad = 0.017453;   // 角度转弧度
				// 根据角度剔除掉不需要显示的部分
				// 大于180度
				if (_Angle > 180) {
					if (y > 0.5 && abs(0.5 - y) >= abs(0.5 - x) / tan((180 - _Angle / 2) * deg2rad))
						discard;// 剔除
				}
				else    // 180度以内
				{
					if (y > 0.5 || abs(0.5 - y) < abs(0.5 - x) / tan(_Angle / 2 * deg2rad))
						discard;
				}
				return result;
			}

			ENDCG
		}
		}
			FallBack "Diffuse"
}

4.将Shader赋予Material,将Material赋予Plane。关闭Plane的投影和接收阴影,不然效果看着有点怪。

在这里插入图片描述

在这里插入图片描述

5.调整Plane的位置和大小即可

原文链接

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Unity中,您可以使用Shader来控制模型的显示范围。以下是一个简单的实现方法: 1. 创建一个新的Shader:在Unity的Project面板中,右键点击Assets文件夹,选择Create->Shader来创建一个新的Shader。 2. 编写Shader代码:在创建的Shader中,打开Shader文件,输入以下代码: ``` Shader "Custom/ClippingShader" { Properties { _ClipRange ("Clip Range", Range(0,1)) = 0.5 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; float _ClipRange; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } half4 frag (v2f i) : COLOR { clip(i.vertex.w - _ClipRange); return half4(0, 0, 0, 0); } ENDCG } } } ``` 这个Shader代码包含一个名为_ClipRange的属性,该属性定义了裁剪范围,取值范围为0到1。在Pass块中,我们使用了UnityCG.cginc库来提供一些常见的函数,包括UnityObjectToClipPos函数,该函数用于将顶点从对象空间转换到剪裁空间。在片段着色器中,我们使用了clip(i.vertex.w - _ClipRange)函数来裁剪模型,这个函数会将剪裁范围之外的像素进行剪裁,只显示剪裁范围之内的像素。 3. 将Shader应用到材质上:在Unity的Project面板中,右键点击Assets文件夹,选择Create->Material来创建一个新的材质。在Inspector面板中,将Shader设置为刚才创建的Shader,并将_ClipRange属性设置为需要裁剪的范围。 4. 将材质应用到模型上:在场景中选择需要裁剪的模型,将材质拖拽到该模型的渲染器组件上。现在,您应该可以看到模型已经被裁剪,只显示了_ClipRange属性指定的范围内的部分。 这是一个简单的使用Shader来控制模型显示范围的方法,您可以根据实际需求进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值