You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift(Xcode)中如何用通配符从Assets.xcassets批量获取SKTexture?

如何用通配符加载Asset Catalog中所有“leaf-*”的SKTexture数组

嘿,这个问题我之前做SpriteKit项目时也碰到过!确实Asset Catalog没有直接支持通配符加载资源的API,手动一个个写50行加载代码不仅麻烦,后期维护也容易出错。不过有两个靠谱的方案能帮你优雅解决这个问题,我给你详细说说:

方案一:编译时自动生成资源列表(最推荐)

这个方法是通过脚本在编译前自动扫描Assets.xcassets里的leaf-*图片,生成一个包含所有资源名的Swift常量文件,之后代码里直接用这个列表加载纹理。好处是完全稳定,没有Runtime依赖,适合生产环境。

步骤:

  1. 在项目根目录创建一个Shell脚本(比如GenerateLeafAssets.sh),内容如下:
#!/bin/bash

# 替换成你的Assets目录路径
ASSETS_DIR="./YourProjectName/Assets.xcassets"
# 替换成你想生成的Swift文件路径
OUTPUT_FILE="./YourProjectName/LeafAssets.swift"

# 查找所有以leaf-开头的imageset目录
LEAF_ASSETS=$(find "$ASSETS_DIR" -type d -name "leaf-*.imageset")

LEAF_NAMES=()
for ASSET in $LEAF_ASSETS; do
    # 提取资源名(去掉.imageset后缀)
    NAME=$(basename "$ASSET" .imageset)
    LEAF_NAMES+=("\"$NAME\"")
done

# 生成Swift文件
cat > "$OUTPUT_FILE" <<EOF
// 自动生成的文件,请勿手动修改
import SpriteKit

// 所有leaf开头的纹理名称列表
let leafTextureNames = [${LEAF_NAMES[*]}]
// 直接生成SKTexture数组
let leafTextures: [SKTexture] = leafTextureNames.map { SKTexture(imageNamed: $0) }
EOF
  1. 给脚本添加执行权限:在终端执行chmod +x GenerateLeafAssets.sh
  2. 在Xcode的项目设置中,添加一个Run Script Build Phase:
    • 打开项目的Target → Build Phases → 点击+号 → 选择New Run Script Phase
    • 在脚本框里输入./GenerateLeafAssets.sh(如果脚本不在根目录,要写完整路径)
    • 把这个Run Script放在Compile Sources之前,确保编译前先生成文件

之后每次编译项目,脚本都会自动更新LeafAssets.swift,你在代码里直接用leafTextures数组就行,完全不用手动维护!

方案二:Runtime枚举Asset Catalog资源

如果你不想写脚本,也可以通过CoreUI框架的CUICatalog来枚举Asset Catalog里的所有资源名,再筛选出leaf-开头的。这个方法不用额外配置,但依赖CoreUI的API,不过目前在iOS 9+都是稳定可用的。

代码示例:

import SpriteKit
import CoreUI

func loadLeafTextures() -> [SKTexture] {
    // 初始化Asset Catalog实例(这里的"Assets"是你的Asset Catalog文件名,默认就是Assets)
    guard let assetCatalog = CUICatalog(name: "Assets", bundle: .main) else {
        print("无法加载Asset Catalog")
        return []
    }
    
    // 获取所有资源名
    let allAssetNames = assetCatalog.allAssetNames()
    // 筛选出以leaf-开头的资源
    let leafAssetNames = allAssetNames.filter { $0.hasPrefix("leaf-") }
    
    // 转换成SKTexture数组
    return leafAssetNames.compactMap { SKTexture(imageNamed: $0) }
}

注意事项:

  • 记得在项目里导入CoreUI框架(在Target的Build Phases → Link Binary With Libraries里添加)
  • 如果你的Asset Catalog不是默认的Assets.xcassets,要把CUICatalog(name:)里的参数改成对应的名字(比如你的Catalog叫GameAssets.xcassets,就传"GameAssets")

为什么直接从项目文件夹查找不行?

你提到尝试从项目文件夹找图片,这是因为Asset Catalog里的图片在编译后会被打包成一个Assets.car的二进制文件,不再是单独的图片文件,所以直接遍历bundle目录是找不到这些图片的,必须通过Asset Catalog的API或者编译时生成列表的方式来获取。

内容的提问来源于stack exchange,提问作者Sjero Markus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:39:05