如何针对特定条件选择项目的不同图层纹理?

问题描述 投票:0回答:1

只需要了解如何执行此操作的一般想法:

我创建了一个将游戏王卡带入游戏的模组。打开包后,您会看到拉出的卡片,卡片名称下有一个工具提示,如“常见”、“稀有”、“超级稀有”等。

在商品型号中:

layer0只是卡片的基础镜像。 第 1 层是底角的金色印记,表示稀有卡。 第二层是一个彩虹全息方块,覆盖了卡片艺术,是超级稀有的。

显然到目前为止,无论卡牌的稀有程度如何,所有 3 层都在游戏中显示。我非常需要它:

如果拉出“common”,则仅显示第0层(卡片图像)。

罕见仅显示layer0和layer1(卡片图像和金印)。

超级罕见仅显示layer0和layer2(卡片图像和彩虹全息方块)。

大约有 13000 多张卡片,每张卡片都有自己的物品模型。显然,我使用 Excel 到 JSON 代码制作了这些,因此我不会单独对每个卡片进行编码,但如果每种稀有度或每张卡片都需要单独编码,这是不可能的。

有办法实现吗?就像如果工具提示等于常见,则显示第0层,否则如果工具提示等于稀有,则显示第0层+第1层,否则如果超稀有显示第0层+第2层? (显然这行不通,只需要应用它)

java minecraft minecraft-forge
1个回答
0
投票

实现游戏王卡牌的外观根据其稀有度而变化的系统涉及根据卡牌的稀有度状态控制渲染哪些层。由于您拥有超过 13,000 张卡,因此您需要一个可扩展且不需要对每张卡进行手动编码的解决方案。关键是利用游戏的渲染系统根据每张卡牌的稀有度动态调整其可见层。

一般方法

为了实现这一点,您可以使用 JSON 模型文件中的元数据或属性来根据卡牌的稀有度控制图层的渲染。这可以使用自定义项目模型 JSON 和 mod 中的一些条件渲染逻辑来完成。

以下是有关如何实施此操作的分步指南:

逐步实施

1.修改 JSON 模型文件

每张卡牌的 JSON 模型文件应包含定义其稀有度的属性。您可以使用

custom
属性来实现此目的。以下是 JSON 的外观示例:

{
  "parent": "item/generated",
  "textures": {
    "layer0": "modid:item/card_base",
    "layer1": "modid:item/card_rare",
    "layer2": "modid:item/card_super_rare"
  },
  "overrides": [
    { "predicate": {"custom_model_data": 1}, "model": "modid:item/card_common" },
    { "predicate": {"custom_model_data": 2}, "model": "modid:item/card_rare" },
    { "predicate": {"custom_model_data": 3}, "model": "modid:item/card_super_rare" }
  ]
}

在此模型中,

custom_model_data
用于区分卡片类型:

  • 常见
    custom_model_data: 1
  • 稀有
    custom_model_data: 2
  • 超级稀有
    custom_model_data: 3

2.为每种稀有品创建模型

为每种稀有度创建单独的 JSON 模型:

  • 普通型号

    card_common.json
    ):

    {
      "parent": "item/generated",
      "textures": {
        "layer0": "modid:item/card_base"
      }
    }
    
  • 稀有型号

    card_rare.json
    ):

    {
      "parent": "item/generated",
      "textures": {
        "layer0": "modid:item/card_base",
        "layer1": "modid:item/card_rare"
      }
    }
    
  • 超级稀有型号

    card_super_rare.json
    ):

    {
      "parent": "item/generated",
      "textures": {
        "layer0": "modid:item/card_base",
        "layer2": "modid:item/card_super_rare"
      }
    }
    

每个 JSON 文件根据稀有度使用不同的纹理,控制显示哪些层。

3.使用自定义模型数据分配稀有度

在您的模组中,当拉出或生成一张卡牌时,根据其稀有度为其分配一个

custom_model_data
值。这可以在您的项目初始化代码中完成。例如:

ItemStack card = new ItemStack(ModItems.YUGIOH_CARD);
int rarityValue = getRarityValue(cardRarity); // Method to convert rarity string to integer
card.getOrCreateTag().putInt("CustomModelData", rarityValue);

在此代码片段中,

getRarityValue(cardRarity)
将是您定义的方法,它将像
"common"
这样的字符串转换为与模型数据相对应的整数(
1
表示常见,
2
表示罕见等)。

4.更新渲染逻辑

确保您的 mod 渲染逻辑遵循

CustomModelData
标签。如果游戏的渲染系统检查此数据,JSON 模型中指定的覆盖将自动生效。

大规模实施的技巧

  1. 批处理:使用脚本批量生成JSON文件。既然您提到使用 Excel 转 JSON,请继续基于包含稀有性逻辑的模板自动创建这些文件。

  2. 集中管理:考虑拥有一个中央注册表,您可以在其中以编程方式定义每张卡的稀有度,可以在项目初始化期间使用。

  3. 性能注意事项:确保您的 JSON 文件经过优化,并在需要时利用缓存以避免由于大量项目定义而导致性能瓶颈。

  4. 版本控制:将所有 JSON 模型及其相关脚本置于版本控制之下,以便更轻松地跟踪更改并与团队协作。

实施示例

以下是 Java 代码如何处理模型数据设置的简单示例:

public class CardManager {

    // Method to get rarity value
    private int getRarityValue(String rarity) {
        switch (rarity.toLowerCase()) {
            case "common":
                return 1;
            case "rare":
                return 2;
            case "super rare":
                return 3;
            default:
                return 1; // Default to common if undefined
        }
    }

    // Method to create a card with the correct model
    public ItemStack createCard(String cardName, String rarity) {
        ItemStack card = new ItemStack(ModItems.YUGIOH_CARD);
        int rarityValue = getRarityValue(rarity);
        card.getOrCreateTag().putInt("CustomModelData", rarityValue);
        card.setDisplayName(new TextComponent(cardName));
        card.getOrCreateTag().putString("Rarity", rarity);
        return card;
    }
}

结论

通过利用

CustomModelData
属性和 JSON 模型覆盖,您可以根据稀有度有效管理每张卡牌的显示方式,而无需手动配置每张卡牌。这种可扩展的解决方案将使您能够高效地处理所有 13,000 多张卡片。如果您遇到任何问题或需要进一步帮助,请随时询问! 艾不是我

© www.soinside.com 2019 - 2024. All rights reserved.