Minecraft 1.19.2 Fabric模组开发 03.动画生物实体

news2024/11/20 11:20:00

我们本次尝试在1.19.2 Fabric中添加一个能够具有各种动画效果动作的生物实体。

goosefall.gif

效果展示 效果展示 效果展示

1.首先,为了实现这些动画效果,我们需要首先使用到一个模组:geckolib(下载地址)

找到项目的build.gradle文件,在repositoriesdependencies中添加依赖。

repositories {

    //添加这个
    maven { url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' }
    
}
dependencies {
    minecraft 'net.minecraftforge:forge:1.19.2-43.1.1'
       
    //添加这个
    modImplementation 'software.bernie.geckolib:geckolib-fabric-1.19:3.1.18'

}

crt.jpg

之后点击Refresh Gradle Project按钮重新构建项目

crr.jpg

构建好了项目后在项目的ModMain类中添加一句geckolib的初始化语句:

ModMain.java

	@Override
	public void onInitialize() {
		ItemInit.registerModItems();
		
		//添加这个
		GeckoLib.initialize();
	}

2.之后,与之前的教程一样,我们需要在blockbench中制作一个模组中的生物实体:

进入软件后我们要找到一个插件按钮,然后再搜索栏中输入GeckoLib Animation Utils,并下载这个插件

cr6.png

将我们制作好的生物实体进行模型转换工作,找到Convert Project,之后选择Geckolib Animated Model

cr7.png

在这之后,你会发现你的生物实体栏多了一个Animate栏,点击进去:

crq.jpg

具体动作制作的视频:Blockbench动画制作

在制作好所有的动画后我们导出模型和动画json文件。

crw.jpg

3.模型制作完成,接下来需要制作生物实体类,因为我们的生物的动作有很多,所以要在生物的不同状态时做出对应的动作。

EntityGoose.json

package net.joy187.joyggd.entity;

import net.minecraft.entity.EntityType;
import net.minecraft.entity.ai.goal.LookAroundGoal;
import net.minecraft.entity.ai.goal.SwimGoal;
import net.minecraft.entity.ai.goal.WanderAroundFarGoal;
import net.minecraft.entity.attribute.DefaultAttributeContainer;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.passive.ChickenEntity;
import net.minecraft.world.World;
import software.bernie.geckolib3.core.IAnimatable;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;
import software.bernie.geckolib3.core.manager.AnimationData;
import software.bernie.geckolib3.core.manager.AnimationFactory;

public class EntityGoose extends ChickenEntity implements IAnimatable {

	private AnimationFactory factory = new AnimationFactory(this);
	
	public EntityGoose(EntityType<? extends ChickenEntity> entityType, World world) {
		super(entityType, world);
		// TODO Auto-generated constructor stub
	}
	
	//生物ai
	@Override
    protected void initGoals() {
        this.goalSelector.add(1, new SwimGoal(this));
        this.goalSelector.add(3, new WanderAroundFarGoal(this, 0.75f, 1));
        this.goalSelector.add(4, new LookAroundGoal(this));
        
    }
	//生物一些属性
    public static DefaultAttributeContainer.Builder setAttributes() {
        return MobEntity.createMobAttributes()
                .add(EntityAttributes.GENERIC_MAX_HEALTH, 10.0D)
                .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15f);
    }
    
    //生物动作状态机
    private <E extends IAnimatable> PlayState predicate(AnimationEvent<E> event) {
        //在空中时播放摔落动画
    	if(!this.onGround){
            event.getController().setAnimation(new AnimationBuilder().addAnimation("animation.goose.fall", true));
            return PlayState.CONTINUE;
        }
    	//移动时播放走路动画
        if (event.isMoving()) {
            event.getController().setAnimation(new AnimationBuilder().addAnimation("animation.goose.walk", true));
            return PlayState.CONTINUE;
        }
        //平时播放发呆动画
        event.getController().setAnimation(new AnimationBuilder().addAnimation("animation.goose.idle", true));
        return PlayState.CONTINUE;
    }
    
    //将状态机进行注册
	@Override
	public void registerControllers(AnimationData data) {
		data.addAnimationController(new AnimationController<EntityGoose>(this, "controller",
                0, this::predicate));
	}

	
	@Override
	public AnimationFactory getFactory() {
		return factory;
	}
    
}

4.新建生物实体模型文件ModelGoose类:

ModelGoose.java

package net.joy187.joyggd.entity.model;

import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.entity.EntityGoose;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.model.AnimatedGeoModel;

public class ModelGoose extends AnimatedGeoModel<EntityGoose> {
    //模型文件地址
    @Override
    public Identifier getModelResource(EntityGoose object) {
        return new Identifier(ModMain.MOD_ID, "geo/goose.geo.json");
    }
    
    //皮肤贴图文件地址
    @Override
    public Identifier getTextureResource(EntityGoose object) {
        return new Identifier(ModMain.MOD_ID, "textures/entity/goose.png");
    }
    
    //动画文件地址
    @Override
    public Identifier getAnimationResource(EntityGoose animatable) {
        return new Identifier(ModMain.MOD_ID, "animations/goose.animation.json");
    }
}

5.模型部分结束,开始着手渲染类的编写。新建RenderGoose类。

RenderGoose.java

package net.joy187.joyggd.entity.render;

import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.entity.EntityGoose;
import net.joy187.joyggd.entity.model.ModelGoose;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.renderers.geo.GeoEntityRenderer;

public class RenderGoose extends GeoEntityRenderer<EntityGoose> {
    public RenderGoose(EntityRendererFactory.Context ctx) {
        super(ctx, new ModelGoose());
        this.shadowRadius = 0.4f;
    }
    //贴图文件地址
    @Override
    public Identifier getTextureResource(EntityGoose instance) {
        return new Identifier(ModMain.MOD_ID, "textures/entity/goose.png");
    }

    @Override
    public RenderLayer getRenderType(EntityGoose animatable, float partialTicks, MatrixStack stack,
                                     VertexConsumerProvider renderTypeBuffer, VertexConsumer vertexBuilder,
                                     int packedLightIn, Identifier textureLocation) {
        //让你的生物体型放大多少倍(x,y,z三个方向)
        stack.scale(1f, 1f, 1f);

        return super.getRenderType(animatable, partialTicks, stack, renderTypeBuffer, vertexBuilder, packedLightIn, textureLocation);
    }
}

6.在EntityInit.java中注册我们生物信息:

EntityInit.java

package net.joy187.joyggd.init;

import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.entity.EntityGoose;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

public class EntityInit {

    
    public static final EntityType<EntityGoose> GOOSE = Registry.register(
            Registry.ENTITY_TYPE, new Identifier(ModMain.MOD_ID, "goose"), //你的modid,生物名称
            FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, EntityGoose::new) //我们的生物属于CREATURE型
                    .dimensions(EntityDimensions.fixed(0.6F, 1.5F)).build()); //EntityDimensions用于设置碰撞箱大小
    
}

ModClient.java中添加我们的模型渲染注册语句:

ModClient.java

package net.joy187.joyggd;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.joy187.joyggd.entity.render.RenderGoose;
import net.joy187.joyggd.init.EntityInit;

public class ModClient implements ClientModInitializer{

	@Override
	public void onInitializeClient() {
		
		//添加渲染注册语句 第一个是我们的生物,第二个是渲染文件
		EntityRendererRegistry.register(EntityInit.GOOSE, RenderGoose::new);
	}
	
}

在项目主类ModMain中添加生物属性注册语句:

ModMain.java

package net.joy187.joyggd;

public class ModMain implements ModInitializer {
	
	public static final String MOD_ID = "joyggd";
	public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    public static final ItemGroup ITEMTAB = FabricItemGroupBuilder.build(
            new Identifier(MOD_ID, "itemtab"), () -> new ItemStack(ItemInit.SHERIFF));
	
	@Override
	public void onInitialize() {
		ItemInit.registerModItems();
		
		GeckoLib.initialize();
        
        //添加生物属性注册语句
		FabricDefaultAttributeRegistry.register(EntityInit.GOOSE, EntityGoose.setAttributes());
	}
}

7.生物实体部分结束,接下来我们要给生物制作一个刷怪蛋:

在ItemInit类中添加我们的刷怪蛋物品:

    //SpawnEggItem参数:生成的生物,刷怪蛋主颜色,刷怪蛋副颜色,放在哪个物品栏中
    public static final Item GOOSE_SPAWN_EGG = registerItem("goose_spawn_egg",
            new SpawnEggItem(EntityInit.GOOSE,0x22b341, 0x19732e,
                    new FabricItemSettings().group(ModMain.ITEMTAB)));

8.代码部分结束,来到资源包制作环节

resources\assets\你的modid中的lang包中的en_us.json添加刷怪蛋和生物实体英文名称:

  "item.joyggd.goose_spawn_egg": "Mob Spawn Egg",
  "entity.joyggd.goose": "Mob",

models\item包中添加刷怪蛋模型文件:

goose_spawn_egg.json

{
	"parent": "item/template_spawn_egg"
}

textures\entity中添加生物实体的皮肤贴图

新建一个geo包和animation包,把第二步中的模型和动画文件分别放进去

cru.jpg

9.最后我们还要给这个生物设定其掉落物

resources\data\你的modid中新建loot_tables包-> loot_tables包中新建entities包 -> entities包中新建我们的战利品文件goose.json

战利品文件中name为物品名称,weight为掉落权重,越大掉这个物品的概率越高,count为掉落个数,min为最小掉几个,max为最大掉几个。

goose.json

{
    "pools": [
        {
            "rolls": 1.0,
            "bonus_rolls": 0.0,
            "entries": [
                {
                    "type": "item",
                    "name": "joyggd:lei",
                    "weight": 5,
                    "functions": [
                        {
                            "function": "set_count",
                            "count": {
                                "min": 1,
                                "max": 3
                            }
                        },
                        {
                            "function": "looting_enchant",
                            "count": {
                                "min": 0,
                                "max": 1
                            }
                        }
                    ]
                },
                {
                    "type": "item",
                    "weight": 10,
                    "name": "minecraft:iron_nugget",
					"functions": [
                       {
                            "function": "set_count",
                            "count": {
                                "min": 2,
                                "max": 3
                            }
                       }
                   ]
                },
                {
                    "type": "item",
                    "weight": 10,
                    "name": "minecraft:rotten_flesh",
					"functions": [
                       {
                            "function": "set_count",
                            "count": {
                                "min": 0,
                                "max": 2
                            }
                       }
                   ]
                },
                {
                    "type": "item",
                    "weight": 5,
                    "name": "joyggd:blacksheephead",
					"functions": [
                       {
                            "function": "set_count",
                            "count": {
                                "min": 0,
                                "max": 2
                            }
                       }
                   ]
                }
             ]
        }
    ]
}

10.保存所有文件 -> 进行测试:

2023-01-11_12.46.48.png

What are you looking at?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue实现网页端企业微信扫码登录功能(前端部分)

时至今日&#xff0c;企业微信在企业日常工作中的使用越来越频繁也越来越重要&#xff0c;不少企业已使用企业微信进行着日常的工作安排管理。在这种背景下&#xff0c;各类系统和企业微信对接的需求也不断增加&#xff0c;今天要说的就是一个比较常见的需求&#xff1a;在网页…

第08讲:Docker中的网络类型bridge和host

Docker 中的网络模式早先是 3 种&#xff0c;后来又加了 1 种&#xff0c;一共是 4 种。这里&#xff0c;我们只涉及、介绍使用其中 2 种网络模式&#xff1a;bridge 模式和 host 模式。 bridge 是驱动&#xff08; Driver &#xff09;类型为 bridge 的默认网络&#xff1b;h…

『 MySQL篇 』:库操作、数据类型

目录 目录 一、初识数据库 数据库 数据库管理系统 SQL语言 二、详解MySQL MySQL 存储引擎 三、简单的库操作 设置数据库的编码字符集 创建数据库 显示数据库 使用数据库 删除数据库 四、MySQL数据类型 数值类型 字符串类型 日期类型 一、初识数据库 学习 MyS…

SpringBoot整合ELK教程

SpringBoot整合ELK教程 1 基础概念 ELK 即 Elasticsearch、Logstash、Kibana&#xff0c;组合起来可以搭建线上日志系统&#xff0c;本文主要讲解使用 ELK 来收集测试框架产生的日志。 Elasticsearch&#xff1a;用于存储收集到的日志信息&#xff1b;Logstash&#xff1a;用于…

如何成为优秀合格的管理者之角色定位

目录 导语 一、管理者的角色误区和角色定位 &#xff08;一&#xff09;管理者对上级 &#xff08;二&#xff09;管理者对下属 *如何要做好“老师”的角色&#xff1f; &#xff08;三&#xff09;管理者跨部门协作 &#xff08;四&#xff09;管理者对自己 二…

springboot:接手老项目,领导让更新数据库说明文档,如何3分钟完成任务

0 引言 最新在重新整理老项目的文档&#xff0c;其中数据库说明文档上一版更新还是在1年多前&#xff0c;文档中的数据结构说明与当前数据库严重脱节&#xff0c;所以更新数据库说明文档已经是迫在眉睫的事情了。 因为项目是一个比较大型且“年长‘的项目&#xff0c;涉及了多…

谷粒商城-基础篇-Day09-整合Ware服务

整合Ware服务 将服务注册到nacos中 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: gulimall-wareMapperScan("com.atguigu.gulimall.ware.dao")//mybatis包扫描 SpringBootApplication EnableDiscoveryClient//开启服务发现 EnableT…

进入内存,透彻理解数据类型存在的意义,整形在内存中存储,大小端字节序,浮点型在内存中存储

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶、数据结构、算法、JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01;&#x1f4dc;所属专栏&#xff1a;C语言✈往期博文回顾&#xff1a;【Java基础篇…

Java——》AtomicInteger源码分析

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Java——》AtomicInteger源码分析一、测试用例二、…

Java基础学习笔记(一)面向对象

序言&#xff1a;主要记录一下java的学习笔记&#xff0c;用作面试复习&#xff0c;参考的学习资料是尚硅谷Java网课链接 面向对象是P39~P69内容 文章目录一、类和对象二、传值方式三、静态与静态代码块四、包五、构造方法六、继承与构造方法七、多态八、方法的重载与重写8.1 …

[JAVA安全]CVE-2022-33980命令执行漏洞分析

前言 在 i春秋的漏洞靶标上看见了此漏洞&#xff0c;所以前来分析一下漏洞原理&#xff0c;比较也是去年 7月的漏洞。 漏洞描述&#xff1a;Apache官方发布安全公告&#xff0c;修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞&#xff0c;漏洞编号&am…

Linux驱动

Linux驱动 驱动 1.驱动课程大纲  内核模块  字符设备驱动  中断 2.ARM裸机代码和驱动有什么区别&#xff1f;  共同点&#xff1a;都能够操作硬件 (都操作寄存器)  不同点&#xff1a;  裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的框架格…

FastReport .NET 2023.1.8 Crack

FastReport .NET适用于 .NET 6、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可以在 Microsoft Visual Studio 2022 和 JetBrains Rider 中使用。 快速报告.NET 利用 .NET 6、.NET Core、Blazor、ASP.NET、MVC、Windows Forms 和 Mono 数据表示领域专家…

前端入门笔记07 —— js应用

DOM基础 document object model 基本操作 增删改查 查&#xff1a; document成员函数传入 id class tagName等内容获取DOM节点css选择去查询节点获取的DOM对象访问DOM对象的成员 let domResult; domResult document.getElementsByTagName(li); //返回一个类数组对象 Node…

Electron对在线网站做数据交互方案,实现在线网站判断Electron调用自定义接口通讯

(防盗镇楼)本文地址:https://blog.csdn.net/cbaili/article/details/128651549 前言 最近在撸VUE,想要实现一份代码既能构建Web又能构建Electron应用 并且能够判断环境是浏览器还是Electron,随后在Electron中做一些特定的事情 以往的Electron通信依靠IPC通信完成,但是发布到…

2023年,“新一代”固定资产管理平台——支持低代码平台

固定资产是各企业和工厂的主要生产要素&#xff0c;占企业整体资金比例较重&#xff0c;而且随着企业的发展&#xff0c;实物资产的数量和员工日益增多&#xff0c;固定资产的重要性日益凸显。如何高效管理这些实物资产也成了企业管理者经常考虑的问题。单纯依靠人工表格管理固…

python(一) 字符串基本用法

python&#xff08;一&#xff09; 字符串基本用法 目录1.环境安装2. 变量介绍3.变量的命名规则4. 字符串 String 基础4.1 title() 修改单词的大小写 title()4.2 upper() : 将字符串全部改为大写4.3 lower(): 将字符串全部改为小写4.4 字符串的拼接 合并字符串5. 使用制表符或者…

关于抖音年前活动的需求与思考

目录 一、前言 二、需求1 1、后端需求 2、前端需求 三、领取抽卡次数需求 1、后端需求 2、前端需求 四、必得现金红包需求 五、送重复卡需求 1、后端需求 2、前端需求 六、幸运抽奖需求 1、抽奖功能 1.1、首次(或多次)3张节气卡 抽奖 1.2、非首次或多次后5张节气…

【阶段三】Python机器学习14篇:机器学习项目实战:支持向量机分类模型

本篇的思维导图: 项目实战(支持向量机分类模型) 项目背景 目前各大新闻网站很多,网站上的消息也是各式各样,本项目通过建立支持向量机分类模型进行新闻文本分类。 数据收集 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ…

Java加解密(七)数字签名

目录数字签名1 定义2 数字签名特点3 应用场景4 JDK支持的信息摘要算法5 Bouncy Castle 支持的信息摘要算法6 算法调用示例数字签名 1 定义 数字签名&#xff08;digital signature&#xff09;是一种电子签名&#xff0c;也可以表示为一种数学算法&#xff0c;通常用于验证消…