Great_Sea1 2024-08-02 10:44 采纳率: 0%
浏览 9

Minecraft1.20.1forge47.3.0手持物品动画模型未渲染问题

您好,我这里写了一个Minecraft 1.20.1 forge47.3.0 的模组,使用geckolib进行动画制作,参照了您发的一条有关动画物品的帖子,但是我使用了不同的方法,就是写了一个基类,可以快捷地添加物品攻击动画,但是我遇到了模型渲染不出来的问题,可以帮我看看么

package com.example.examplemod.items.client;

import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.Tier;
import net.minecraft.world.level.Level;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.common.MinecraftForge;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animatable.instance.InstancedAnimatableInstanceCache;
import software.bernie.geckolib.core.animation.*;
import software.bernie.geckolib.core.object.PlayState;

public abstract class AnimatedAttackItemBase extends SwordItem implements GeoItem {
    private final AnimatableInstanceCache cache = new InstancedAnimatableInstanceCache(this);
    private boolean isAttacking = false;

    public AnimatedAttackItemBase(Tier tier, int attackDamage, float attackSpeed, Properties properties) {
        super(tier, attackDamage, attackSpeed, properties);
        MinecraftForge.EVENT_BUS.register(this);
    }

    @Override
    public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) {
        controllerRegistrar.add(new AnimationController<>(this, "controller", 0, this::predicate));
    }

    private PlayState predicate(AnimationState<?> event) {
        if (isAttacking) {
            event.getController().setAnimation(RawAnimation.begin().then(getAttackAnimation(), Animation.LoopType.PLAY_ONCE));
            isAttacking = false;
        } else {
            event.getController().setAnimation(RawAnimation.begin().then(getIdleAnimation(), Animation.LoopType.LOOP));
        }
        return PlayState.CONTINUE;
    }

    @SubscribeEvent
    public void onAttackEntity(AttackEntityEvent event) {
        if (event.getEntity().getMainHandItem().getItem() instanceof AnimatedAttackItemBase) {
            isAttacking = true;
            event.getEntity().sendSystemMessage(Component.translatable("111"));
        }
    }

    @Override
    public AnimatableInstanceCache getAnimatableInstanceCache() {
        return cache;
    }


    protected abstract String getAttackAnimation();
    protected abstract String getIdleAnimation();
}

我不知道是否是我导入问题还是什么,这是我的注册item的类↓

package com.example.examplemod.items;

import com.example.examplemod.ExampleMod;
import com.example.examplemod.items.client.AnimatedAttackItemBase;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Tiers;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import software.bernie.geckolib.core.animatable.GeoAnimatable;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animation.AnimatableManager;

public class ModItems extends Item implements GeoAnimatable {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ExampleMod.MODID);

    public ModItems(Properties p_41383_) {
        super(p_41383_);
    }

    public static void init(IEventBus eventBus){ITEMS.register(eventBus);}

    public static final RegistryObject<Item> FIRST_ITEM = ITEMS.register("custom_animated_item", () -> {
        return new AnimatedAttackItemBase(Tiers.IRON, 3, -2.4f, new Item.Properties()) {

            @Override
            protected String getAttackAnimation() {
                return "animation.model.attack"; // 修改这里
            }

            @Override
            protected String getIdleAnimation() {
                return null;
            }
        };
    });

    public static final RegistryObject<Item> ITEM_TWO = ITEMS.register("item_two",
            () -> new Item(new Item.Properties()));

    @Override
    public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) {

    }

    @Override
    public AnimatableInstanceCache getAnimatableInstanceCache() {
        return null;
    }

    @Override
    public double getTick(Object o) {
        return 0;
    }
}


由于无法将橡木工程文件上传……这非常麻烦……

img

这就是我的问题,求解答

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-08-06 09:35
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析:根据您提供的代码,您的问题可能出现在注册item的类中。可能是您没有将您的AnimatedAttackItemBase类正确注册到Forge中。 解决方案:请确保您在注册item的类中正确注册您的AnimatedAttackItemBase类。您可以使用DeferredRegister来注册您的物品,并确保在注册时传入正确的参数和调用正确的方法。以下是一个示例代码:
    package com.example.examplemod.items;
    import com.example.examplemod.ExampleMod;
    import com.example.examplemod.items.client.AnimatedAttackItemBase;
    import net.minecraft.world.item.CreativeModeTab;
    import net.minecraft.world.item.Item;
    import net.minecraft.world.item.Tiers;
    import net.minecraftforge.eventbus.api.IEventBus;
    import net.minecraftforge.registries.DeferredRegister;
    import net.minecraftforge.registries.ForgeRegistries;
    public class ModItems {
        public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ExampleMod.MODID);
        public static final RegistryObject<Item> YOUR_ITEM = ITEMS.register("your_item", () -> new AnimatedAttackItemBase(Tiers.DIAMOND, 3, -2.4f, new Item.Properties().tab(CreativeModeTab.TAB_COMBAT)));
        public static void register(IEventBus eventBus) {
            ITEMS.register(eventBus);
        }
    }
    

    您需要将上述代码放在您的注册item的类中,并确保将您的AnimatedAttackItemBase类传入new AnimatedAttackItemBase的参数中,同时正确设置Item.Properties。最后,通过调用register方法注册您的物品。 希望以上解决方案能够帮助您解决模型渲染不出来的问题。如果仍有疑问或问题,请随时追问。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月2日