【问题标题】:Is there any way to determine the extent of an asset based on the type of object that is received?有没有办法根据收到的对象的类型来确定资产的范围?
【发布时间】:2021-10-10 05:25:45
【问题描述】:

我想知道是否有任何方法可以简单地通过传递一个 Object 在 Unity 中创建资产,并且可以确定扩展而无需逐个检查 getType 是否属于一种或另一种类型放一个或另一个扩展名,这是一个例子:

public void SaveAsset(Object obj)
{
   string ext = ""; //How to get this?
   AssetDatabase.CreateAsset(obj, "Assets/" + obj.name + ext);
}

【问题讨论】:

  • 检查System.IO.File.FileInfo 类。使用该 cc# 内置类,您可以检索 taht 信息。检查this 示例
  • @rustyBucketBay 这无济于事.. OP 在创建文件之前需要扩展

标签: c# file unity3d save assets


【解决方案1】:

不,afaik 你必须按类型去 .. 但检查列表似乎非常有限:

“.mat”用于材质,“.cubemap”用于立方体贴图,“.GUISkin”用于皮肤,“.anim”用于动画,“.asset”用于任意其他资产。

所以在大多数情况下,它只是.asset,除非你在做一些花哨的事情;)

必须用 getType 逐一检查

实际上已经不是这样了!我认为从 c# 7 开始,您可以使用基于 switch 的类型,例如

string ext;
switch(obj)
{
    case Material:
        ext = ".mat";
        break;

    case Cubemap:
        ext = ".Cubemap";
        break;

    case GUISkin:
        ext = ".GUISkin";
        break;

    case AnimationClip:
        ext = ".anim";
        break;

    default:
        ext = ".asset";
        break;
}

基本上这等于或多或少的写作

string ext;
if(obj is Material)
{
    ext = ".mat";
}
else if(obj is Cubemap)
{
    ext = ".Cubemap";
}
else if(obj is GUISkin)
{
    ext = ".GUISkin";
}
else if(obj is AnimationClip)
{
    ext = ".anim";
}
else 
{
    ext = ".asset";
}

另请参阅Tutorial: Use pattern matching to build type-driven and data-driven algorithms,在 c# 8 中如此最新,您也可以编写与 Pattern Matching 相同的内容,例如(虽然我不太喜欢那样)

var ext = obj switch
{
    Material _ => ".mat",
    Cubemap _ => ".cubemap",
    GUISkin _ => ".GUISkin",
    AnimationClip _ => ".anim",
    _ => ".asset"
};

由于无论如何您的代码只会在编辑器本身中运行(在其他地方AssetDatabase 不可用),性能不应该是您关心的问题,因为它不需要是实时的。

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2020-03-29
    相关资源
    最近更新 更多