该课程来源于Unity Learn Premium,教程分步与摘要如下。
命名空间(using xxxxx);
命名规则(首字母大写小写等);
区域(#region #endregion)。
C#是强类型语言(Strongly-Typed Language)
而泛型则可以在使用前才定义参数类型和值,优势在于代码多次使用,替代方法重载。下面的方法重载我们在Unity里定义的各类方法里常常使用(不同的参数)。
用泛型代替则是
控制台输出
队列采用先进先出,栈采用先进后出
即协程
yield后有以下几种形式
要注意的是WaitForSeconds()和WaitForSecondsRealtime()的区别
上图内Time.timeScale = 0,关于timeScale的说明参考来源
timescale是时间流逝速度的缩放比例,0.5时会降到一半,一般用于慢动作或快动作。
所以上面的程序执行一次后就停止了,如果换成WaitForSecondsRealtime(2)则可以继续正常进行。
如果不是在Update等方法内每帧执行,想要两个程序同时执行的方式是两个程序都为coroutine。
停止协程有StopAllCoroutine()和StopCoroutine(xxx),前者停止该Monobehaviour下的所有携程,后者仅停止该携程,StopCoroutine()的使用方法有点复杂,可以参考unity api。
之前就在2D Roguelike里学习过。脚本里的打头 public class xxx: Monobehaviour 中的Monobehaviour就是基类,xxx就是mono的派生类。roguelike里也出现过不继承mono基类继承其他基类的情况。基类中的public对基类和其他所有类可见,private仅对自己可见,protected对子类可见对其他类不可见(即保护于其他类)。详细了解类继承可参考
通常使用类继承是为了减少冗余代码(比如某部分代码在a脚本和b脚本内共同使用,则把该代码写到x脚本,ab继承x),这就涉及到对父类内的方法(method)变量的改写重写(添加功能或者直接重写),这种功能叫多型性。
父类里的方法必须使用virtual或abstract关键词才能改写。
比如 public virtual void Player(){xxx}; 和public abstract void Enemy();。
如果父类的方法使用了关键词abstract则表示子类必须重写该方法({}内不能为空),父类里的abstract则不必写实现(仅有声明,不能加{}和里面的内容,就是抽象)。如果父类方法使用了virtual则必须在父类内写该方法的实现(哪怕仅有一对花括号,即类)。
在子类内重写父类方法,该方法必须同名,必须添加override 关键词,比如public override void Player(){xxx};详细了解多形性
继承只能一个类继承自一个类,比如A→B→C,C继承了AB,但想要继承一个不在链条上的类,就要使用接口。接口像一个合同,用固定形式声明X接口,并使A类内的方法可直接使用X内的内容(方法method,属性properties,事件events,索引器indexers)
在之前brakers的装备系统学习时已经学习使用过例如IPointEnter之类的接口使用方式。
委托是一种引用类型,是对某一类而不是某一种method的引用(类似c++的指针),可以把方法像参数一样传递。
委托声明方式必须在使用delegate关键词,委托可以引用与它有相同返回类型和参数类型的方法。
委托可以定义在类外也可以在类内,可根据委托的可见性在前面加 public private 和protected。
比如有一个委托为public delegate void A (int a); 的A,还有两个同样返回类型的参数的public void B(int b){};的B和public void C(int c){};的C,还有一个不同返回类型的public string D(int d){};和一个不同参数的public void E(string e){};
那么A在实例化public A aDelegate;后,就可以在某个需要的地方使用A调用B aDelegate = B; 然后aDelegate(6);就调用了B方法,同样 aDelegate = C; aDelegate(6)等于调用了C方法。
aDelegate /= D 或 E,因为他们不具有同样的返回类型和参数类型。
如果想通过A同时调用B和C,则 aDelegate += B; aDelegate += C; aDelegate(9);就同时调用了B(9)和C(9)。这叫做委托的多播。
也可以在其他脚本对之前委托的实例进行监听(即把新的方法加进委托)。比如另一个脚本里有同样返回类型参数类型的方法F,不需要在该脚本重新实例化委托A,而是在需要加入监听的地方 GetComponent
想取消调用就用-=符号就可以。
参考资料
另一种不实例化用委托的方式则是教程的演示的。
事件Event比如鼠标点击等。事件必须有委托类型(即事件依托于委托),事件只可在内部触发,外部只能订阅(委托在内外都可触发)。
委托这种机制每次使用之前都要先创建一个新的引用类型,然后再创建实例,会显得比较臃肿、麻烦,所以C#提供了一种简化方式,使用Action来创建委托实例。
使用[]括起特性的名称和值,放在它所应用的元素前。比如public int point;上的[HideInInspector]就是一种特性。
完毕。