相关涉及到的一些坐标转换函数:
canvasCam.ViewportToWorldPoint(uvWorldPosition);
RectTransformUtility.PixelAdjustPoint(result.screenPosition, StratchCover,curCanvas );
RectTransformUtility.ScreenPointToLocalPointInRectangle(StratchCover, mousePosition, uiCam, out posIn)
一些基础定义:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TargetImage
{
public bool isPaintedFlag = false;
//test
public Image Image;
//
public Rect Rect { get; private set; }
private float AllSquare;
private List<Point> points;
private int wL = 10;
private int hL = 10;
public TargetImage(Rect rect)
{
Rect = rect;
// initialize points
points = new List<Point>((wL) * (hL));
float stepX = Rect.width / wL;
float stepY = Rect.height / hL;
float X = Rect.x;
float Y = Rect.y;
for (int i = 0; i < wL; i++)
{
X = Rect.x;
for (int j = 0; j < hL; j++)
{
var point = new Point(new Vector2(X, Y));
points.Add(point);
X += stepX;
// Debug.Log(string.Format("[{0}_{1}] {2}",i,j, point.Position));
}
Y += stepY;
}
// Debug.Log("All counts"+points.Count);
}
public bool AddIntersectRects(Rect rect)
{
if (isPaintedFlag) return true;
int paintCount = 0;
for (var index = 0; index < points.Count; index++)
{
var point = points[index];
if (rect.Contains(point.Position) && !point.isPaint)
{
point.isPaint = true;
}
if (point.isPaint)
{
paintCount++;
}
}
float percent = paintCount / (points.Count*1f);
isPaintedFlag = percent > 0.7f;
return isPaintedFlag;
}
public void ResetRects()
{
isPaintedFlag = false;
int paintCount = 0;
for (var index = 0; index < points.Count; index++)
{
var point = points[index];
point.isPaint = false;
}
}
}
class Point
{
public Vector2 Position { get; private set; }
public bool isPaint { get; set; }
public Point(Vector2 position)
{
Position = position;
}
}
具体使用实例:
void Update()
{
if (UIManager.instance.IsUIOpen("DlgWait") == false)
{
if (Input.GetMouseButton(0))
{
if (Input.mousePosition != mousePosition)
{
mousePosition = Input.mousePosition;
TouchProcessing();
}
}
if (Input.GetMouseButtonUp(0))
{
guagualeaudionum = 0;
}
if (Input.GetKeyDown(KeyCode.R))
{
TicketReset();
}
}
}
private void TouchProcessing()
{
if (brushCounter >= MAX_BRUSH_COUNT)
return;
Vector3 screenpos = Vector3.zero;
Vector3 uvWorldPosition = Vector3.zero;
if (GetPositionsOnPaintView(ref screenpos, ref uvWorldPosition))
{
PaintStratch(uvWorldPosition);
BrushRect.x = screenpos.x - BrushRect.width / 2;
BrushRect.y = screenpos.y - BrushRect.height / 2;
LotteryTicket.CanculateIntersects(BrushRect);
}
}
public void CanculateIntersects(Rect brushRect)
{
var opened = 0;
for (var index = 0; index < m_scratchBonus.Length; index++)
{
var bonus = m_scratchBonus[index];
if (bonus.TargetImage.isPaintedFlag)
{
continue;
}
opened++;
Rect result;
//Debug.Log(brushRect+":"+bonus.TargetImage.Rect);
// RectTransformUtility.PointInRectangle(brushRect,);
if (brushRect.Intersects(bonus.TargetImage.Rect, out result))
{
var addIntersectRects = bonus.TargetImage.AddIntersectRects(result);
if (addIntersectRects)
{
// bonus.TargetImage.Image.color = Color.green;
}
}
}
if (opened == 0)
{
ShowResult();
}
}