Unity学习笔记重新整理


数据列表存储

数据有固定格式且无读取顺序时使用List<string> list = new List<string>();

数据无固定格式且无读取顺序时使用ArrayList arrayList = new ArrayList();

ArrayList中方法同List基本相同,引用类型使用前需先转换格式

数据无固定格式且有读取顺序时使用Stack和Queue

Stack取出上一个存的,Queue取出最先存的

Stack的添加方法为stack.Push(""); Queue的添加方法为queue.EnQueue("");

Stack取值并删除的方法为var = stack.Pop(); Queue取值并删除的方法为var = queue.Dequeue();

Stack和Queue取值不删除的方法均为var = *****.Peek();

(需注意虽然只能按规定取值,但是可以通过foreach对Stack和Queue进行遍历)


委托方式

基础委托关键字 delegate , 使用时需要先声明后实例化,如:

delegate void MainDelegate(string name)

MainDelegate mainDelegate = DelegateValue;

void DelegateValue(string name){ }

其中委托可以通过+=和-=添加其他委托或方法,再调用时同时执行多个方法

再声明委托时delegate关键字前面加上event关键字,可以将委托转化为事件

事件与委托的唯一区别就是事件只有通过+=和-=添加或删除方法或委托,无法使用=覆盖

(事件无法在方法中声明为局部变量,必须在类中声明为全局变量)

声明事件的方式为:event MainDelegate mainEvent;

进阶委托关键字为Action,Func和Predicate

Action为无返回值委托,后面加泛型为设置Action的参数。

Action action = () => { } 为无返回值无参数方法

Action<string> = str => { } 为无返回值有一个参数为string类型的方法,其中str作为传入参数使用

Action<string,string> = (str1,str2) => { } 为有两个string参数的方法,两个参数分别为str1和str2

Func为有返回值委托,后面加泛型时,最后一个参数为返回值类型,前面为参数类型

Func<string> func = ()=> { return ""; }; 为有一个string返回值无参数的方法

Func<string,string> func = str => { return str; }; 为有一个string返回值一个string类型参数的方法

Func<string,string,string> func = (str1,str2) => { return str1; };为一个string返回值两个string类型参数的方法

Predicate为固定返回bool类型的委托,除能返回bool类型返回值外与Action均相同(用处不大)

声明Delegate类型的变量,可以用这个变量储存任意类型的委托,无论参数数量和返回值数量有多少,均可以用Delegate类型的变量存储,调用时需先把委托强制转换成对应类型的委托再进行调用


IO文件操作

操作文件类的所有类均引用using System.IO;的命名空间

对文件夹的操作:

Directory类中均为静态函数,使用时每次都需要在参数中传入文件路径,然后对参数中的文件路径下的文件进行操作

DirectoryInfo类中均为非静态函数,在使用前需要先对操作文件创建变量,然后对变量进行操作

对文件的操作:

File类中均为静态方法,使用时每次都需要在参数中传入文件路径,然后对参数中的文件路径下的文件进行操作

FileInfo类中均为非静态函数,在使用前需要先对操作文件创建变量,然后对变量进行操作

对文件路径进行筛选或查找:

使用静态类Path,对参数中的路径进行筛选或查找操作


数据流操作

FileStream类 非静态类 在二进制文件中读写二进制数据

StreamReader类 非静态类 专门负责读取文本类文件中文本内容的类

StreamWriter类 非静态类 专门负责写入文本类文件中文本内容的类

using关键字,使用方法为using(创建操作流变量){ 对操作流变量进行操作 }

在小括号中写入创建变量的内容,例如FileStream file = new FileStream("",FileMode.Open);

在打括号中写入操作变量的内容,例如file.Flush();


文件传输格式

Json格式(新版本):

导入方法:

在Unity的Windows菜单下的Package Manager(包管理器)选项中,搜索Json并安装NewtonsoftJson运行库,然后在代码中写入using Newtonsoft.Json;获取命名空间

序列化方法(对象转字符串):

string str = JsonConvert.SerializeObject(Object)

传入一个对象类型参数,将对象类型参数转换成字符串并做作为返回值返回。

string str = JsonConvert.SerializeObject(Object,Formatting.Indented)

上述方法的重载方法,第二个参数为转化好的字符串按照更方便阅读的形式添加换行符

反序列化方法(字符串转对象)

Object object = JsonConvert.DeserializeObject<Object >(string);

传入一个字符串参数,泛型类型为接受的返回值类型,将参数中的字符串按照泛型格式转换成对象然后通过返回值返回由字符串转换成的泛型中指定类型的对象

CSV格式

csv格式转换本事不需要调用任何API中的方法,csv文件的格式为通过逗号作为分隔符,分割每一行中有几个值,而换行符则获取csv文件中有多少行,写入完成后将文件使用Excel打开即可成为Excel格式的内容

写入案例:

StreamWriter writer = File.CreateText(Application.dataPath + "/test.csv");
writer.WriteLine("1,2,3,4,5");
writer.WriteLine("6,7,8,9,0");
writer.Close();

读取案例:

string[] readLine = File.ReadAllLines(Application.dataPath + "/test.csv");
foreach (string line in readLine)
{
    string[] getLine = line.Split(',');
    foreach (string str in getLine)
    {
        Debug.Log(str);
    }
}

编辑器绘制:

Gizmos类:

Gizmos类概述:

Gizmos类的功能是在编辑器Scene视图中创建辅助线或辅助图标

必须在脚本的OnDrawGizmos或OnDruwGizmosSelected的生命周期函数中完成

OnDrawGizmos循环执行(未运行状态下仍可执行)

OnDrawGizmosSelected在选中脚本挂载的物体的身上的时候运行(未运行状态下仍可执行)

Gizmos类方法:

Gizmos.color = Color.green;设置绘制的颜色,颜色需要设置在绘制之前

Gizmos.DrawLine(Vector3.zero,new Vector3(0,100,0)); 绘制一条线段,参数一为线段起点,参数二为线段终点

Gizmos.DrawSphere(Vector3.one,1);绘制一个球体,参数一为球体的位置,参数二为球体的半径

Gizmos.DrawRay(ray); 根据参数绘制一条射线(非常短且不明显,绘制射线推荐以下方式)

Gizmos.DrawRay(ray.origin, ray.direction * 100.0f);绘制一条射线并将射线长度设置为100

Debug类

Debug类概述:

Debug类可以放在任意生命周期函数中,同样具备绘制线段及绘制射线功能,但只能在运行状态下使用,且只能绘制线段不能绘制图形。

Debug类方法:

Debug.DrawLine(Vector3.zero,new Vector3(0,10,0),Color.red,1,true);

参数一为线段起点,参数二为线段终点,参数三为线段颜色,参数四为线段展示时间,参数五为是否被其他带有碰撞器的物体遮挡 

Debug.DrawRay(ray.origin, ray.direction * 100.0f,Color.red,1,true);

对比DrawLine,参数二的功能改为发射方向而非终点位置,其余参数含义均相同。


Mathf类

Mathf.Max方法,参数可以为 float[] 也可以为 params float[] 作用是获取参数数组中的最大值

Mathf.Min方法, 参数可以为 float[] 也可以为 params float[] 作用是获取参数数组中的最大值

float f = Mathf.Clamp(float,float,float); 将数字限制范围并返回,参数一为需要计算的数字,参数二为数字限制的最小值,参数三为数字限制的最大值,小于最小值则返回最小值,大于最大值则返回最大值,不然则返回自身。


场景加载

AsyncOperation asyncOperation= SceneManager.LoadSceneAsync(string,LoadSceneMode);

LoadSceneAsync方法为异步加载一个场景,参数一为加载场景的名字,参数二为加载场景的模式,默认模式为加载后自动卸载当前场景,传入LoadSceneMode.Additive时,将模式设置为加载新的场景时不自动卸载旧场景,可以有效改善加载时的卡顿。

异步加载的方法需要写在协程中,然后在While中检测asyncOperation变量的isDone属性是否返回true,在isDone没有完成的时候可以用progress返回当前进度,当场景加载完成时需要卸载旧场景完成加载

asyncOperation.isDone bool值 返回场景加载是否完成

asyncOperation.progress float值 返回当前场景加载进度 从0到1的值

SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene().name);卸载旧场景的方法,注意同样可以使用AsyncOperation返回值进行异步加载并返回进度


DoTween的使用

DoTween.To方法:

DOTween.To(() => Vector3.zero , vct=> { Debug.Log(vct); } , Vector3.one,1.0f);

方法的功能时传入两个值,让第一个值逐渐缓动到第二个值,其中第一个参数为起始值,需要注意第一个参数必须用 ()=>value 的方式,第二个参数是一个委托,在缓动的过程中会逐渐返回当前缓动得到的值并传入委托中的参数,第三个参数是想要缓动的最终值,第四个参数是多长时间内由最初值缓动到最终值

DoJump方法

transform.DOJump(Vector3.zero, 10, 2, 5);

方法的功能是向上曲线运动到目标坐标(同贝塞尔曲线),第一个值是运动的终点坐标,第二个值为运动时曲线偏离的高度(固定向上),第三个值为条约的次数(同等距离下多个曲线),第四个值为运动需要的时间

DOPunchPosition方法

transform.DOPunchPosition(transform.up * 3.0f,2,10);

方法的功能是沿着一个方向震动,多用于相机上下震屏,第一个参数是设定运动轴和力度,第二个参数是震动的时间,第三个参数是震动的次数


Type类

如何获取Type类变量

Type类中保存的是数据类型的类型,可以保存任何类型的数据所包含的类型

例如Transform,作为一个组件类型,在不获取对应类型的物体的情况下,只保存Transform类型,或将Transform类型与其他类型区分开时,就需要用到Type类型的变量来保存Transform这一类型,将类型转换为可储存的Type变量的关键字是 typeof()

        Type transformType = typeof(Transform);
        Type boxColliderType = typeof(BoxCollider);

如果是已经声明类型并赋值的变量,需要获取类型,则可以使用.GetType()来获取Type类型

        Transform t = new GameObject().transform;
        Type type = t.GetType();

想通过String字符串转换为Type类型时,则需要用到Type.GetType(string)方法

        Type type = Type.GetType("Transform");

如何应用Type类变量

Transform.GetComponent(Type)方法

使用Unity中Transform.GetComponent方法,不使用泛型方式传入类型,使用Type类型的参数传入到GetComponent方法中,然后通过强制转换,获取需要的类型

        Type type = Type.GetType("BoxCollider");
        Component component = transform.GetComponent(type);
        BoxCollider boxCollider = (BoxCollider)component;

Activator.CreateInstance(Type)方法

使用C#的反射功能,也就是Activator.CreateInstance方法来创建Type类型的变量,具体功能为:

public static object CreateInstance(Type type);

方法功能相当于调用参数类型的无参构造函数,并将结果转换为Objcet类型返回

public static object CreateInstance(Type type, params object[] args);

想调用有参构造函数时,需要将构造函数的参数依次以object类型方式传入到方法的参数中

    public class MainClass
    {
        public string name;
        public int id;
        public MainClass() { }
        public MainClass(string name)
        {
            this.name = name;
        }
        public MainClass(string name, int id)
        {
            this.name = name;
            this.id = id;
        }
    }
    void Start()
    {
        Type type = typeof(MainClass);
        object obj1 =  Activator.CreateInstance(type);
        object obj2 =  Activator.CreateInstance(type,"名字");
        object obj3 =  Activator.CreateInstance(type,"名字",1);
        MainClass mainClass1 = (MainClass)obj1;
        MainClass mainClass2 = (MainClass)obj2;
        MainClass mainClass3 = (MainClass)obj3;
    }

常见的用法 

对泛型方法中的泛型类进行初始化

使用泛型方法的时候,想要获得一个泛型类的变量时,是没有办法直接调用泛型类的构造函数的,但是可以通过C#的反射功能Activator.CreateInstance(Type)方法获取泛型类的变量

    T GetNewInstantiate<T>()
    {
        return (T)Activator.CreateInstance(typeof(T));
    }
    T GetMainInstantiate<T>(string name)
    {
        return (T)Activator.CreateInstance(typeof(T),name);
    }

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值