【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();
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

TofuAI处理BT1120时序视频要求

时序要求 BT.1120视频用于1920x108030Hz数字视频输入。具体时序必须严格按照说明。BT.1120输入电平为1.8V。 BT1120数字视频采用YCbCr彩色格式输出&#xff0c;串行数据位宽为16bit&#xff0c;亮度在 高8bit&#xff0c;色度在低8bit&#xff0c;亮度和色度在同一个时钟周期输…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合&#xff0c;模版用来定义骨架&#xff0c;策略用来实现细节。 模版模式 策略模式 与模版模式特别像&#xff0c;模版模式会定义好步骤定义好框架&#xff0c;策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

Vue3打包自动生成版本JSON文件,添加系统版本检查,实现系统自动更新提示

实现该功能一共有三步。废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 第一步&#xff1a;打包时自动生成版本信息的js文件&#xff0c;versionUpdate.js import fs from fs; import path from path; import { ElMessageBox } from element-plus; i…

华为云前台展示公网访问需要购买EIP,EIP流量走向

华为云前台网络&#xff08;VPC,安全组&#xff0c;EIP&#xff09; 1.EIP网段是从哪里划分的&#xff1f; 管理员在后台Service_OM已设置 Service_OM-网络资源-外部网络-创建外部网络基本信息&#xff1a;配置参数&#xff1a;*名称 public*网络类型 LOCAL 不带标签 类似开…

[Mysql基础] 表的操作

一、创建表 1.1 语法 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集…

ASP.NET MVC宠物商城系统

该系统采用B/S架构&#xff0c;使用C#编程语言进行开发&#xff0c;以ASP.NET MVC框架为基础&#xff0c;以Visual Studio 2019为开发工具&#xff0c;数据库采用SQL Server进行保存数据。系统主要功能包括登录注册、宠物展示、个人中心、我的订单、购物车、用户管理、宠物类别…

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…

Tofu AI视频处理模块视频输入配置方法

应用Tofu产品对网络视频进行获取做视频处理时&#xff0c;首先需要配置Tofu产品的硬件连接关系与设备IP地址、视频拉流地址。 步骤1 Tofu设备点对点直连或者通过交换机连接到电脑&#xff0c;电脑IP配置到与Tofu默认IP地址同一个网段。 打开软件 点击右上角系统设置 单击左侧…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。 例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该…

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

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

【测试框架篇】单元测试框架pytest(1):环境安装和配置

一、pytest简介 Pytest是Python的一种单元测试框架&#xff0c;与Python自带的unittest测试框架类似&#xff0c;但是比 unittest框架使用起来更简洁&#xff0c;效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点&#xff1a; 非常容易…

蓝桥杯竞赛单片机组备赛【经验帖】

本人获奖情况说明 笔者本人曾参加过两次蓝桥杯电子赛&#xff0c;在第十二届蓝桥杯大赛单片机设计与开发组获得省级一等奖和国家级二等奖&#xff0c;在第十五届嵌入式设计开发组获得省级二等奖。如果跟着本帖的流程备赛&#xff0c;只要认真勤奋&#xff0c;拿个省二绝对没问…

力扣 LeetCode 541. 反转字符串II(Day4:字符串)

解题思路&#xff1a; i可以成段成段的跳&#xff0c;而不是简单的i class Solution {public String reverseStr(String s, int k) {char[] ch s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i 0; i < ch.length; i 2 * k) {// 2. 剩余字符小于 …

密码学知识点整理二:常见的加密算法

常用的加密算法包括对称加密算法、非对称加密算法和散列算法。 对称加密算法 AES&#xff1a;高级加密标准&#xff0c;是目前使用最广泛的对称加密算法之一&#xff0c;支持多种密钥长度&#xff08;128位、192位、256位&#xff09;&#xff0c;安全性高&#xff0c;加密效率…

css:修改盒子样式

圆角边框 在css3中新增了圆角边框样式&#xff0c;这样我们的盒子就可以长得奇形怪状了 像csdn上的发布就是圆角边框 还有这些 .x,.y {background-color: cornflowerblue;width: 200px;height: 200px;margin: 0 auto;text-align: center;border-radius: 10px;} 10px是什么意思…

连续九届EI稳定|江苏科技大学主办

【九届EI检索稳定|江苏科技大学主办 | IEEE出版 】 &#x1f388;【截稿倒计时】&#xff01;&#xff01;&#xff01; ✨徐秘书&#xff1a;gsra_huang ✨往届均已检索&#xff0c;已上线IEEE官网 &#x1f38a;第九届清洁能源与发电技术国际学术会议&#xff08;CEPGT 2…

机器学习 - 为 Jupyter Notebook 安装新的 Kernel

https://ipython.readthedocs.io/en/latest/install/kernel_install.html 当使用jupyter-notebook --no-browser 启动一个 notebook 时&#xff0c;默认使用了该 jupyter module 所在的 Python 环境作为 kernel&#xff0c;比如 C:\devel\Python\Python311。 如果&#xff0c…