当前位置: 首页 > news >正文

【Unity】ScriptableObject的应用:利用配方合成新物体

前一篇已经使用ScriptableObject(SO)类配置可放置物体,本篇探索更多的SO类应用场景。

需求分析

将若干指定物体放在工作台上,可以生成新的物体。

成果展示

请添加图片描述

Scene部分

准备工作台,放在工作台上的物体全部放在指定PlacedObjects空物体下。
在这里插入图片描述
准备如下几种物体及其配方:

  • 正方体;
  • 长方体 <= 两个正方体;
  • 圆柱;
  • 轮组 <= 长方体 + 圆柱;
  • 汽车 <= 两个长方体 + 两个轮组;
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上一章节以及设计了PlaceObjectTypeSO 配置所有可以放置物体,接下来需要设计配方SO类。

  • 需要定义其配方和输出的物体;

  • 每当新的物体放在工作台上,就要检查是否是配方中的物体类型,是否集齐全部物体。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

脚本部分

PlacedObjectTypeSO.cs

内容与前篇一致,修改了两个地方

1、当项目中出现多个SO类时,可以定义如下内容,使其他在editor 中合理的展示。

[CreateAssetMenu(fileName = "PlacedObjectTypeSO",menuName= "ScriptableObjects/PlacedObjectTypeSO")]

2、public Sprite sprite 仓库栏中的Image也可以配置在SO,这样更加合理。

[Serializable]
[CreateAssetMenu(fileName = "PlacedObjectTypeSO",menuName= "ScriptableObjects/PlacedObjectTypeSO")]
public class PlacedObjectTypeSO : ScriptableObject
{public GoodsName goodsName;public string nameString;public Transform prefab;public Sprite sprite;public int width;public int height;
}
CraftingRecipeSO.cs

这里检查工作台上是否集齐配方物体的逻辑:

  • 创建一个列表waitInPlaceObjectSOList,初始状态时包括所有配方物体;
  • 每当有物体放在工作台上时,检查是否是配方元素,如果是就从列表中移除对应物体。直到列表元素为0,表示已经集齐所有配方元素,输出合成的物体。
  • 成功合成的物体放回仓库栏,并清除工作台的所有物体,并恢复列表初始状态。

该逻辑只是暂时用在演示合成物体的部分,只能仅供参考,存在很多尚未考虑的内容,暂时不予解决,如:

如果两个配方存在重合的元素,如AB = A+B,ACB =A+B+C,那种A和B先放置在工作台上时,永远只能合成AB,无法合成ACB;

[CreateAssetMenu(fileName = "CraftingRecipeSO", menuName = "ScriptableObjects/CraftingRecipeSO")]
public class CraftingRecipeSO : ScriptableObject
{public PlacedObjectTypeSO outPlaceObjectSO;public PlacedObjectTypeSO[] recipeArray;private List<PlacedObjectTypeSO> waitInPlaceObjectSOList;public void Init(){waitInPlaceObjectSOList = new List<PlacedObjectTypeSO>();for (int i = 0; i < recipeArray.Length; i++){waitInPlaceObjectSOList.Add(recipeArray[i]);}}public PlacedObjectTypeSO GoodsOnTableChanged(PlacedObjectTypeSO inPlaceObjectSO){if (waitInPlaceObjectSOList == null|| waitInPlaceObjectSOList.Count==0) Init();if (waitInPlaceObjectSOList.Contains(inPlaceObjectSO)){waitInPlaceObjectSOList.Remove(inPlaceObjectSO);if (waitInPlaceObjectSOList.Count == 0){return outPlaceObjectSO;}}return null;}}
PlaceObjectBuilding.cs

大多数内容与前篇一致,需要完善工作台部分内容。
在这里插入图片描述

public class PlaceObjectBuilding : MonoBehaviour{[SerializeField] List<CraftingRecipeSO> craftingRecipeSOList;[SerializeField] Transform craftTable;private void Update(){if (selectedPlacedObjectTypeSO != null){if (Input.GetMouseButtonDown(0)){Vector3 placePosition = Mouse3D.GetMouseWorldPosition();placePosition.y = 0;Transform placeObjectTransform = Instantiate(selectedPlacedObjectTypeSO.prefab,placePosition,Quaternion.Euler(0, selectedPlacedObjectTypeSO.GetRotationAngle(dir), 0));//如果放在了工作台地板上,就将craftTable作为父物体if (Mouse3D.GetClickedTransform().parent.parent == craftTable.parent){placeObjectTransform.SetParent(craftTable);//放置的物体在所有配方中进行检查craftingRecipeSOList.ForEach(_ =>{PlacedObjectTypeSO outGoodsSo = _.GoodsOnTableChanged(selectedPlacedObjectTypeSO);//成功合成之后,清除工作台上的物品,恢复配方中的缓存列表,新物体放回仓库if (outGoodsSo != null){for (int i = 0; i < craftTable.childCount; i++){Destroy(craftTable.GetChild(i).gameObject);}craftingRecipeSOList.ForEach(recipeSo =>{recipeSo.Init();});inventory.AddGoods(outGoodsSo);};});}else if (Mouse3D.GetClickedTransform().parent == transform.parent){placeObjectTransform.SetParent(transform.parent);}DeselectObjectType();}}}
}

相关文章:

【Unity】ScriptableObject的应用:利用配方合成新物体

前一篇已经使用ScriptableObject(SO)类配置可放置物体&#xff0c;本篇探索更多的SO类应用场景。 需求分析 将若干指定物体放在工作台上&#xff0c;可以生成新的物体。 成果展示 Scene部分 准备工作台&#xff0c;放在工作台上的物体全部放在指定PlacedObjects空物体下。 …...

31DNS设置

每天五分钟学Linux | 第三十一课&#xff1a;DNS设置 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了如何配置Linux系统的IP地址。今天&#xff0c;我们将探讨如何设置DNS&#xff08;域名系统&#xff09;&#…...

使用Docker快速部署FastAPI Web应用

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行&#xff0c;镜像是容器的只读模板&#xff0c;容器是模板的一个实例。镜像是分层结…...

全面掌握Spring Boot异常处理:策略与实践

标题&#xff1a;全面掌握Spring Boot异常处理&#xff1a;策略与实践 引言 在Spring Boot应用开发中&#xff0c;异常处理是一个关键环节&#xff0c;它不仅关系到应用的稳定性&#xff0c;也直接影响用户体验。本文将详细介绍如何在Spring Boot中实现异常处理&#xff0c;包…...

【LeetCode】【算法】11. 盛最多水的容器

LeetCode 11. 盛水最多的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 思…...

ES6代理和反射新特性,详细讲解

代理与反射 es6新增了代理和反射特性&#xff0c;这两个特性为开发者提供了拦截并向基本操作嵌入额外行为的能力。 代理基础 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta charset"UTF-8"&g…...

vue计算属性 初步使用案例

<template><div><h1>购物车</h1><div v-for"item in filteredItems" :key"item.id"><p>{{ item.name }} - {{ item.price }} 元</p><input type"number" v-model.number"item.quantity"…...

大模型时代,呼叫中心部门如何建设一套呼出机器人系统?

大模型时代&#xff0c;呼叫中心部门如何建设一套呼出机器人系统&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 在大模型时代&#xff0c;呼叫中心部门建设一套呼出机器人系统需要综合考虑技…...

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样&#xff0c;苹果手机打开的时候是正常的&#xff0c;但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法&#xff0c;也在官方查看了map相关的文档&#xff0c;发现并没有给label设置zIndex的属性&#xff0c;只看到…...

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …...

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…...

C++中的动态断言和静态断言

C中包含动态断言&#xff08;assert&#xff09;和静态断言&#xff08;static_assert&#xff09;&#xff0c;下面分别分析各自的用法。 1.动态断言&#xff08;assert&#xff09; assert 是一个宏&#xff0c;在预处理阶段不生效&#xff0c;在运行阶段才起作用&#xff0…...

运算放大器的学习(一)输入阻抗

输入阻抗 最近需要对运算放大器进行学习&#xff0c;我们后面逐一对其参数进行了解。 首先了解下输入阻抗。 放大电路技术指标测试示意图&#xff1a; 输入电阻&#xff1a; 从放大电路的输入端看进去的等效电阻称为放大电路的输入电阻&#xff0c;如上图&#xff0c;此处考虑…...

Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作

文章目录 Rust 枚举之卧龙凤雏枚举的基本概念枚举定义示例 Result 枚举&#xff1a;凤雏Result 枚举的定义Result 的使用场景示例 1&#xff1a;文件读取示例 2&#xff1a;链式操作与错误处理 Option 枚举&#xff1a;卧龙Option 枚举的定义Option 的使用场景示例 1&#xff1…...

TCP/IP协议,TCP和UDP区别

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;是一组用于计算机网络中的通信协议&#xff0c;它为数据传输提供了标准框架&#xff0c;广泛用于互联网和局域网中。TCP/IP协议包括多个层次&#xff0c;每…...

【go从零单排】Timer、Epoch 时间函数

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;time.Timer 是一个用于在指定时间后执行操作的计时器。…...

壁仞科技上市前最后一波 校招 社招 内推

随着美国大选结束&#xff0c;国内GPU 产业得到空前的的发展空间&#xff0c;国内芯片相关股票一片飘红。 国内大型 GPU厂商壁仞科技&#xff0c;摩尔线程等正紧锣密鼓地加紧上市。 GPGPU 芯片赛道来到了史无前例的红利点&#xff0c;抓住机会&#x1f4aa; 壁仞科技正在火热…...

【微软报告:多模态基础模型】(2)视觉理解

欢迎关注【youcans的AGI学习笔记】原创作品 【微软报告&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软报告&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微软报告&#xff1a;多模态基础模型】&#xff08;3&#xff09;…...

Linux 驱动

四十三、Linux设备树 43.1 DTS、DTB 和 DTC DTS 是设备树源码文件 DTB 是将DTS 编译以后得到的二进制文件。 DTC 工具将.dts 编译为.dtb 43.2 DTS语法 43.2.1 .dtsi 头文件 在.dts 设备树文件中&#xff0c;可以通过“#include”来引用.h、.dtsi 和.dts 文件。 …...

【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组

考试要求 1、会用克拉默法则. 2、理解齐次线性方程组有非零解的充分必要条件及非齐次线性方程组有解的充分必要条件. 3、理解齐次线性方程组的基础解系及通解的概念,掌握齐次线性方程组基础解系和通解的求法. 4、理解非齐次线性方程组的解的结构及通解的概念. 5、会用初等行变…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...