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

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类