Unity3D仿星露谷物语开发16之角色拾取道具

1、目标

当角色经过道具时会拾取道具放到库存列表中,此时道具消失并打印库存信息。

2、创建新的Enum

在Assets -> Scripts -> Enums -> Enum.cs中添加库存位置相关的信息。

public enum InventoryLocation
{player, // 在角色手中chest, // 在箱子里count // 枚举位置的计数, 值为2,只要把count放在最后一位,自动进行了计数
}

最后一个枚举值为count,此时count值自动为枚举个数值。

此时Enum.cs完整代码如下:

public enum ToolEffect
{none, watering
}public enum Direction
{up,down,left,right,none
}public enum ItemType
{Seed,  // 种子Commodity, // 商品Watering_tool, // 浇水工具Hoeing_tool, // 锄头Chopping_tool, // 砍伐工具Breaking_tool, // 破碎工具Reaping_tool, // 收割工具Collecting_tool, // 收集工具Reapable_scenary, // 可达到场景Furniture, // 家具none,count // 计数,记录列表中东西的个数
}public enum InventoryLocation
{player, // 在角色手中chest, // 在箱子里count // 枚举位置的计数, 值为2,只要把count放在最后一位,自动进行了计数
}

3、创建InventoryItem脚本

在Assets -> Scripts -> Inventory下创建InventoryItem.cs脚本。

它是一个struct结构体,记录每个item的code以及数量。

[System.Serializable]
public struct InventoryItem 
{public int itemCode;public int itemQuantity;
}

4、增加Settings中配置项

// Inventory
public static int playerInitialInventoryCapacity = 24;
public static int playerMaximumInventoryCapacity = 48;

此时Settings.cs完整代码为:

using UnityEngine;public static class Settings
{// Obscuring Item Faderpublic const float fadeInSeconds = 0.25f;public const float fadeOutSeconds = 0.35f;public const float targetAlpha = 0.45f;// Player Movementpublic const float runningSpeed = 5.333f;public const float walkingSpeed = 2.666f;// Inventorypublic static int playerInitialInventoryCapacity = 24;public static int playerMaximumInventoryCapacity = 48;// Player Animation Parameterspublic static int xInput;public static int yInput;public static int isWalking;public static int isRunning;public static int toolEffect;public static int isUsingToolRight;public static int isUsingToolLeft;public static int isUsingToolUp;public static int isUsingToolDown;public static int isLiftingToolRight;public static int isLiftingToolLeft;public static int isLiftingToolUp;public static int isLiftingToolDown;public static int isSwingingToolRight;public static int isSwingingToolLeft;public static int isSwingingToolUp;public static int isSwingingToolDown;public static int isPickingRight;public static int isPickingLeft;public static int isPickingUp;public static int isPickingDown;// Shared Animation Parameterspublic static int idleUp;public static int idleDown;public static int idleLeft;public static int idleRight;// static constructorstatic Settings(){xInput = Animator.StringToHash("xInput");yInput = Animator.StringToHash("yInput");isWalking = Animator.StringToHash("isWalking");isRunning = Animator.StringToHash("isRunning");toolEffect = Animator.StringToHash("toolEffect");isUsingToolRight = Animator.StringToHash("isUsingToolRight");isUsingToolLeft = Animator.StringToHash("isUsingToolLeft");isUsingToolUp = Animator.StringToHash("isUsingToolUp");isUsingToolDown = Animator.StringToHash("isUsingToolDown");isLiftingToolRight = Animator.StringToHash("isLiftingToolRight");isLiftingToolLeft = Animator.StringToHash("isLiftingToolLeft");isLiftingToolUp = Animator.StringToHash("isLiftingToolUp");isLiftingToolDown = Animator.StringToHash("isLiftingToolDown");isSwingingToolRight = Animator.StringToHash("isSwingingToolRight");isSwingingToolLeft = Animator.StringToHash("isSwingingToolLeft");isSwingingToolUp = Animator.StringToHash("isSwingingToolUp");isSwingingToolDown = Animator.StringToHash("isSwingingToolDown");isPickingRight = Animator.StringToHash("isPickingRight");isPickingLeft = Animator.StringToHash("isPickingLeft");isPickingUp = Animator.StringToHash("isPickingUp");isPickingDown = Animator.StringToHash("isPickingDown");idleUp = Animator.StringToHash("idleUp");idleDown = Animator.StringToHash("idleDown");idleLeft = Animator.StringToHash("idleLeft");idleRight = Animator.StringToHash("idleRight");}}

5、创建库存变更事件

在Assets -> Scripts -> Events -> EventHandler.cs中,添加库存变更事件。

 // Inventory Updated Eventpublic static event Action<InventoryLocation, List<InventoryItem>> InventoryUpdatedEvent;public static void CallInventoryUpdatedEvent(InventoryLocation inventoryLocation, List<InventoryItem> inventoryList){if(InventoryUpdatedEvent != null) // 有订阅者{InventoryUpdatedEvent(inventoryLocation, inventoryList);}}

此时EventHandler.cs完整代码如下:

using System;
using System.Collections.Generic;public delegate void MovementDelegate(float inputX, float inputY, bool isWalking, bool isRunning, bool isIdle, bool isCarrying, ToolEffect toolEffect, bool isUsingToolRight, bool isUsingToolLeft, bool isUsingToolUp, bool isUsingToolDown, bool isLiftingToolRight, bool isLiftingToolLeft, bool isLiftingToolUp, bool isLiftingToolDown, bool isPickingRight, bool isPickingLeft, bool isPickingUp, bool isPickingDown, bool isSwingToolRight, bool isSwingToolLeft, bool isSwingToolUp, bool isSwingToolDown, bool idleUp, bool idleDown, bool idleLeft, bool idleRight);public static class EventHandler
{// Inventory Updated Eventpublic static event Action<InventoryLocation, List<InventoryItem>> InventoryUpdatedEvent;public static void CallInventoryUpdatedEvent(InventoryLocation inventoryLocation, List<InventoryItem> inventoryList){if(InventoryUpdatedEvent != null) // 有订阅者{InventoryUpdatedEvent(inventoryLocation, inventoryList);}}// Movement Eventpublic static event MovementDelegate MovementEvent;// Movement Event Call For Publisherspublic static void CallMovementEvent(float inputX, float inputY, bool isWalking, bool isRunning, bool isIdle, bool isCarrying,ToolEffect toolEffect,bool isUsingToolRight, bool isUsingToolLeft, bool isUsingToolUp, bool isUsingToolDown,bool isLiftingToolRight, bool isLiftingToolLeft, bool isLiftingToolUp, bool isLiftingToolDown,bool isPickingRight, bool isPickingLeft, bool isPickingUp, bool isPickingDown,bool isSwingToolRight, bool isSwingToolLeft, bool isSwingToolUp, bool isSwingToolDown,bool idleUp, bool idleDown, bool idleLeft, bool idleRight){if (MovementEvent != null){MovementEvent(inputX, inputY, isWalking, isRunning, isIdle, isCarrying,toolEffect,isUsingToolRight, isUsingToolLeft, isUsingToolUp, isUsingToolDown,isLiftingToolRight, isLiftingToolLeft, isLiftingToolUp, isLiftingToolDown,isPickingRight, isPickingLeft, isPickingUp, isPickingDown,isSwingToolRight, isSwingToolLeft, isSwingToolUp, isSwingToolDown,idleUp, idleDown, idleLeft, idleRight);}}}

6、更新库存管理类

在Assets -> Scritpts -> Inventory -> InventoryManager.cs中。

首先,创建两个变量inventoryLists和inventoryListCapacityIntArray,前面记录了每个位置(比如玩家身上的,玩家箱子里的等等)的库存情况,后面记录了每个位置库存的item数量。

然后,在Awake中通过CreateInventoryLists初始化inventoryLists和inventoryListCapacityIntArray值。

接着,创建添加Item的方法AddItem(InventoryLocation inventoryLocation, Item item),即在哪个位置放什么Item。需要先搜索一遍该位置的库存,检查下是否已经存在,存在则返回库存清单的索引值。然后在哪个索引对应的InventoryItem更新下库存数。如果找不到这个item,那么直接在位置对应的库存清单末尾增加这个InventoryItem。

最后,再创建AddItem重载方法 AddItem(InventoryLocation inventoryLocation, Item item, GameObject gameObjectToDelete)。这个对应的逻辑就是:当角色拾取某个道具时,需要更新下对应的库存,同时将这个道具删除下。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class InventoryManager : SingletonMonobehaviour<InventoryManager>
{private Dictionary<int, ItemDetails> itemDetailsDictionary;public List<InventoryItem>[] inventoryLists; // 每个位置的库存清单// 每个位置的库存数。 The index of the array is the inventory list(from the// InventoryLocation enum), and the value is the capacity of that inventory list[HideInInspector] public int[] inventoryListCapacityIntArray; [SerializeField] private SO_ItemList itemList = null;protected override void Awake(){base.Awake();// Create Inventory listsCreateInventoryLists();// Create item details dictionaryCreateItemDetailsDictionary();}private void CreateInventoryLists(){inventoryLists = new List<InventoryItem>[(int)InventoryLocation.count];for (int i = 0; i < (int)InventoryLocation.count; i++){inventoryLists[i] = new List<InventoryItem>();}// initialize inventory list capacity arrayinventoryListCapacityIntArray = new int[(int)InventoryLocation.count];// initialize player inventory list capacityinventoryListCapacityIntArray[(int)InventoryLocation.player] = Settings.playerInitialInventoryCapacity;}/// <summary>/// Populates the itemDetailsDictionary from the scriptable object items list/// </summary>private void CreateItemDetailsDictionary(){itemDetailsDictionary = new Dictionary<int, ItemDetails>();foreach (ItemDetails itemDetails in itemList.itemDetails) {itemDetailsDictionary.Add(itemDetails.itemCode, itemDetails);}}/// <summary>/// Add an item to the inventory list for the inventoryLocation and then destroy the gameObjectToDelete/// 角色拾取到物品后,物品需要消失掉/// </summary>/// <param name="inventoryLocation"></param>/// <param name="item"></param>/// <param name="gameObjectToDelete"></param>public void AddItem(InventoryLocation inventoryLocation, Item item, GameObject gameObjectToDelete){AddItem(inventoryLocation, item);Destroy(gameObjectToDelete);}/// <summary>/// Add an item to the inventory list for the inventoryLocation/// </summary>/// <param name="inventoryLocation"></param>/// <param name="item"></param>public void AddItem(InventoryLocation inventoryLocation, Item item){int itemCode = item.ItemCode;List<InventoryItem> inventoryList = inventoryLists[(int)inventoryLocation];// Check if inventory already contains the itemint itemPosition = FindItemInInventory(inventoryLocation, itemCode);if(itemPosition != -1){AddItemPosition(inventoryList, itemCode, itemPosition);}else{AddItemPosition(inventoryList, itemCode);}// Send event that inventory has been updatedEventHandler.CallInventoryUpdatedEvent(inventoryLocation, inventoryLists[(int)inventoryLocation]);  }/// <summary>/// Add item to position in the inventory/// </summary>/// <param name="inventoryList"></param>/// <param name="itemCode"></param>/// <param name="position"></param>/// <exception cref="NotImplementedException"></exception>private void AddItemPosition(List<InventoryItem> inventoryList, int itemCode, int position){InventoryItem inventoryItem = new InventoryItem();int quantity = inventoryList[position].itemQuantity + 1;inventoryItem.itemQuantity = quantity;inventoryItem.itemCode = itemCode;inventoryList[position] = inventoryItem;Debug.ClearDeveloperConsole();DebugPrintInventoryList(inventoryList);}private void DebugPrintInventoryList(List<InventoryItem> inventoryList){foreach(InventoryItem inventoryItem in inventoryList){Debug.Log("Item Description:" + InventoryManager.Instance.GetItemDetails(inventoryItem.itemCode).itemDescription + "    Item Quantity:" + inventoryItem.itemQuantity);}Debug.Log("*******************************************************************************");}/// <summary>/// Add item to the end of the inventory /// </summary>/// <param name="inventoryList"></param>/// <param name="itemCode"></param>/// <exception cref="NotImplementedException"></exception>private void AddItemPosition(List<InventoryItem> inventoryList, int itemCode){InventoryItem inventoryItem = new InventoryItem(); inventoryItem.itemCode = itemCode;inventoryItem.itemQuantity = 1;inventoryList.Add(inventoryItem);DebugPrintInventoryList(inventoryList);}/// <summary>/// Find if an itemCode is already in the inventory. Returns the item position/// in the inventory list, or -1 if the item is not in the inventory/// </summary>/// <param name="inventoryLocation"></param>/// <param name="itemCode"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>private int FindItemInInventory(InventoryLocation inventoryLocation, int itemCode){List<InventoryItem> inventoryList = inventoryLists[(int)inventoryLocation];for (int i = 0; i < inventoryList.Count; i++){if(inventoryList[i].itemCode == itemCode){return i;}}return -1;}/// <summary>/// Returns the itemDetails (from the SO_ItemList) for the itemCode, or null if the item doesn't exist/// </summary>/// <param name="itemCode"></param>/// <returns></returns>public ItemDetails GetItemDetails(int itemCode) {ItemDetails itemDetails;if(itemDetailsDictionary.TryGetValue(itemCode, out itemDetails)){return itemDetails;}else{return null;}}
}

该代码目前还有个遗憾:库存更新事件还没有被订阅,这个后续再进一步处理。

7、更新ItemPickup脚本

之前的代码时,用户经过道具时可以感知到,会打印道具的名称。

现在是:用户经过道具时,道具消失,同时用户库存清单的值被更新。

新增如下代码:

// If item can be picked up
if(itemDetails.canBePickedUp == true)
{// Add item to inventoryInventoryManager.Instance.AddItem(InventoryLocation.player, item, collision.gameObject);
}

此时ItemPickup.cs完整代码是:

using UnityEngine;public class ItemPickup : MonoBehaviour
{private void OnTriggerEnter2D(Collider2D collision){Item item = collision.GetComponent<Item>();if(item != null){// Get item detailsItemDetails itemDetails = InventoryManager.Instance.GetItemDetails(item.ItemCode);// If item can be picked upif(itemDetails.canBePickedUp == true){// Add item to inventoryInventoryManager.Instance.AddItem(InventoryLocation.player, item, collision.gameObject);}}}
}

效果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4_用户控件_3_用户控件输入数据的方法

祝愿大美兰陵越来越好&#xff01; 一、效果展示&#xff1a; 二、先制作一个角色 1、新建个父类为pawn的蓝图类。更名为BP_Image_Character。 2、这个角色只是用于观察场景&#xff0c;并与场景中的物体相碰撞用的&#xff0c;所以不需要骨骼网格体&#xff0c; 3、但是我们…

文献阅读 | B. S. Carmo 2010

目录 一、文献名称二、原文地址三、ABSTRACT主要发现详细观察分岔分析雷诺数依赖性比较见解意义结论 四、IINTRODUCTION历史研究回顾计算研究近期研究进展研究空白与目的论文结构 一、文献名称 二、原文地址 研究目的&#xff1a;研究串列排列双圆柱体周围流场中的次级不稳定性…

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…

如何安装适配pytorch版本的torchvision

一、对照版本 版本对照pytorch/vision: Datasets, Transforms and Models specific to Computer Vision 二、下载对应版本的torchvision 下载连接1download.pytorch.org/whl/torch_stable.html 下载连接2download.pytorch.org/whl/cu110/torch_stable.html 笔者认为1会比2更…

Leetcode打卡:我的日程安排表III

执行结果&#xff1a;通过 题目 732 我的日程安排表 III 当 k 个日程存在一些非空交集时&#xff08;即, k 个日程包含了一些相同时间&#xff09;&#xff0c;就会产生 k 次预订。 给你一些日程安排 [startTime, endTime) &#xff0c;请你在每个日程安排添加后&#xff0c;…

TI毫米波雷达原始数据解析之Lane数据交换

TI毫米波雷达原始数据解析之Lane数据交换 背景Lane 定义Lane 确认确认LVDS Lane 数量的Matlab 代码数据格式参考 背景 解析使用mmWave Studio 抓取的ADC Data Lane 定义 芯片与DCA100之间的数据使用LVDS接口传输&#xff0c;使用mmWave Studio 配置过程中有一个选项是LVDS L…

redis7基础篇3 redis的集群模式3

一 集群模式 1.1 redis的集群模式 Redis集群模式&#xff0c;实现数据集在多个节点进行共享&#xff0c;支持多个master节点。 Redis集群支持多个master&#xff0c;每个master节点又可以挂载多个slave&#xff1b;由于cluster自带sentinel的故障转移机制&#xff0c;内置高…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

部署项目添加工程名的步骤

1.首先要在router下进行工程名添加 2.其次在vue.config.js中添加publicpath 3.在nginx配置文件中 location /my-app/ {try_files $uri $uri/ /my-app/index.html; }

SCAU期末笔记 - 数据库系统概念往年试卷解析

数据库搞得人一头雾水&#xff0c;题型太多太杂&#xff0c;已经准备摆烂了。就刷刷往年试卷&#xff0c;挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项&#xff1f; 画个文氏图秒了 所以选A. R ∩ S R − ( R − S ) R∩SR-(R-S) R∩…

【竞技宝】CS2:HLTV 2024 TOP11-w0nderful

北京时间2025年1月4日&#xff0c;HLTV年度选手排名正在持续公布中&#xff0c;今日凌晨正式公布了今年的TOP11为NAVI战队的w0nderful。 选手简介 w0nderful是一名来自于乌克兰的CS选手&#xff0c;现年20岁&#xff0c;目前在比赛中司职狙击手。w0nderful于2020年开启了自己的…

基层医联体医院患者历史检验检查数据的快速Python编程分析

​​​​​​​ 一、引言 1.1 研究背景与意义 在当今数字化医疗时代,医疗数据呈爆炸式增长,涵盖患者的基本信息、病史、检验检查结果、治疗方案等各个维度。这些海量且复杂的数据蕴含着巨大价值,为精准医疗决策提供了关键依据。通过对患者历史检验检查数据的深入对比分析…

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…

AWS 申请证书、配置load balancer、配置域名

申请AWS证书 点击 request 申请完证书&#xff0c;AWS 会验证你对于域名的所有权&#xff0c;有两种方式&#xff0c;DSN 验证和邮箱验证。 这里说一下DSN 验证&#xff0c;上图中 Domains 中有CNAME name 和 CNAME value 。 在domain 网站中添加一个CNAME DSN 项&#xff0c;…

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇

一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…

RIP配置实验

RIP配置实验 案例简介 天一公司下属三个分公司&#xff0c;属于不同的地区&#xff0c;三个公司之间用路由器连接&#xff0c;路由器名称分别为分别为 Router0、Router1、Router2&#xff0c;请把一公司的部门pc0,通过二公司路由器&#xff0c;连接三公司的部门pc1,公司之间通…

从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)

此文为系列文章&#xff0c;此系列主要讲解RTSP客户端的拉流及播放&#xff0c;文章持续更新&#xff0c;会从rtsp的基本协议讲起&#xff0c;如何一步步实现音视频的拉流过程&#xff0c;包括一系列涉及到的协议&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

大数据系列之:深入理解学习使用腾讯COS和COS Ranger权限体系解决方案,从hdfs同步数据到cos

大数据系列之&#xff1a;深入理解学习使用腾讯COS和COS Ranger权限体系解决方案&#xff0c;从hdfs同步数据到cos 对象存储COS对象存储基本概念COS Ranger权限体系解决方案部署组件COS Ranger Plugin部署COS-Ranger-Service部署COS Ranger Client部署 COSN 从hdfs同步数据到co…

docker Error response from daemon

问题 Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": read tcp 192.168.50.233:54354->54.198.86.24:443: read: connection reset by peer Unable to find image redis:latest locally docker: Error response from d…

域上的多项式环,整除,相通,互质

例1.已知 (R,,x)为域&#xff0c;请选出正确的说法:(A)(R,,x)也是整区; ABCD (B)R中无零因子; C)R在x运算上满足第一、二、三指数律; (D)R只有平凡理想; (E)R只有平凡子环。 域的特征&#xff1a; 域中&#xff0c;非0元素的加法周期 思考、在模7整数环R,中&#xff0c;…