Unity實現(xiàn)刮獎效果
更新時間:2020年10月28日 10:14:27 作者:LLLLL__
這篇文章主要為大家詳細介紹了Unity實現(xiàn)刮獎效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Unity實現(xiàn)刮獎效果的具體代碼,供大家參考,具體內(nèi)容如下
需要一個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 Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 ColorMask RGB AlphaTest Greater .01 Blend SrcAlpha OneMinusSrcAlpha ColorMaterial 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 texture half4 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); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
newtonsoft.json解析天氣數(shù)據(jù)出錯解決方法
這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時出錯的解決方法,需要的朋友可以參考下2014-02-02C#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法及區(qū)別解析
今天我們將探討C#中兩個常用的字符串處理方法:IsNullOrEmpty和IsNullOrWhiteSpace,本文中,我們將詳細解釋這兩個方法的功能和使用場景,并幫助您更好地理解它們之間的區(qū)別,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-07-07C#5.0中的異步編程關(guān)鍵字async和await
這篇文章介紹了C#5.0中的異步編程關(guān)鍵字async和await,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06DevExpress實現(xiàn)為TextEdit設(shè)置水印文字的方法
這篇文章主要介紹了DevExpress實現(xiàn)為TextEdit設(shè)置水印文字的方法,對C#程序設(shè)計人員來說是一個很實用的技巧,需要的朋友可以參考下2014-08-08C#使用CryptoStream類加密和解密字符串的實現(xiàn)
CryptoStream設(shè)計用于在內(nèi)容以流的形式輸出到文件時加密和解密內(nèi)容,本文主要介紹了C#使用CryptoStream類加密和解密字符串的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01