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);

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

时间: 2024-10-19 14:07:51

Unity API 解析(1)的相关文章

Unity API 解析 学习

1 Application类 2 Camera类 3 GameObject类 4 HideFlags类 5 Mathf类 6 Matrix4x4类 7 Object类 8 Quaternion类 9 Random类 10 Rigidbody类 11 Time类 12 Transform类 13 Vector2类 14 Vector3类 1 Application类 1 using UnityEngine; 2 using System.Collections; 3 4 public class

Unity API 解析(9)&mdash;&mdash; Rigidbody 类

模拟 GameObject 对象在现实世界中的物理特性(重力,阻力,质量,速度) 对Rigidbody 对象属性的赋值代码通常放在脚本的OnFixedUpdate 方法中   collisonDetectionMode 属性 -- 碰撞检测模式 刚体的碰撞检测模式有3种 Discrete -- 静态离散检测模式 Continuous -- 静态连续监测模式 ,一般用在高速运动刚体的目标碰撞体上 ContinousDynamic -- 最强的连续动态检测模式 drag 属性 -- 刚体阻力 dra

Unity API 解析(3)&mdash;&mdash; GameObject 类

GameObject 类是Unity场景中所有实体的积累.一个GameObject对象通常由多个组件component组成,且至少含有一个transform组件.   activeSelf 属性 -- GameObject的Active标识 activeInHierarchy 属性的功能是返回GameObject实例在程序运行时的激活状态,它只有当GameObect实例的状态被激活时才会返回true.而且它会受父类对象激活状态的影响.如果其父类至最顶层的对象中有一个对象未被激活,activeIn

Unity API 解析(7)&mdash;&mdash; Object 类

Object 类是Unity中所有对象的基类   GetInstanceID -- Object 对象ID 每个对象在工程中都有唯一的ID,并且从程序开始运行到结束,除非对象被销毁,否则每个实例对应的ID都不会改变 从GameObject.CreatePrimitive() 或 Object.Instantiate() 中创建或克隆的每个名字相同的GameObject对象都有唯一的ID using UnityEngine; using System.Collections; public cla

Unity API解析

别想着一步到位,这个是渐进的,以点带面,写点小纸条,放到显眼处,方便随时记忆 第一部分: 游戏三要素: 1.游戏循环 处理输入,更新世界,响应输出 Application 2.游戏时间Time 3.游戏对象 静态对象,动态对象,物体运动(矢量放下,角度,) ObjectGameObjectMaxtrix4 CameraRagidbody Mathf Vector2Vector3 Qualxxx 角度 Transform

Unity API 解析(10)&mdash;&mdash; Time 类

realtimeSinceStartup 属性 -- 程序运行实时时间   smoothDeltaTime 属性 -- 平滑时间间隔 主要用在 FixedUpdate 方法中需要平滑过渡的计算   time 属性 -- 程序运行时间 从游戏启动到现在

Unity API 解析(5)&mdash;&mdash; Mathf 类

此类属于结构体类型,只有静态属性和静态方法,不可实例化 Deg2Rad 属性 -- 从角度到弧度常量 (2*PI)/360 Rad2Deg 属性 -- 从弧度到角度常量 Infinity 属性 -- 正无穷大   Clamp 方法 -- 返回有限范围值 返回有范围限制的value值 ClosestPowerOfTwo -- 返回2的某次幂 用于返回最接近参数值value的2的某次幂的值 DeltaAngle -- 最小增量角度 (-180,180] InverseLerp -- 计算比例值 (v

Unity API 解析(4)&mdash;&mdash; HideFlags 类

HideFlags 为枚举类,用于控制object对象的销毁方法以其在监视面板中的可视性   DontSave 保留对象到新场景 如果GameObject 对象被HideFlags.DontSave标识,则在新Scene中GameObject的所有组件将被保留下来,但其子类GameObject对象不会被保留到新scene中 不可对GameObject对象的某个组件如Transform进行HideFlags.DontSave标识,否则无效 即使程序已经退出,被HIdeFlags.DontSave

Unity API 解析(6)&mdash;&mdash; Matrix4x4 类

通常用在如摄像机的非标准投影变换等   MultiplyPoint 方法 -- 投影矩阵变换 对点v进行投影矩阵变换 主要用于Camera的投影变换,对于一般物体的矩阵变换用MultiplyPoint3x4方法,不涉及投影变换,计算速度更快 MultiplyPoint3x4 -- 矩阵变换 MultiplyVector 方法 -- 矩阵变换 对方向向量v进行矩阵变换 using UnityEngine; using System.Collections; public class Multipl