代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //因为屏幕自适度原因,使用了Canvas的Canvas Scaler组件(Canvas来自Unity的UI)
public class Area : MonoBehaviour {
public Material Red_Mate;
public Material Green_Mate;
public Material Tran_Mate;
public GameObject SuccessPlan_Image; //储存识别识别图成功的“识别成功”图片
public GameObject Earth; //用于给延迟函数调用地球的截图脚本
private CanvasScaler Cans; //申请变量储存UI屏幕自适度(长&宽)的缩放组件
private float X_Sc; //申请浮点型变量储存实际的缩放比例(实际的/Unity使用的)
private Vector2 TopLeft_UI, BottomLeft_UI, TopRight_UI, BottomRight_UI; //记录扫描框坐标 二维!我们可以看到Vector2是淡蓝色,代表一个类,所以需要实例化。
private Vector3 TopLeft_pl_w, BottomLeft_pl_w, TopRight_pl_w, BottomRight_pl_w; // //记录面片的世界坐标 三维!
private Vector2 PlaneWH; //获取面片二维方向上高和宽的长度!
Vector2 TopLeft_pl_sc, BottomLeft_pl_sc, TopRight_pl_sc, BottomRight_pl_sc; //记录面片的屏幕坐标
private bool HasRe=false; //储存是否识别成功bool函数
void Start () {
Cans = GameObject.Find("Canvas").gameObject.GetComponent<CanvasScaler>(); //获取屏幕自适度,GameObject指GameObject.Find("Canvas")这个物体,gameObject指GameObject这个物体。待测试去掉gameOgject是否可运行。
X_Sc = Screen.width / Cans.referenceResolution.x;
//为什么是除以x呢?因为在unity中,UI Scale Mode选的是Scale with Screen Scale,根据屏幕比例自动缩放,并且下方的
//Screen Match Mode——Match Width or Height滑动条中,我们将滑动条拖到了最左侧的Width,所以是用屏幕宽度/自定义的宽度。
}
void Update () {
//计算扫描框四个点位置
TopLeft_UI = new Vector2(Screen.width - 400*X_Sc, Screen.height 300 * X_Sc) * 0.5f; //因为不确定屏幕分辨率大小,所以需先获取;记得f!
BottomLeft_UI = new Vector2(Screen.width - 400 * X_Sc, Screen.height - 300 * X_Sc) * 0.5f; //屏幕左下角(0,0),向右x轴,向上y轴
TopRight_UI = new Vector2(Screen.width 400 * X_Sc, Screen.height 300 * X_Sc) * 0.5f;
BottomRight_UI = new Vector2(Screen.width 400 * X_Sc, Screen.height - 300 * X_Sc) * 0.5f;
//我们需要的是面片在空间中的大小,但我们获取到的是面片的实际大小,它本身缩放了0.1倍,它父集缩放50倍,所以他在空间实际是扩大了5倍,所以要*5。
PlaneWH = new Vector2(gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x, gameObject.GetComponent<MeshFilter>().mesh.bounds.size.z)*5*0.5f; //空间中x、z是长宽,y是空间中的高度!
//获得图片的四个点世界坐标(gameobject指的是面片,它的父集是图片)(position是图片中心的位置,所以需要加上面片x,y向长度)
TopLeft_pl_w = gameObject.transform.parent.position new Vector3(-PlaneWH.x, 0, PlaneWH.y);
BottomLeft_pl_w = gameObject.transform.parent.position new Vector3(-PlaneWH.x, 0, -PlaneWH.y);
TopRight_pl_w = gameObject.transform.parent.position new Vector3(PlaneWH.x, 0, PlaneWH.y);
BottomRight_pl_w = gameObject.transform.parent.position new Vector3(PlaneWH.x, 0, -PlaneWH.y);
//获取面片的屏幕坐标
TopLeft_pl_sc = Camera.main.WorldToScreenPoint(TopLeft_pl_w); //Camera.main.WorldToScreenPoint()是封装好的函数,将三维向量转化为屏幕的二维向量。
BottomLeft_pl_sc = Camera.main.WorldToScreenPoint(BottomLeft_pl_w);
TopRight_pl_sc = Camera.main.WorldToScreenPoint(TopRight_pl_w);
BottomRight_pl_sc = Camera.main.WorldToScreenPoint(BottomRight_pl_w);
if (TopLeft_pl_sc.x>TopLeft_UI.x && TopLeft_pl_sc.y < TopLeft_UI.y && BottomLeft_pl_sc.x > BottomLeft_UI.x && BottomLeft_pl_sc.y > BottomLeft_UI.y&&TopRight_pl_sc.x<TopRight_UI.x&&TopRight_pl_sc.y<TopRight_UI.y&&BottomRight_pl_sc.x<BottomRight_UI.x&&BottomRight_pl_sc.y>BottomRight_UI.y)
{
if(HasRe==false)
{
gameObject.GetComponent<Renderer>().material = Green_Mate; //当面片完全处于扫描框中时执行代码赋予材质
StartCoroutine("SuccessUI"); //调用截图成功的延迟函数
StartCoroutine("ScreenShot"); //调用截图的延迟函数
HasRe = true; //原先识别状态HasRe为false,现在识别成功,赋值true,且函数是每一帧都调用的,所以能和else中false一起供延迟函数判断此时识别图还是否位于扫描框中。
//且这个if没有else,意味着HasRe为teur时每一帧调用后不会重复调用if中的调用命令。
}
}
else
{
gameObject.GetComponent<Renderer>().material = Red_Mate;
HasRe = false;
}
}
IEnumerator SuccessUI()
{
yield return new WaitForSeconds(0.5f); //延迟0.5s
SuccessPlan_Image.SetActive(true); //原先的“识别成功”图片未关闭状态,现在激活。
gameObject.GetComponent<Renderer>().material = Tran_Mate; //将面片由绿色变为透明,除去截图时的影响。
}
IEnumerator ScreenShot()
{
yield return new WaitForSeconds(2.0f);
if (HasRe==true) //只有当识别状态为true时才执行,避免这2s发生移除扫描框操作。
{
gameObject.GetComponent<Renderer>().material = Tran_Mate; //将面片由绿色变为透明,除去截图时的影响。
Earth.GetComponent<ScreenShot>().ScreenShot_Button(); //调用地球ScreenShot脚本中的ScreenShot_Button()函数!
}
}
}
本章注意事项: 1、要作为UGUI使用的图片,格式应该精灵格式,即其Texture Type——Sprite(2D and UI) 2、之前UI显示的画面都是Unity自动生成的UI,所以不需要我们改动,但我们自己添加的需要改成上述格式 3、我们在代码中确定了识别框UI的大小,所以一定不能在Unity中随意拖动识别框改变它的大小,否则计算不成功。