设计模式
单例模式(泛型单例)
作用:提高代码复用率,增加代码可读性
//实现泛型单例,并对T进行约束,规定只有各类manager使用单例模式
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
private static T instance;
//通过属性来访问直接获取私有的静态类
public static T Instance
{
get { return instance; }
}
//manager类的一些共有特点写在virtual函数中
//用virtual可以使继承泛型类的类可以重写函数,达成各个类的特色功能
protected virtual void Awake()
{
//保证只存在一个静态对象,避免冲突
if(instance != null)
{
Destroy(gameObject);
}
else
{
instance = (T)this;
}
}
//判断是否已经实例化出静态对象
public static bool IsInitialized
{
get { return instance !=null; }
}
protected virtual void OnDestroy()
{
if(instance !=null)
{
instance = null;
}
}
}
一些复用
数据复用
public ChaeacterData_S0 templateData;
public ChaeacterData_S0 characterData;
private void Awake()
{
if(templateData != null)
{
characterData=Instantiate(templateData);
}
}
通过使用模板给场景中相同的怪物设定相同的属性,避免对每个怪物都重新创建数据
动画复用
Animator Override Controller
对于某些动画逻辑相似的物体,可直接创建这个,并将之前的Animator复值给此组件,再相应的替换动画
C#语法相关
拓展方法:拓展某个类给某个类T添加函数
注意:该拓展必须放在非泛型的静态类中
语法:
public static 类型 函数名(this 要扩展的类 任意名称,函数变量1,...)
{
函数功能实现
}
例子
public static class ExtensionMethod
{
public const float Threshold = 0.5f;
public static bool isFacingTarget(this Transform transform, Transform target)
{
var vectorToTarget = target.position - transform.position;
vectorToTarget.Normalize();
if (Vector3.Dot(transform.forward, vectorToTarget) > Threshold)
return true;
return false;
}
}
项目中的应用:通过判断玩家是否在怪物前方来判断怪物是否对玩家造成伤害
标签:return,instance,unity,麦扣,static,单例,null,public,3DRPG From: https://www.cnblogs.com/laniser/p/17438728.html