1、 类的本质是类型,而不是数据,所以类不存在于内存中,不能被直接操作,类被实例化为对象时,从而对对象进行操作。但静态成员可以独立于对象被引用(含有静态成员的非静态类脚本不必绑定GameObject)。静态类不能被实例化,但可以直接视之为类型而引用其成员。静态类的脚本不能继承MonoBehaviour,不需要绑定GameObject。静态类可用作全局脚本,存储金钱、经验、物品等。
抽象类:只能被继承,不能实例化
变量 方法 属性 索引器 事件
类的赋值实现了什么? class A=B
类的多态性 new基类隐藏 :衍生类的成员隐藏掉基类的同名成员
属性get set 用于间接读取private变量?字段
静态类的衍生类的base及this用法,静态成员中不能使用base与this
运算符重载 实现类的加减乘除等运算
假如KeyMouseInput、AndroidInput均继承自UserInput。可以用Get Component<UserInput>()来获取KeyMouseInput或者AndroidInput脚本?
2、静态
静态对象 非静态对象
拥有属性: 是类共同拥有的 是类各对象独立拥有的
内存分配: 内存空间上是固定的 空间在各个附属类里面分配
分配顺序: 先分配静态对象的空间 继而再对非静态对象分配空间,也就是初始化顺序是先静态再非静态.
1)静态对象的数据在全局是唯一的,一改皆改。 而修改非静态对象,不会影响其他同类对象的数据。
2)直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法。
3、在方法内部声明变量时,不允许加修饰public /private。方法可直接引用其所属class声明的成员,而不必将成员名写进方法的参数列表。(变量名重名时:this.x指该方法所在类的成员变量,x指代方法内部声明或由方法参数列表引入的变量)(方法内部通过GetComponent<>(),取得的组件及其变量均为引用,方法内可直接修改获得的组件及变量)
4、构造函数
a.构造函数的命名必须和类名完全相同
b.构造函数的功能主要用于在类的对象创建时,为类的成员赋初值。它没有返回值,也不能用void来修饰。
c.一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用。但只要是父类有带参的构造函数,在子类中就必须显式的调用父类的构造函数,因为子类的构造器在实例化时无法找到父类的构造函数(当父类有自己写的无参构造函数时,子类也不用显式调用)。
5、泛型类
6、全局脚本可用静态脚本或单例脚本来实现,脚本类不继承MonoBehaviour更好。静态脚本如何同行为脚本交互?
5、继承MonoBehaviour的单例脚本Sgtn(需绑定GameObject,亦是全局脚本)及调用脚本CallSg。
Awake()与Start()的区别,生命周期?
Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次;如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数不会执行;如果游戏对象的初始状态为开启状态,那么Awake函数会执行;值得注意的一点是,Awake函数的执行与否与脚本实例的状态(启用或禁用)并没有关系,而是与脚本实例所绑定的游戏对象的开关状态有关。如果重新加载场景,那么场景内Awake函数的执行情况重新遵循上述两点。
Start()将在MonoBehavior创建后在该帧Update()第一次执行前被调用;Start()函数只在脚本实例被启用时才会执行;Start函数总是在Awake函数之后执行。如果游戏对象开启了,对象上绑定的脚本实例被禁用了,那么Start函数不会执行。这是Start函数的特点,只有在脚本实例被启用时它才会执行,并且Start函数只会在脚本实例首次被开启时才会执行。如果是已经开启过的脚本实例被关闭后再次开启,那么Start函数不会再次执行。
using UnityEngine;
using System.Collections;
public class Sgtn: MonoBehaviour
{
public static Sgtn _instance; //如果此处去掉static后果如何?
//其他声明……
void Awake()
{
_instance=this;
}
public void SgFunc()
{
Debug.Log("SgFunc from Sgtn, at your service!");
}
//其他方法……
}
CallSg脚本
using UnityEngine;
using System.Collections;
public cla