unity3d研究之C# 泛型

Unity中泛型<T>和泛型约束where 的使用 /1.new()泛型约束public T t;//2.自定义类Debug.Log("自定义类型约束");//自定义T只能使用DefinedClass//自定义T使用其他类型会报错*如果以上有什么问题欢迎大家留言指正* 阅读详情

泛型是什么?

这是摘自百度百科中对泛型的介绍:

?
泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。它允许程序员将一个实际的数据类型的规约延迟至泛型的实例被创建时才确定。泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。

看过之后,会用的还是懂;不会用的,也还是不懂。

一:泛型方法

所以我们还是看看泛型具体在程序中的应用:

复制代码
//泛型方法
//unity3D中用的最多的泛型方法应该是GetCompent<T>
//T就是占位符,当调用这个方法的你要告诉编译器,这个T的具体类型。
//另外,"T"只是一个标识,完全可以用其他代替,如"K","MyType"等,只是使用习惯。
//比如:
GameObject player;
Animator animator;
void Start()
    {
//在场景中找到名为MyPlayer物体
player = GameObject.Find("MyPlayer");
//获取该物体上的Animator组件
animator = player.GetComponent<Animator>();
//对于使用AddComponent<T>()、GetCompent<T>()这两个泛型方法来说,需要了解的就是:T就是你想要的具体的组件类型。
//对于泛型方法来说,泛型的作用就是占位和约束的作用。
    }       
//下面来说声明泛型函数
    /// <summary>
    /// 比较等级;
    /// </summary>
    /// <returns>
    /// 若t1>=t2的等级,则返回true;否则返回false
    /// </returns>
    /// where T : IRole where K : IRole的作用是约束传入的两个参数类型必须要实现IRole这个接口;
    /// 这样就定义好了一个泛型方法
    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 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;}
    }
复制代码

二:泛型类

最典型的例子就是List:

List<T>类是  ArrayList 类的泛型等效类。 该类使用大小可按需动态增加的数组实现  IList<T> 泛型接口。

List<T> mList = new List<T>();   

示例代码如下:

  1. public class fanxing : MonoBehaviour  
  2. {  
  3.     // Use this for initialization  
  4.     void Start()  
  5.     {  
  6.         //从A产线出来的生产日期是string类型的"20130610",水是矿泉水,温度是20,  
  7.         Water<string, WaterBase> test1 = new Water<string, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于string类型  
  8.         test1.data = "20130610";  
  9.         test1.info.name = "KuangQuanShui";  
  10.         test1.info.temperature = 20;  
  11.         //从B产线出来的生产日期是int类型的20130610,水是纯净水,温度是20,  
  12.         Water<int, WaterBase> test2 = new Water<int, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于int类型  
  13.         test2.data = 20130610;  
  14.         test2.info.name = "ChunJingShui";  
  15.         test2.info.temperature = 20;  
  16.     }  
  17. }  
  18. public class Water<T, U> where U : WaterBase //限定"U"只能接收WaterBase类型  
  19. {  
  20.     public T data;//出厂日期(可接受int型的20130610,或者string类型的"20130610");  
  21.     public U info;//水的具体信息(矿泉水/纯净水...温度)  
  22. }  
  23. public class WaterBase  
  24. {  
  25.     public string name;  
  26.     public int temperature;  
  27. }  
复制代码

接下来是泛型的继承:

  1. public class fanxing : MonoBehaviour  
  2. {  
  3.     // Use this for initialization  
  4.     void Start()  
  5.     {  
  6.         TestChild1 test = new TestChild1();  
  7.         test.data = "KuangQuanShui";  
  8.         Testchild2 test2 = new Testchild2();  
  9.         test2.data = 100;  
  10.   
  11.         Son1 son1 = new Son1();  
  12.         son1.data1 = "KuangQuanShui";  
  13.         son1.data2 = 100;  
  14.     }  
  15. }  
  16. #region 一个占位符  
  17. public class Test<T>  
  18. {  
  19.     public T data;  
  20. }  
  21. public class TestChild1 : Test<string> { }  
  22. //或者: public class TestChild1<T>: Test<string> { }  
  23. //或者: public class TestChild1<T>: Test<T> { }  
  24. public class Testchild2 : Test<int> { }  
  25. #endregion  
  26. #region 两个占位符  
  27. public class Fater<T, U>  
  28. {  
  29.     public T data1;  
  30.     public U data2;  
  31. }  
  32. public class Son1 : Fater<string, int> { }  
  33. //或者: public class Son1<T,U> : Fater<string, int> { }  
  34. //或者: public class Son1<T,U> : Fater<T, U> { }  
复制代码

三:泛型接口



  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 泛型
  6. {
  7.     class 泛型接口
  8.     {
  9.         public static void Main()
  10.         {
  11.             PersonManager man = new PersonManager();
  12.             Person per = new Person();
  13.             man.PrintYourName(per);
  14.             Person p1 = new Person();
  15.             p1.Name = "p1";
  16.             Person p2 = new Person();
  17.             p2.Name = "p2";
  18.             man.SwapPerson<Person>(ref p1, ref p2);
  19.             Console.WriteLine( "P1 is {0} , P2 is {1}" , p1.Name ,p2.Name);
  20.             Console.ReadLine();
  21.         }
  22.     }
  23.     //泛型接口
  24.     interface IPerson<T>
  25.     {
  26.         void PrintYourName( T t);
  27.     }
  28.     class Person
  29.     {
  30.         public string Name = "aladdin";
  31.     }
  32.     class PersonManager : IPerson<Person>
  33.     {
  34.         #region IPerson<Person> 成员
  35.         public void PrintYourName( Person t )
  36.         {
  37.             Console.WriteLine( "My Name Is {0}!" , t.Name );
  38.         }
  39.         #endregion
  40.         //交换两个人,哈哈。。这世道。。
  41.         //泛型方法T类型作用于参数和方法体内
  42.         public void SwapPerson<T>( ref  T p1 , ref T p2)
  43.         {
  44.             T temp = default(T) ;
  45.             temp = p1;
  46.             p1 = p2;
  47.             p2 = temp;
  48.         }
  49.     }
  50. }

Unity中的泛型单例的使用     通常情况下,在没有泛型单例这个概念之前,我们如果需要使一个形成一个单例,通常情况下就会有以下代码:    public  class SceneStateManager{          private  static  SceneStateManager   _Instance;     //私有化构造器          public  static  SceneStateManag... 阅读详情

相关推荐

基于C#的Unity3D格斗类游戏开发

随着网络的普及,网络游戏作为目前一大热门行业,越来越受到人们的追捧,然而现在市面上的RPG格斗类游戏面临越来越严重的产品同质化问题,游戏内容、流程基本相似,所以本游戏就是要开发出一种休闲的新玩法,使玩家既在满足自身对武侠世界的向往又满足玩家在游玩中获得休闲的游戏体验。本游戏的开发工具为Unity3d引擎,并结合来完成代码项目,在分析和设计中遵循软件工程的概念实现了本系统。系统分别建立了前后台,其中前台的功能有用户的注册、和个人信息修改等一系列功能;

来自一名程序猿的案例文档分享 1513

Unity C#通用类型转换(字符串组转泛型数组)

https://docs.microsoft.com/zh-cn/dotnet/api/system.convert.changetype?redirectedfrom=MSDN&amp;view=netframework-4.7.2#overloads 先贴一下官方文档 ChangeType往往用在不知道当前类型应当是什么的情况下,比如有个泛型方法 T GetValue&lt;T&gt;(...

SnoopyNa2Co3的博客 3489

[Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.youkuaiyun.com/qinyuanpei。在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础上实现了手势旋转、放缩等功能。今天呢,我们继续来研究Unity在Android平台上扩展的内容。众所周知,Unity3D是一个强大的跨平台游戏引擎,和大多数喜欢Unity的朋友一样,博主在体验了Unity强大的跨平台能力后,被深深地震撼了,试想以前我们如果要开发一款游戏的话,我们需要对DX、OpenGL等图形库

素履独行 | 元培的个人博客 3万+

C#:泛型在Unity3D中的运用...

泛型是什么? 这是摘自百度百科中对泛型的介绍: 泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。它允许程序员将一个实际的数据类型的规约延迟至泛型的实例...

weixin_33998125的博客 537

C# Unity3D科目二模拟驾考软件源码实现

C#(读作”See Sharp”)是一种简单、现代、面向对象的编程语言。自2000年推出以来,它已成为.NET平台的核心语言,广泛用于开发Windows应用程序、Web服务、游戏开发以及其他多种应用程序。Unity3D引擎的历史可以追溯到2004年,当时它被设计为名为“游戏动力”(Gamebryo Lightspeed)的游戏开发工具。2005年,Unity Technologies收购了这款游戏引擎,并在2007年发布了第一个版本。

weixin_42300144的博客 1035

图形学基础|屏幕空间反射(SSR)

图形学基础|屏幕空间反射(SSR) 文章目录图形学基础|屏幕空间反射(SSR)一、前言二、反射技术概述2.1 环境贴图反射2.2 IBL反射2.3 平面反射(Planar Reflections)2.4 屏幕空间反射(Screen Space Reflection)2.4.1 SSR的基本原理2.4.2 SSR的优缺点三、SSR(Screen-Space Reflection)实现3.1 Efficient GPU Screen-Space Ray Tracing3.1.1 2D Raymarching v

【黑键】 3万+

Unity C#使用反射,利用字符串作为泛型参数调用泛型方法

参考https://gameinstitute.qq.com/community/detail/122847 本身想做个通过字符串名字添加组件的功能,但是实现不了,参考了文章写了下面的代码 是通过MakeGenericMethod方法,将type转换为泛型参数,然后通过反射直接调用AddComponent MethodInfo mi = typeof(GameObject).GetMethod(“...

zxc244603934的博客 1029

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

c#中list容器学习

C# List用法 所属命名空间:using System.Collections.Generic;   List类是  ArrayList 类的泛型等效类。 该类使用大小可按需动态增加的数组实现  IList 泛型接口。  泛型的好处: 它为使用 c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到

ghevinn欢迎您光临 5031

当知识图谱遇见多模态:突破文本界限的智能认知革命

本文探讨了知识图谱与多模态技术的融合,揭示了其在医疗诊断、文化保护等领域的革命性应用。通过图神经网络、对比学习框架和跨模态注意力机制等技术,实现了文本、图像和音频数据的智能关联与认知。文章还分享了在Neo4j等图数据库中的实践案例和优化策略,为构建下一代智能认知系统提供了技术参考。

weixin_29197835的博客 464

别再折腾环境了!Windows 11 + VSCode + CMake 3.31.4 + MinGW-w64 一键式配置指南(附常见报错解决)

本文提供Windows 11下VSCode、CMake 3.31.4和MinGW-w64的一键式配置指南,帮助开发者快速搭建高效C++开发环境。涵盖工具链选型、环境变量配置、项目初始化及常见报错解决方案,大幅提升开发效率。

weixin_28841265的博客 186

C#泛型在unity3D中的运用

泛型是什么? 这是摘自百度百科中对泛型的介绍: ? 泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。它允许程

anmofeng的专栏 678

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

Untiy3D,C#泛型研究实战笔记

** 泛型: 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。(以上摘抄自百度百科) ** 简单的说泛型就是为了减少代码量,增加开发效率的一种工具。在Unity3d中如何使用泛型呢,我们来看下面的例子 //对象的父物体 public Transform

BrightMZM的博客 318

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1491

SAP 清账凭证 完整生成逻辑(超详细原理 + 底层规则 + 分录逻辑 + 互清特殊规则)

【SAP清账凭证核心逻辑摘要】(149字) SAP清账凭证生成遵循两大类型:1)资金往来对冲型(如F-32/F-44互清),强制生成含完整借贷分录的独立凭证,通过AUGDT/AUGBL字段绑定未清项,典型场景如应收冲应付(借:应付账款 贷:应收账款);2)纯核销型(如F.13自动清账),仅标记行项目状态不产生实际分录。关键规则:①仅未清项管理科目可清账;②互清必须配置主数据关联;③差额清账自动补差(折扣/汇差);④原始凭证永不修改,仅更新BSIK/BSAD等表状态。清账凭证均保留可追溯性,支持FBRA重置还

金牌架构师 542

【Unity3D插件】Unity3D各类教程汇总

推荐阅读 优快云主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、工具篇 工欲善其事,必先利其器 学习Unity3D不从工具篇说起怎么能行? 学习Unity3D最重要的两个工具:Unity3D和Visual Studio(Visual Studio Code也行) 1-1、Unity3D安装 Unity 安装个人免费版步骤详解(通过UnityHub安装unity,是比较流行的安装方式) https://blog.youkuaiyun.com/fi.

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1万+

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 650

Unity3D 基于预设(Prefab)的泛型对象池实现

背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来。 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样的对象池才是好的呢,我们发现通用的对象池未必适应所有的环境,比如基于UI的局部(从某个Scene,到某个Dialog)对象池,范围不同,需要的对象池就有不同的要求。本文就是介绍一种基于预设(Pre...

weixin_34218890的博客 152

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c#集合在UNITY3D里的应用

c#集合在UNITY3D里的应用(二) List类是  ArrayList 类的泛型等效类。 该类使用大小可按需动态增加的数组实现  IList 泛型接口。 泛型的好处: 它为使用 c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。 一、  List的基础、常用方法: 1、List mList = new

夜空的流星的专栏 3238

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unity3D——C#编译到运行的过程分析

1、Unity引擎是如何做到跨平台运行的 我们从基础概念开始,一步步走进真相: 程序集 一个.Net程序由一个或者多个程序集组成,程序集可以是库,也可以是应用程序。.Net中,库项目导出的文件格式为.dll,应用程序导出后的文件格式为.exe。 类似Flash项目,也是由库项目和应用程序项目组成。在Flash中,库项目导出后的文件格式为.swc,应用程序导出后的文件格式为.swf。 比如:一般Un...

weixin_33898233的博客 3064

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

使用Unity3d和C#进行背包滚动(可设置多行)

使用Unity3d和C#进行背包滚动(可设置多行)引入什么是无限滚动代码设计思路一、设计Scrollview部分1.思路说明代码部分二、初始化生成预设体创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 引入 我们在玩游戏时,大多数游戏都有背包这个界面,譬如王者荣耀的背包,那么多的格子,如果完全加载出来是非常消耗性能的。我们在使用Unity3d和C#

PMxiang的博客 4453

Unity3D研究院之使用C#语言建立本地数据库

以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行交互。本文我在详细说说如何使用C#语言来在MAC 操作系统下创建Unity本地数据库,我是C#控哇咔咔~~~       首先你需要得到Mono.Data.Sqlite.dll 文件 与System.Data.dll文件。如果你在Mac 操作系统下使用Unity那么很悲剧,找不到这两个文件,至少我没能找到。后来

随风吹笛 1357

Unity3D中简单的C#异步Socket实现

Unity3D中简单的C#异步Socket实现   简单的异步Socket实现。.net框架自身提供了很完善的Socket底层。笔者在做Unity3D小东西的时候需要使用到Socket网络通信。于是决定自己研究研究。   经过不懈努力。。O(∩_∩)O哈哈~。。自我夸奖一下。终于搞定了。SimpleSocket.cs   由于笔者本身并不是专业的C#程序员。O(∩...

235

Unity3D视频教程,Unity3D从入门到精通视频教程

2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。   只会打游戏,不去研究可不行。一直在想,像王者荣耀这样火的游戏是用什么引擎和语言开发的? 这里就不得不说到现在最主流的游戏开发引擎——Unity3D了。 Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...

黑马程序员官方博客 2万+

Unity3D研究院之查找资源被哪里引用了

Unity3D研究院之查找资源被哪里引用了 https://www.xuanyusong.com/archives/4207 Unity提供了一个方法 AssetDatabase.GetDependencies(),但是它只能查找这个资源引用了那些资源。 但是我想要的是查找某个资源被那些资源引用了,这是两种相反的查找公式。 其实网上也有很多这样的插件了,似乎代码量都太多了。昨天晚上加班时脑洞打...

kuangben2000的博客 328
上一篇: unity3d研究之c# 单例模式
下一篇: unity3d研究之 角色换装
GameMonkey
博客等级 码龄19年 60粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值