unity中泛型的全部使用方法

泛型对于我们写程序可以有奇效 在合理的运用下 会使代码更简洁明了
例如List 就是一个很好的例子
所以我今天更新一篇关于泛型的博文

方法的使用

首先介绍一下函数方法的使用

 public T GetAndAddComponent<T>(GameObject obj) where T:Component 
    {
        if (!obj.GetComponent<T>())//检查该游戏物体是否还有T组件
        {
            obj.AddComponent<T>();//没有添加
        }
        return obj.GetComponent<T>();//本身就有或者是添加之后的返回
    }
    public List<Component> GetAndAddComponens<T, K>(GameObject obj) where T : Component where K : Component
    {
        if (obj.GetComponent<T>() == null)//检查该游戏物体是否还有T组件
        {
            com.Add(obj.AddComponent<T>());//添加并且添加到list
        }
        if (obj.GetComponent<K>() == null)//检查该游戏物体是否还有T组件
        {
            com.Add(obj.AddComponent<K>());// 添加并且添加List中
        }
        return com;//返回list
    }

这两个方法是自动 检测传入的游戏物体是否带有我们想要的组件
如果有 直接返回组件 如果没有 添加之后再返回

public interface IRole
{
    int level { get; set; }
}
public class MyPlayer : IRole
{
    public int level { get; set; }
}
public class MyNPC : IRole
{
    public int level { get; set; }
}
public class MyMonster : IRole
{
    public int level { get; set; }
}
public bool CompareLevel<T, K>(T t1, K t2) where T : IRole where K : IRole
    {
        //因为泛型t1,t2都被约束需要实现接口,所以我们可以强制转换到IRole来获取level比较
        return ((IRole)t1).level >= ((IRole)t2).level;
    }
    //那么怎么使用呢?
    //接下来看:
    public void Test()
    {
        //先定义三个测试用的类型
        MyNPC npc = new MyNPC();
        MyPlayer player = new MyPlayer();
        MyMonster monster = new MyMonster();
        //对各个类型的level赋值
        npc.level = 1;
        player.level = 2;
        monster.level = 3;
        //比较npc和player的level就很简单了,只需要这样调用即可
        bool b1 = CompareLevel<MyNPC, MyPlayer>(npc, player); //npc?payer//false                    
        bool b2 = CompareLevel<MyNPC, MyMonster>(npc, monster);//npc?monster//false
        bool b3 = CompareLevel<MyPlayer, MyMonster>(player, monster);//payer?monster//false
    }

然后是我们可以比较几个不同或者相同的类的变量

泛型类的使用

首先给大家看一种 特别方便的使用方法

public class fanxing : MonoBehaviour
{
    // Use this for initialization  
    void Start()
    {
        Water<string> test1 = new Water<string>();
        test1.info = "KuangQuanShui";//在此传入水的名字是"矿泉水"(可以将"T"看作是string类型)  
        

        Water<int> test2 = new Water<int>();
        test2.info = 100;//在此传入水的温度是 100(可以将"T"看作是int类型)  
        Debug.Log("水的名字: " + test1.info + "   水的温度: " + test2.info);
    }
}
public class Water<T>
{
    public T info;//水的信息(属性)  
}

如果对List十分熟悉 看这个也不会陌生

public class fanxing2 : MonoBehaviour
{
    // Use this for initialization  
    void Start()
    {
        //从A产线出来的生产日期是string类型的"20130610",水是矿泉水,温度是20,  
        Water<string, WaterBase> test1 = new Water<string, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于string类型  
        test1.data = "20130610";
        test1.info.name = "KuangQuanShui";
        test1.info.temperature = 20;
        //从B产线出来的生产日期是int类型的20130610,水是纯净水,温度是20,  
        Water<int, WaterBase> test2 = new Water<int, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于int类型  
        test2.data = 20130610;
        test2.info.name = "ChunJingShui";
        test2.info.temperature = 20;
    }
}
public class Water<T, U> where U : WaterBase //限定"U"只能接收WaterBase类型  
{
    public T data;//出厂日期(可接受int型的20130610,或者string类型的"20130610");  
    public U info;//水的具体信息(矿泉水/纯净水...温度)  
}
public class WaterBase
{
    public string name;
    public int temperature;
}

接下来就是泛型类的继承

public class fanxing : MonoBehaviour
{
    // Use this for initialization  
    void Start()
    {
        TestChild1 test = new TestChild1();
        test.data = "KuangQuanShui";

        Testchild2 test2 = new Testchild2();
        test2.data = 100;

        Son1 son1 = new Son1();
        son1.data1 = "KuangQuanShui";
        son1.data2 = 10;
    }
}
#region 一个占位符  
public class Test<T>
{
    public T data;
}
public class TestChild1 : Test<string> { }
public class Testchild2 : Test<int> { }
#endregion
#region 两个占位符  
public class Fater<T, U>
{
    public T data1;
    public U data2;
}
public class Son1 : Fater<string, int> { }
#endregion

这里基本包括了所有泛型类型的使用方法
如果有什么问题 大家可以联系我
主页有联系方式(知无不答)

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/108236042