前言
Unity官方教程《C#中级编程》提供了Unity心目中中级开发常用的知识点。我的总结仅包括自己平时不常用的知识,做出查漏补缺。完整版移步:
C#中级编程|Unity中文课堂
C#中级编程知识点
泛型(Generics)
泛型(Generic)1 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。
泛型方法、泛型类
using UnityEngine;
using System.Collections;
public class SomeClass
{
//这是一个泛型方法。注意泛型
//类型“T”。该“T”将在运行时替换为
//实际类型。
public T GenericMethod<T>(T param)
{
return param;
}
}
//这是一个泛型类。注意泛型类型“T”。
//“T”将被替换为实际类型,同样,
//该类中使用的“T”类型实例也将被替换。
public class GenericClass <T>
{
T item;
public void UpdateItem(T newItem)
{
item = newItem;
}
}
使用时指定类型:
SomeClass.GenericMethod<int>(5);
GenericClass<int> myClass = new GenericClass<int>();
myClass.UpdateItem(5);
泛型的特性
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
- 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
- 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
- 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 您可以对泛型类进行约束以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取.
接口
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同"是什么" 部分,派生类定义了语法合同 “怎么做” 部分。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
//这是只有一个必需方法的基本
//接口。
public interface IKillable
{
void Kill();
}
//这是一个通用接口,其中 T 是
//将由实现类提供的数据类型的
//占位符。
public interface IDamageable<T>
{
void Damage(T damageTaken);
}
public class Avatar : MonoBehaviour, IKillable, IDamageable<float>
{
//IKillable 接口的必需方法
public void Kill()
{
//执行一些有趣操作
}
//IDamageable 接口的必需方法
public void Damage(float damageTaken)
{
//执行一些有趣操作
}
}
拓展方法
拓展方法适合用来向不可编辑的类添加功能,就例如Unity的一些源码:
using UnityEngine;
using System.Collections;
//创建一个包含所有扩展方法的类
//是很常见的做法。此类必须是静态类。
public static class ExtensionMethods
{
//扩展方法即使像普通方法一样使用,
//也必须声明为静态。请注意,第一个
//参数具有“this”关键字,后跟一个 Transform
//变量。此变量表示扩展方法会成为
//哪个类的一部分。
public static void ResetTransformation(this Transform trans)
{
trans.position = Vector3.zero;
trans.localRotation = Quaternion.identity;
trans.localScale = new Vector3(1, 1, 1);
}
}
public class SomeClass : MonoBehaviour
{
void Start () {
//请注意,即使方法声明中
//有一个参数,也不会将任何参数传递给
//此扩展方法。调用此方法的
//Transform 对象会自动作为
//第一个参数传入。
transform.ResetTransformation();
}
}
协程
协程常用于Unity项目中对时间敏感的编程方式上,下列是常见的代码示例:
using UnityEngine;
using System.Collections;
public class CoroutinesExample : MonoBehaviour
{
public float smoothing = 1f;
public Transform target;
void Start ()
{
StartCoroutine(MyCoroutine(target));
}
IEnumerator MyCoroutine (Transform target)
{
while(Vector3.Distance(transform.position, target.position) > 0.05f)
{
transform.position = Vector3.Lerp(transform.position, target.position, smoothing * Time.deltaTime);
yield return null;
}
print("Reached the target.");
yield return new WaitForSeconds(3f);
print("MyCoroutine is now finished.");
}
}
Unity中文课堂将这里翻译为“通用”,感觉大多数人都称之为泛型 ↩︎