unity学习日志5(麦扣老师3DRPG项目学习)

发布时间 2023-05-28 19:47:36作者: laniser

设计模式

单例模式(泛型单例)

作用:提高代码复用率,增加代码可读性

//实现泛型单例,并对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;
    }
}

项目中的应用:通过判断玩家是否在怪物前方来判断怪物是否对玩家造成伤害