个人总结笔记,参考自B站各教程,希望对他人也有所帮助,对我自己也方便复习。
文件夹管理
单例模式基类
作用:减少单例模式重复代码的书写 作为管理者不继承Monobehaviour
单例模式介绍
一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 使用单例模式可以减少资源消耗 饿汉式:唯一实例在类加载时立即进行实例化 懒汉式:在类加载时不进行实例化,在第一次使用时进行实例化 双重检查锁解决线程问题 BV1af4y1y7sS
Unity中的单例模式
一个静态成员变量类型是自身 公共的静态成员方法/属性 Unity小游戏中一般不考虑双锁线程问题所以只需要简单写懒汉式即可 基础代码
public class GameManager
{
private static GameManager instance;
public static GameManager Getinstance()
{
if(instance == null)
instance = new GameManager();
return instance;
}
}
升级版2.0加入泛型
public class BaseManager<T> where T:new()
{
private static T instance;
public static T Getinstance()
{
if(instance == null)
instance = new T();
return instance;
}
}
它的子类管理类只需要继承自他然后把自身的类型传进去即可
public class GameManager :BaseManager<GameManager>
C#中泛型的知识
BV1A4411F7fj 泛型的作用
- 跨类型的可复用的代码:继承和泛型
- 继承->基类
- 泛型->带有类型占位符的模板
Generic types泛型类型 开放类型和封闭类型 泛型方法
泛型方法中需要引用泛型参数 补充:ref和out基本一样,即代替了c中指针的部分作用,区别是即在使用ref,和不使用修饰符的时候,必须要传递一个有值的参数。ref和out几乎就只有一个区别,那就是out可以使用未赋值的变量。 原因是out应该是在方法内部做了分配地址的操作,然后把地址赋给外部的变量。但是ref的话是直接传递外部地址进方法。 声明泛型类型
- 可以有多个泛型参数
Typeof可以实现将未绑定的泛型类型存在 default方法可以获得泛型类型的默认值 泛型的约束
继承MonoBehaviour的单例基类模式
Unity中不适用new的方法创建实例(继承了mono的脚本) 只能通过拖动到对象上或者通过加脚本api Addcomponent去加脚本 U3D内部帮我们实现他 引用:最后总结一下Awake和Start的异同点: 相同点: 1)两者都是对象初始化时调用的,都在Update之前,场景中的对象都生成后才会调用Awake,Awake调用完才会调用Start,所有Start调用完才会开始Update。 2)两者在对象生命周期内都只会被调用一次,即初始化时被调用,之后即使是在被重新激活之后也不会再次被调用。 不同点: 1)Awake函数在对象初始化之后立刻就会调用,换句话说,对象初始化之后第一调用的函数就是Awake;而Start是在对象初始化后,第一次Update之前调用的, 在 Start中进行初始化不是很安全,因为它可能被其他自定义的函数抢先。 2)Awake不管脚本是否enabled都会被调用;而Start如果对象被SetAcive(false)或者enabled= false了是不会被 调用的。 3)如果对象(GameObject)本身没激活,那么Awake,Start都不会调用。
单例模式mono基础代码
public class NewBehaviourScript : MonoBehaviour
{
private static NewBehaviourScript instance;
public static NewBehaviourScript GetInstance()
{
return instance;
}
void Awake()
{
instance = this;
}
}
采用instance方法而不用addcomponent方法是因为挂载后再instance=this的方法可以解决重复问题用新的顶掉旧的,而addcomponent多挂一遍就会多加一个不太行。 单例模式mono基类代码
public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T GetInstance()
{
return instance;
}
protected virtual void Awake()
{
instance = this as T;
}
}
采用virtual虚函数子类保证子类可以对Awake进行重写 子类再用protected override进行重写Awake 继承了Monobehaviour的单例模式对象需要我们自己保证其唯一性 升级版AutoSingletonMono继承这种单例模式的不需要直接去拖直接Getinstance就好了
public class SingletonAutoMono<T> : MonoBehaviour where T: MonoBehaviour
{
private static T instance;
public static T GetInstance()
{
if(instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).ToString();
DontDestroyOnLoad(obj);//保证物体过场景不被销毁
instance = obj.AddComponent<T>();
}
return instance;
}
}
|