Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unity/C#:通过值实现类专门化(等同于C++ std::array<int>)

Unity/C#:通过值实现类专门化(等同于C++ std::array<int>)
EN

Stack Overflow用户
提问于 2018-01-21 11:17:36
回答 1查看 100关注 0票数 0

我有一个问题,我知道如何在C++中解决,但我不知道在C#中是如何工作的。以下是用C#编写的示例代码:

代码语言:javascript
运行
AI代码解释
复制
public class TowerTile<ScriptType, SpriteName> : Tile where ScriptType : MonoBehaviour {
    private void Awake() {
        gameObject = new GameObject();
        gameObject.AddComponent<ScriptType>();
        colliderType = Tile.ColliderType.None;
        sprite = GameManager.shared.sprites[SpriteName];
    }
}

示例中的SpriteName应该是string类型,这样我就可以在Dictionary<string, Sprite> sprites上的operator[]中使用它。

下面是我用C++编写它的方式:

代码语言:javascript
运行
AI代码解释
复制
template <typename ScriptType, typename SpriteRef = std::string> 
class TowerTile : public Tile {
    private void Awake() {
        gameObject = new GameObject();
        gameObject.AddComponent<ScriptType>();
        colliderType = Tile.ColliderType.None;
        sprite = GameManager.shared.sprites[SpriteRef];
    }
}

如何在C#中实现这一点?我不能将字符串作为构造函数参数传递,因为这些Tile对象是用ScriptableObject.CreateInstance<T>()实例化的,它不能传递任何构造函数参数。

EN

回答 1

Stack Overflow用户

发布于 2018-01-22 09:53:57

为了使问题和答案更清楚,我想从example中模板这个类,因为它在Unity中使用ScriptableObject.CreateInstance<T>()实例化的方式不允许构造函数参数。即使在C#中可以通过值进行特殊化(这是不可能的),它也不会有任何帮助,因为实例化方法无论如何都不能创建泛型类型(为什么是Unity?)。所以我使用的解决方案是一个带有模板方法的工厂,它返回基类'Tile‘。

代码语言:javascript
运行
AI代码解释
复制
public class TileFactory {
    private TileFactory() {}

    public static Tile CreateInstance<ScriptType>(string spriteName) where ScriptType : DefaultAI {
        var tile = ScriptableObject.CreateInstance<TowerTile>();
        tile.sprite = GameManager.shared.sprites[spriteName];
        tile.gameObject.name = spriteName;
        tile.gameObject.GetOrAddComponent<ScriptType>();
        return tile;
    }
}

与所讨论的示例相比,的变化是:

在我自己的工厂中封装这个方法,解决了无法将spriteName传递到ScriptableObject.CreateInstance<T>()中的问题。method.

  • ScriptableObject.CreateInstance<T>()是用非泛型类型调用的,只有在将泛型类型脚本添加到object.

  • Returned实例中之后,它才是一个非泛型类型,看起来Unity有一些问题,对于一些reason.

  • ScriptType,现在应该是基类DefaultAI,它是基类MonoBehaviour (与这个答案的目的并不相关)。

另一种选择是使用Buidler,但由于我只需要传递1个必需的参数,构建器就没有多大意义了。然而,在其他一些情况下,这将是一个更好的解决方案。

附言:感谢Furkan Kambay提供的相关资源,帮助解决了这个问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48366181

复制
相关文章
如何使用 Ansible 打补丁以及安装应用
如果你的回答是肯定的,那就需要了解一下 Ansible 了。它是一个配置管理工具,对于一些复杂的有时候需要几个小时才能完成的系统管理任务,又或者对安全性有比较高要求的时候,使用 Ansible 能够大大简化工作流程。
用户8639654
2021/10/14
1.4K0
Oracle Patch补丁体系和如何打补丁
Oracle作为大型商用关系型数据库,从其补丁体系就可以看出其考虑的全面性。首先我们看下Oracle Patch的主要类型[参考1和2]:
bisal
2019/01/29
4.6K0
PG的管道模式如何工作
什么是管道模式呢?管道模式允许应用程序发送查询,而不用读取先前发送查询的结果。一句话,它允许在单个网络事务中发送和接收多个查询和结果,从而显著提高性能。
yzsDBA
2022/03/29
7870
PG的管道模式如何工作
如何搭建一个应用作为NFT
我们将使用 Pinata, Polygon, 和 OpenSea , 创建一个应用 NFT (应用本身是一个 NFT)。
Tiny熊
2022/11/07
9680
如何搭建一个应用作为NFT
如何强制安装某个更新补丁?
是山河呀
2025/03/23
2530
ADG环境如何打PSU补丁?
随着Oracle ADG技术的逐渐成熟,大多数数据库环境都使用ADG作为灾备和报表数据库,可以说是标配。
Lucifer三思而后行
2021/08/17
5780
ADG环境如何打PSU补丁?
如何给 npm 包打补丁?
今天鬼事神差想起去年写的一段 dirty hack 代码,当时是在 vue-minder-editor-extended 这个项目为了解决百度开源的 @7polo/kityminder-core npm 包的 bug,但是百度早在 17-18 年就停止更新了,我又不想自己 fork 一份源码然后重新发包,于是当时直接从 node_modules 里面复制出了打包后的源码进行修改,然后放到了项目中 src/script/patch/kityminder.core.js,并因修改了引入:
Cell
2023/10/19
3310
如何运行Windows Update/windows打补丁
  1.通过单击“开始”按钮打开Windows Update。然后点击“所有程序”,找到“Windows Update”并点击它。
会长君
2023/04/26
1.5K0
pyspark-ml学习笔记:如何在pyspark ml管道中添加自己的函数作为custom stage?
问题是这样的,有时候spark ml pipeline中的函数不够用,或者是我们自己定义的一些数据预处理的函数,这时候应该怎么扩展呢? 扩展后保持和pipeline相同的节奏,可以保存加载然后transform。
MachineLP
2019/08/29
3.3K0
教你如何给Rockwell软件打补丁
在使用AB软件时,可能常常安装了许多版本的RSLogix或Studio 5000,以涵盖必须支持的各种处理器。当您安装这些类型的软件时,建议您从Rockwell下载最新的补丁汇总并安装补丁。
剑指工控
2022/11/14
1.4K0
教你如何给Rockwell软件打补丁
windows如何单独安装某个补丁(不是通过补丁安装文件)
注意sconfig命令行异常的话,用绝对路径,有次我在cmd、powershell执行时,有一个命令行一闪而过,另一个可以,后来测试这2个在当时那个环境中,不论cmd还是powershell都可以
Windows技术交流
2024/07/02
1K0
如何让你的程序支持管道输入
《如何让你的程序支持管道输入》一文主要介绍了如何让你的程序支持管道输入,以及支持管道输入的方法和示例。通过使用管道符号 |,可以将一个命令的输出作为另一个命令的输入,从而提高程序的灵活性和可重用性。在具体实现中,需要考虑从标准输入读取数据和支持标准输出写入数据,从而支持管道输入和输出。
雷大亨
2017/12/07
1.7K0
【Linux】Linux管道揭秘:匿名管道如何连接进程世界
管道(Pipe)是一种常见的进程间通信(IPC,Inter-Process Communication)机制,在 Unix/Linux 系统中尤其重要。它允许一个进程的输出直接作为另一个进程的输入,而不需要使用中间文件。管道通常用于将多个命令连接起来,让它们像流水线一样处理数据。 管道在 Unix/Linux 系统中提供了一种简便的机制,允许数据在不同进程之间传递。它提供了一个缓冲区,数据写入管道的一端(写端),然后可以从另一端(读端)读取。管道的本质是一种半双工的通信机制,即数据只能沿一个方向流动。 提问:有没有一些直观的管道的利用? 当然。其实早在Linux的指令学习中,我们就已经接触到了管道。就是这个符号|。
Yui_
2024/11/19
2040
【Linux】Linux管道揭秘:匿名管道如何连接进程世界
C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);
清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);setbuf(stdin, NULL);前两者仅对windows有用,最后一个则对Linux系统也适用。那么为什么需要清空键盘缓冲区呢? 以下几个实例:
瑞新
2020/07/07
2.9K0
如何看待鸿蒙应用开发框架采用JavaScript作为开发语言?
个人觉得支持 JS 的原因,JS 是浏览器界的汇编语言,而浏览器目前有成为第一大人机交互接口的趋势。
用户10106350
2022/10/28
8130
ASP.NET Core管道详解[6]: ASP.NET Core应用是如何启动的?[下篇]
要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可。但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在注册该承载服务之前需要先完成对这些依赖服务的注册。针对GenericWebHostService及其依赖服务的注册是借助GenericWebHostBuilder对象来完成的。
蒋金楠
2020/12/07
2.5K0
ASP.NET Core管道详解[5]: ASP.NET Core应用是如何启动的?[上篇]
我们知道ASP.NET Core应用的请求处理管道是由一个IServer对象和IHttpApplication对象构成的。我们可以根据需要注册不同类型的服务器,但在默认情况下,IHttpApplication是一个HostingApplication对象。一个HostingApplication对象由指定的RequestDelegate对象来完成所有的请求处理工作,而后者代表所有中间件按照注册的顺序串联而成的委托链。所有的这一切都被GenericWebHostService整合在一起,在对这个承载Web应用的服务做进一步介绍之前,下面先介绍与它相关的配置选项。[本文节选自《ASP.NET Core 3框架揭秘》第13章, 更多关于ASP.NET Core的文章请点这里]
蒋金楠
2020/12/03
7880
如何使用nginx作为docker容器中ASP.NET应用的反向代理
ASP.NET是一个Web开发框架,可以让开发者创建动态的Web应用和服务。ASP.NET的一个优点是它可以运行在不同的平台上,比如Windows,Linux和macOS,使用docker容器。Docker是一个软件工具,可以让开发者将应用打包和部署在隔离的环境中。通过使用docker,ASP.NET应用可以轻松地在任何云或本地基础设施上部署和扩展。使用docker与ASP.NET的一个挑战是如何配置托管应用的Web服务器。一个流行的选择是使用nginx作为ASP.NET应用的反向代理。Nginx是一个高性能的Web服务器,可以处理高并发和负载均衡。通过使用nginx作为反向代理,开发者可以提高他们的ASP.NET应用的安全性,性能和可靠性。要使用nginx作为反向代理,开发者需要配置nginx.conf文件,指定运行在docker容器中的ASP.NET应用的位置和端口。
jackcode
2023/03/30
1K0
如何使用nginx作为docker容器中ASP.NET应用的反向代理
如何制作最新补丁的Win10 LTSC ISO
背景:2024.6.11后,Win10 21H2普通版将会终止服务,不会再收到安全和质量更新,Win10 21H2 LTSC 2021还会持续一段时间到2027.1.12,制作最新补丁的Win10 21H2 LTSC 2021的ISO成为一个客观需求
Windows技术交流
2024/04/02
1.1K0
使用 CVE-2021-43893 在域控制器上删除文件
2021 年 12 月 14 日,在Log4Shell混乱期间,微软发布了CVE-2021-43893,这是一个影响 Windows 加密文件系统 (EFS) 的远程提权漏洞。该漏洞归功于Google Project Zero的James Forshaw,但可能是由于 Log4Shell 的氛围,该漏洞几乎没有引起注意。
Khan安全团队
2022/02/15
1.5K0

相似问题

管道是如何影响stdin的?

20

如何对使用-字符的命令使用管道和stdin

10

如何应用此修补程序

20

如何用最近发布的补丁来修补、编译和升级Thunar .拱门路?

10

如何在管道/STDOUT/STDIN中编码数据?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档