Unity 游戏框架搭建 2019 (四十一) 泛型:结构复用利器

2024-05-06 12:58

本文主要是介绍Unity 游戏框架搭建 2019 (四十一) 泛型:结构复用利器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇我们使用 object 解决了方法结构重复的问题,而在文章的尾部又提了一下更好的方法,就是泛型。

泛型对很多初学者来说是比较高级的概念,这里呢我们顺便复习一下泛型。

泛型是什么呢?对于方法来说,方法结构中的部分或全部类型都可以先不进行定义,而是到调用方法的时候再去定义。

我们的 GetRandomValue 的目前代码如下 :

public static object GetRandomValueFrom(object[] values)
{return values[Random.Range(0, values.Length)];
}

测试代码如下:

var intRandomValue = (int)GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = (string)GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = (float)GetRandomValueFrom(new float[]{ 0.1f,0.2f });

将 object 改成泛型后如下:

public static T GetRandomValueFrom<T>(T[] values)
{return values[Random.Range(0, values.Length)];
}

测试代码如下:

var intRandomValue = GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = GetRandomValueFrom(new float[]{ 0.1f,0.2f });

从测试代码中可以比较出来,使用泛型之后的代码确实好用了很多。

大家思考下泛型是不是这样的?结构中的部分或全部类型都可以先不进行定义,而是到调用的时候再去定义。

我们有收获了一个法宝泛型。要说方法是逻辑上的复用,那么泛型就是结构上的复用。两大复用法宝。

关于泛型就先介绍到这里,我们以后还会遇到使用泛型的时候的。

在看下当前的测试代码:

var intRandomValue = GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = GetRandomValueFrom(new float[]{ 0.1f,0.2f });

目前比较麻烦的是数组构造代码了。

这个也是有办法搞定的。我们把方法的实现改成如下:

public static T GetRandomValueFrom<T>(params T[] values)
{return values[Random.Range(0, values.Length)];
}

大家注意下,参数前边加上了一个 params 关键字。这个是什么意思呢?
意思是 GetRandomValueFrom 可以传任意数量的参数。

我们先看下测试代码,测试代码呢其实可以改成如下:

var intRandomValue = GetRandomValueFrom(1, 2, 3);
var stringRandomValue = GetRandomValueFrom("asdasd", "123123");
var floatRandomValue = GetRandomValueFrom(0.1f, 0.2f);

是不是清爽了很多?这就是 params 的用法。

而通过 params 修饰的 values 参数来说,如果传入的是一个数组,那么 values 本身就是这个数组,如果传入的是若干个值,那么 values 中就包含了这若干个值。

总结一句话,就是可以传一整个数组,也可以传若干个参数,设计得非常人性化。

到此呢,我们的第九个示例就已经非常完善了。

全部代码如下:

using UnityEngine;namespace QFramework
{public partial class MathUtil{
#if UNITY_EDITOR[UnityEditor.MenuItem("QFramework/9.从若干个值中随机取出一个值", false, 10)]
#endifprivate static void GetRandomValueFromMenuClicked(){Debug.Log(GetRandomValueFrom(1, 2, 3));Debug.Log(GetRandomValueFrom("asdasd", "123123"));Debug.Log(GetRandomValueFrom(0.1f, 0.2f));}public static T GetRandomValueFrom<T>(params T[] values){return values[Random.Range(0, values.Length)];}}
}

代码执行结果如下:
006tNc79gy1fzfsfiotsuj30e609iwf7.jpg

编译之后菜单如下006tNc79gy1fzfsfm17ahj30ia0cmdmz.jpg

目录结构如下
006tNc79gy1fzfsfo9rylj30jm0ccwg7.jpg

我们进行一次导出,这次导出就正常导出就好。

今天的内容就到这里,我们下一篇再见,拜拜~。

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 进阶小班

    • 主要训练内容:
      • 框架搭建训练(第一年)
      • 跟着案例学 Shader(第一年)
      • 副业的孵化(第二年、第三年)
    • 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

这篇关于Unity 游戏框架搭建 2019 (四十一) 泛型:结构复用利器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964412

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同