首页 > 代码库 > Unity API 解析(1)

Unity API 解析(1)

Application 类

Application 类不含实例属性和实例方法,在脚本中通过直接调用Application类的静态属性和静态方法来控制程序的运行时数据

dataPath 属性 —— 数据文件路径 —— 返回程序的数据文件所在文件夹的路径(只读),返回路径为相对路径,不同游戏平台的数据文件保存路径不同

public  static  string  dataPath { get; }

dataPath 和 streamingAssetsPath 的路径位置一般是相对程序的安装目录位置

persistentDataPath 和 temporaryCachePath 的路径位置一般是相对所在系统的固定位置

 

loadedLevel 属性 —— 关卡索引

public static int loadedLevel { get; }

此属性用于返回当前程序最后加载的关卡(Scene)的索引值

using UnityEngine;using System.Collections;public class LoadedLevel_ts : MonoBehaviour{    void Start()    {        // 返回当前场景的索引值        Debug.Log("loadedLevel:" + Application.loadedLevel);        // 返回当前场景的名字        Debug.Log("loadedLevelName:" + Application.loadedLevelName);        // 是否有场景正在被加载		// 在使用application类的静态方法LoadLevel 或 LoadLevelAdditive 加载一个新的场景时,需要一段时间		// 当场景加载完毕时,返回true,否则false        Debug.Log("isLoadingLevel:" + Application.isLoadingLevel);        // 返回游戏中可被加载的场景数量        Debug.Log("levelCount:" + Application.levelCount);        // 返回当前游戏的运行平台        Debug.Log("platform:" + Application.platform);        // 当前游戏是否正在运行        Debug.Log("isPlaying:" + Application.isPlaying);        // 当前游戏是否处于Unity 编辑模式        Debug.Log("isEditor:" + Application.isEditor);    }}

 

CaptureScreenshot 方法 —— 截屏

public static void CaptureScreenshot(string filename,int superSize);

参数 :截屏文件名,放大系数

生成的图片在程序根目录下

using UnityEngine;using System.Collections;public class Capture_Use_Sub_ts : MonoBehaviour{    //物体移动的目标位置    public Vector3 toward;	// 声明公共变量,以便在主脚本中调用    //物体移动时间    float delays;    void Start()    {        //获取一个随机值        delays = Random.Range(2.0f, 4.0f);    }    void Update()    {        //通过更改物体位置来达到物体运动的效果        transform.position = Vector3.MoveTowards(transform.position, toward, delays);    }}
using UnityEngine;using System.Collections;public class Capture_Use_ts : MonoBehaviour{    //td:用来指向屏幕截图    Texture2D td = null;    //txt_bg:用来指向文本输入的背景图片    //可以指向一张纯色的图片,也可以自定义一个纯色的背景    //本程序自定义了一个纯色的背景    Texture2D txt_bg;    //txt_w和txt_h用来记录文本框的宽度和高度    int txt_w, txt_h;    //my_save_path:用来记录截图的保存路径    string my_save_path = "";    //show_txt:用来记录输入的文本    string show_txt = "在此输入";    //my_colors:用来记录文本输入框的纹理颜色    Color[] my_colors;    //_w和_h用来记录my_colors的宽度和高度    int _w, _h;    //step:用来记录当前状态,step共有3种状态:    //step=0时,是等待状态,等待在文本框中输入文本    //step=1时,即点击“确定”按钮后,生成截图并保存    //step=2时,读取截图信息    //step=3时,是对读取的截图信息进行有选择的提取,并生成想要展示的内容    int step = 0;    //go:用来指向拼字所用物体对象    public GameObject go;    //gos:用来记录所有的go对象    GameObject[] gos;    //gos_max用来记录gos的最大容量    int gos_max;    //gos_cur用来记录gos当前使用值    int gos_cur = 0;    //is_show:用来记录图像矩阵中某个点是否需要展示物体    bool[,] is_show;    void Start()    {        //初始化文本框的宽度和高度        txt_w = 200;        txt_h = 80;        //初始化截取区间的大小,为了避免边界识别错误,其值应该比文本框的宽度和高度少几个像素        _w = txt_w;        _h = txt_h;        _w -= 5;        _h -= 5;        //自定义txt_bg纹理        txt_bg = new Texture2D(txt_w, txt_h);        Color[] tdc = new Color[txt_w * txt_h];        for (int i = 0; i < txt_w * txt_h; i++)        {            //所用像素点颜色应相同            tdc[i] = Color.white;        }        txt_bg.SetPixels(0, 0, txt_w, txt_h, tdc);        is_show = new bool[_h, _w];        //初始化gos_max,其值大小为_w * _h的三分之一在一般情况下就够用了        gos_max = _w * _h / 3;        //实例化gos,使其随机分布_w和_h的区间内        gos = new GameObject[gos_max];        for (int i = 0; i < gos_max; i++)        {            gos[i] = (GameObject)Instantiate(go, new Vector3(Random.value * _w, Random.value * _h, 10.0f), Quaternion.identity);            gos[i].GetComponent<Capture_Use_Sub_ts>().toward = gos[i].transform.position;        }        //存储初始界面截图        my_save_path = Application.persistentDataPath;        Application.CaptureScreenshot(my_save_path + "/ts02.png");    }    void Update()    {        switch (step)        {            case 0:                break;            case 1:                step = 0;                //截图并保存                my_save_path = Application.persistentDataPath;                Application.CaptureScreenshot(my_save_path + "/ts02.png");                //给电脑一点儿时间用来保存新截取的图片                Invoke("My_WaitForSeconds", 0.4f);                Debug.Log(my_save_path);                break;            case 2:                //由于在读取截图纹理的时候,一帧之内可能无法读完                //所以需要step=0,避免逻辑出现混乱                step = 0;                //读取截图信息                my_save_path = Application.persistentDataPath;                StartCoroutine(WaitLoad(my_save_path + "/ts02.png"));                break;            case 3:                //在计算并生成展示信息的时候,一帧之内可能无法完成                //所以需要step=0,避免逻辑出现混乱                step = 0;                //计算并生成展示信息                Cum();                break;        }    }    //计算并生成展示信息    void Cum()    {        if (td != null)        {            float ft;            //ft:用来记录文本框左下角像素的R通道值,用来作为后面的参照            ft = td.GetPixel(2, td.height - _h).r;            //截取文本框纹理信息            //需要注意的是,纹理坐标系和GUI坐标系不同            //纹理坐标系以坐下角为原点,而GUI坐标系以左上角为原点            //以2为x方向起点是为了避免截图边缘的痕迹            my_colors = td.GetPixels(2, td.height - _h, _w, _h);            int l = my_colors.Length;            Debug.Log("length: " + l);            //通过遍历my_colors的R值,将其与ft比较来确定是否需要展示物体            for (int i = 0; i < l; i++)            {                is_show[i / _w, i % _w] = my_colors[i].r == ft ? false : true;            }            //根据is_show的值排列gos中物体的位置            for (int i = 0; i < _h; i++)            {                for (int j = 0; j < _w; j++)                {                    if (is_show[i, j])                    {                        if (gos_cur < gos_max)                        {                            gos[gos_cur].GetComponent<Capture_Use_Sub_ts>().toward = new Vector3(j, i, 0.0f);                            gos[gos_cur].SetActive(true);                            gos_cur++;                        }                        //当当前gos数量不够用时需要扩充gos的容量                        else                        {                            Debug.Log("容量过小");                            int temps = gos_max;                            //将gos容量扩大1.5倍                            gos_max = (int)(gos_max * 1.5f);                            GameObject[] tps = new GameObject[gos_max];                            for (int k = 0; k < temps; k++)                            {                                tps[k] = gos[k];                            }                            for (int k = temps; k < gos_max; k++)                            {                                tps[k] = (GameObject)Instantiate(go, new Vector3(Random.value * _h, Random.value * _w, 10.0f), Quaternion.identity);                                tps[k].GetComponent<Capture_Use_Sub_ts>().toward = tps[k].transform.position;                            }                            gos = new GameObject[gos_max];                            gos = tps;                            gos[gos_cur].GetComponent<Capture_Use_Sub_ts>().toward = new Vector3(j, i, 0.0f);                            gos[gos_cur].SetActive(true);                            gos_cur++;                        }                    }                }            }            //隐藏gos中未曾用到的物体            for (int k = gos_cur; k < gos_max; k++)            {                gos[k].SetActive(false);            }        }    }    //绘制界面    void OnGUI()    {        //绘制纹理作为TextField的背景        GUI.DrawTexture(new Rect(0.0f, 0.0f, txt_w, txt_h), txt_bg);        GUIStyle gs = new GUIStyle();        gs.fontSize = 50;        show_txt = GUI.TextField(new Rect(0.0f, 0.0f, txt_w, txt_h), show_txt, 15, gs);        if (GUI.Button(new Rect(0, 100, 80, 45), "确定"))        {            //取消在TextField中的焦点            GUI.FocusControl(null);            //重置gos_cur的值            gos_cur = 0;            step = 1;        }        //程序退出        if (GUI.Button(new Rect(0, 155, 80, 45), "退出"))        {            Application.Quit();        }    }    //加载图片    IEnumerator WaitLoad(string fileName)    {        WWW wwwTexture = new WWW("file://" + fileName);        Debug.Log(wwwTexture.url);        yield return wwwTexture;        td = wwwTexture.texture;        step = 3;    }    //进入步骤2    void My_WaitForSeconds()    {        step = 2;    }}

 

LoadLevelAdditiveAsync —— 异步加载关卡

public static AsyncOperation LoadLevelAdditiveAsync(int index);

index是被加载关卡的索引值,可在菜单 file —— build settings 中查看

public static AsyncOperation LoadLevelAdditiveAsync(string levelName);

在后台异步加载关卡到当前场景中,此方法只是将新关卡加载到当前场景,当前场景的原有内容不会被销毁。

Unity API 解析(1)