Unity实现刮奖效果

时间:2021-05-20

本文实例为大家分享了Unity实现刮奖效果的具体代码,供大家参考,具体内容如下

需要一个Shader和一个CS脚本:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Transparent Colored Eraser"{Properties{_MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}_RendTex ("Base (RGB), Alpha (A)", 2D) = "white" {}} SubShader{LOD 200 Tags{"Queue" = "Transparent""IgnoreProjector" = "True""RenderType" = "Transparent"} Pass{Cull OffLighting OffZWrite OffFog { Mode Off }Offset -1, -1ColorMask RGBAlphaTest Greater .01Blend SrcAlpha OneMinusSrcAlphaColorMaterial AmbientAndDiffuse CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc" sampler2D _MainTex;float4 _MainTex_ST;sampler2D _RendTex; struct appdata_t{float4 vertex : POSITION;half4 color : COLOR;float2 texcoord : TEXCOORD0;}; struct v2f{float4 vertex : POSITION;half4 color : COLOR;float2 texcoord : TEXCOORD0;}; v2f vert (appdata_t v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.color = v.color;o.texcoord = v.texcoord;return o;} half4 frag (v2f IN) : COLOR{// Sample the texturehalf4 col = tex2D(_MainTex, IN.texcoord) * IN.color;half4 rnd = tex2D(_RendTex, IN.texcoord) * IN.color;col.a = rnd.a;return col;}ENDCG}}}using UnityEngine;using UnityEngine.UI;using UnityEngine.EventSystems; public class UIEraserTexture : MonoBehaviour, IPointerDownHandler, IPointerUpHandler{ public RawImage image; public int brushScale = 4; Texture2D texRender; RectTransform mRectTransform; Canvas canvas; void Awake() { mRectTransform = GetComponent<RectTransform>(); canvas = GameObject.Find("Canvas").GetComponent<Canvas>(); } void Start() { texRender = new Texture2D(image.mainTexture.width, image.mainTexture.height, TextureFormat.ARGB32, true); Reset(); } bool isMove = false; public void OnPointerDown(PointerEventData data) { //Debug.Log("OnPointerDown..." + data.position); start = ConvertSceneToUI(data.position); isMove = true; } public void OnPointerUp(PointerEventData data) { isMove = false; //Debug.Log("OnPointerUp..." + data.position); OnMouseMove(data.position); start = Vector2.zero; } void Update() { if (isMove) { OnMouseMove(Input.mousePosition); } } Vector2 start = Vector2.zero; Vector2 end = Vector2.zero; Vector2 ConvertSceneToUI(Vector3 posi) { Vector2 postion; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(mRectTransform, posi, canvas.worldCamera, out postion)) { return postion; } return Vector2.zero; } void OnMouseMove(Vector2 position) { end = ConvertSceneToUI(position); Draw(new Rect(end.x + texRender.width / 2, end.y + texRender.height / 2, brushScale, brushScale)); if (start.Equals(Vector2.zero)) { return; } Rect disract = new Rect((start + end).x / 2 + texRender.width / 2, (start + end).y / 2 + texRender.height / 2, Mathf.Abs(end.x - start.x), Mathf.Abs(end.y - start.y)); for (int x = (int)disract.xMin; x < (int)disract.xMax; x++) { for (int y = (int)disract.yMin; y < (int)disract.yMax; y++) { Draw(new Rect(x, y, brushScale, brushScale)); } } start = end; } void Reset() { for (int i = 0; i < texRender.width; i++) { for (int j = 0; j < texRender.height; j++) { Color color = texRender.GetPixel(i, j); color.a = 1; texRender.SetPixel(i, j, color); } } texRender.Apply(); image.material.SetTexture("_RendTex", texRender); } void Draw(Rect rect) { for (int x = (int)rect.xMin; x < (int)rect.xMax; x++) { for (int y = (int)rect.yMin; y < (int)rect.yMax; y++) { if (x < 0 || x > texRender.width || y < 0 || y > texRender.height) { return; } Color color = texRender.GetPixel(x, y); color.a = 0; texRender.SetPixel(x, y, color); } } texRender.Apply(); image.material.SetTexture("_RendTex", texRender); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章