fgui实现刮刮乐
unity實現刮刮樂效果,網上一大堆使用ugui實現的,但沒有一篇解釋使用fgui的,本篇文章基于fgui實現刮刮樂效果。?
核心代碼來源于這個篇博客,這篇博客基于ugui實現的,我把它換成了fgui的方式
https://blog.csdn.net/qq_39108767/article/details/103412395
using System; using UnityEngine; using FairyGUI;public class FguiErasePoint : MonoBehaviour {//遮罩 要操作的對象private GLoader maskLoader;//要操作的紋理 新建出來的private Texture2D eraseTexture;//圖片大小private float textureLength;//擦除部分圖片大小private float eraseLength;//紋理寬度private int textureWidth;//紋理高度private int textureHeight;//擦除完成調用事件public Action eraseFinishEvent;//擦除比例,擦除比例高于該值,是為擦除完成,自動擦除剩余部分private float finishPercent = 0.9f;//當前進度private float currentPercent;//擦除的半徑public int radius = 10;//遍歷時候 上下左右的值private int startX, endX, startY, endY, pixelY;//鼠標的坐標private Vector3 tmpLocalPos;//是否以擦除完成private bool isFinish;private void Start(){GComponent component = this.GetComponent<UIPanel>().ui;maskLoader = component.GetChild("n3").asLoader;//加載出文理Texture2D tmp = Resources.Load<Texture2D>("testTexture");//創建一個新的文理 后續操作這個文理eraseTexture = new Texture2D(tmp.width, tmp.height, TextureFormat.ARGB32, false);eraseTexture.SetPixels(tmp.GetPixels());eraseTexture.Apply();//將創建的新文理 傳給GLoaderNTexture nTexture = new NTexture(eraseTexture);maskLoader.texture = nTexture;textureWidth = eraseTexture.width;textureHeight = eraseTexture.height;textureLength = eraseTexture.GetPixels().Length;//添加事件component.onTouchBegin.Add(OnTouchBegin);component.onTouchMove.Add(OnTouchMove);component.onTouchEnd.Add(OnTouchEnd);}private void OnTouchBegin(EventContext context){if (isFinish)return;ErasePoint(context.inputEvent.position);context.CaptureTouch();}private void OnTouchMove(EventContext context){if (isFinish)return;ErasePoint(context.inputEvent.position);}private void OnTouchEnd(EventContext context){if (isFinish)return;ErasePoint(context.inputEvent.position);}private void ErasePoint(Vector3 pScreenPos){//屏幕坐標——>本地坐標tmpLocalPos = maskLoader.GlobalToLocal(pScreenPos);//點擊位置是否在圖片范圍內if (tmpLocalPos.x < 0 || tmpLocalPos.x >= textureWidth || tmpLocalPos.y < 0 || tmpLocalPos.y > textureHeight){return;}//最大最小值 已鼠標點為中心startX = (int)tmpLocalPos.x - radius;endX = (int)tmpLocalPos.x + radius;startY = (int)tmpLocalPos.y - radius;endY = (int)tmpLocalPos.y + radius;for (int i = startX - 1; i < endX; i++){//超左/右邊界if (i < 0 || i >= textureWidth)continue;for (int j = startY - 1; j < endY; j++){//fgui坐標是左上角開始的 y坐標需要做個減法 才能對應到像素坐標pixelY = textureHeight - j;//超上/下邊界if (pixelY < 0 || pixelY >= textureHeight){continue;}//是否在圓形范圍內if (Vector3.Distance(new Vector3(i, j), tmpLocalPos) > radius){continue;}//像素點色值Color col = eraseTexture.GetPixel(i, pixelY);//判斷透明度,是否已擦除if (Mathf.Approximately(col.a, 0))continue;//修改像素點透明度col.a = 0.0f;eraseTexture.SetPixel(i, pixelY, col);//擦除數量統計eraseLength++;}}eraseTexture.Apply();//判斷擦除進度RefreshErasePercent();}private void RefreshErasePercent(){if (isFinish)return;currentPercent = eraseLength / textureLength;currentPercent = (float)Math.Round(currentPercent, 2);Debug.Log("擦除百分比 : " + currentPercent);if (currentPercent >= finishPercent){isFinish = true;//觸發結束事件eraseFinishEvent?.Invoke();}} }總結
- 上一篇: c语言linux TCP长连接 sock
- 下一篇: 想尽快进入游戏开发行业的必经之路!