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

【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)

详细程序逻辑过程

  1. 初始化物品栏

    • 在 Awake 方法中,通过标签找到提示框和信息面板。

    • 循环生成10个背包格子,并为每个格子设置图标和名称。

    • 为每个格子添加 UInterMaager232 脚本,以便处理交互事件。

  2. 关闭提示框和信息面板

    • 在 Start 方法中,如果提示框和信息面板在启动时是激活状态,则关闭它们。

  3. 鼠标滑入道具显示提示框

    • 在 OnPointerEnter 方法中,调用 MoveTip 方法将提示框移动到鼠标位置。

    • 如果提示框未激活,则激活它。

  4. 鼠标滑出道具关闭提示框

    • 在 OnPointerExit 方法中,如果提示框激活,则关闭它。

  5. 鼠标点击道具显示信息面板

    • 在 OnPointerClick 方法中,关闭提示框。

    • 切换信息面板的显示状态。

  6. 移动提示框到鼠标位置

    • 在 MoveTip 方法中,获取提示框的 RectTransform 组件。

    • 获取鼠标的屏幕坐标,并将其转换为画布坐标。

    • 计算提示框在鼠标右下角的偏移量,并设置提示框的位置。

通过以上步骤,我们实现了一个简单的背包系统,并详细讲解了每个步骤的逻辑过程。

  1. 初始化物品栏:在游戏启动时,自动生成一些初始物品。

  2. 拾取物体到背包:暂时不实现,但可以扩展。

  3. 鼠标放在道具上展示道具信息:当鼠标滑入道具时,显示道具的提示框。

  4. 鼠标点击道具,展示道具信息:当鼠标点击道具时,显示道具的详细信息面板。

我们将通过两个脚本来实现这些功能:InventoryManager 和 UInterMaager232

1. InventoryManager 脚本

InventoryManager 脚本负责初始化背包界面,并在游戏启动时生成一些初始物品。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;public class InventoryManager : MonoBehaviour
{// 背包格子的模板public GameObject GridMuban;// 背包格子的父对象public Transform GridParentTrans;// 道具的图标public Sprite[] oneIamge = new Sprite[10];// 道具的名称public string[] Name = new string[10];// 提示框和信息面板[SerializeField]public static GameObject OneTip;public static GameObject InfoRect;private void Awake(){// 通过标签找到提示框和信息面板OneTip = GameObject.FindGameObjectWithTag("OneTip");InfoRect = GameObject.FindGameObjectWithTag("InfoRect");// 初始化系统数据for (int i = 0; i < 10; i++){// 克隆一个背包格子GameObject TempCloneGrid = GameObject.Instantiate(GridMuban, GridParentTrans);// 修改道具的图标TempCloneGrid.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite = oneIamge[i];// 修改道具的名字TempCloneGrid.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text = Name[i];// 为克隆的格子添加交互管理脚本TempCloneGrid.AddComponent<UInterMaager232>();// 设置提示框的文本为当前道具的名称【下次更新】}}private void Start(){// 如果提示框和信息面板在启动时是激活状态,则关闭它们if (OneTip.activeSelf){OneTip.SetActive(false);}if (InfoRect.activeSelf){InfoRect.SetActive(false);}}
}

2. UInterMaager232 脚本

UInterMaager232 脚本负责处理道具的交互事件,包括鼠标滑入、点击和滑出事件。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;public class UInterMaager232 : MonoBehaviour, IPointerEnterHandler, IPointerClickHandler, IPointerExitHandler
{// 当鼠标点击道具时触发public void OnPointerClick(PointerEventData eventData){// 关闭提示框InventoryManager.OneTip.SetActive(false);Debug.Log("鼠标点击了");// 切换信息面板的显示状态if (InventoryManager.InfoRect.activeSelf){InventoryManager.InfoRect.SetActive(false);}else{InventoryManager.InfoRect.SetActive(true);}}// 当鼠标滑入道具时触发public void OnPointerEnter(PointerEventData eventData){Debug.Log("鼠标滑入了");// 移动提示框到鼠标位置MoveTip();// 如果提示框未激活,则激活它if (!InventoryManager.OneTip.activeSelf){InventoryManager.OneTip.SetActive(true);}}// 当鼠标滑出道具时触发public void OnPointerExit(PointerEventData eventData){// 如果提示框激活,则关闭它if (InventoryManager.OneTip.activeSelf){InventoryManager.OneTip.SetActive(false);}}// 移动提示框到鼠标位置void MoveTip(){// 获取提示框的RectTransformRectTransform TipObject = InventoryManager.OneTip.GetComponent<RectTransform>();// 获取鼠标在屏幕上的位置Vector3 mousePosition = Input.mousePosition;// 将屏幕坐标转换为画布坐标Vector2 canvasPosition;RectTransformUtility.ScreenPointToLocalPointInRectangle(TipObject.parent as RectTransform, // 使用父对象的RectTransformmousePosition,null, // 如果Canvas是Overlay模式,可以传nullout canvasPosition);// 计算对象在鼠标右下角的位置Vector2 offset = new Vector2(TipObject.rect.width / 2, -TipObject.rect.height / 2f); // 右下角偏移// 设置对象的位置TipObject.localPosition = canvasPosition + offset;}
}

详细解释

InventoryManager 脚本
  1. 变量声明

    • GridMuban:背包格子的模板。

    • GridParentTrans:背包格子的父对象。

    • oneIamge:道具的图标数组。

    • Name:道具的名称数组。

    • OneTip 和 InfoRect:提示框和信息面板的静态引用。

  2. Awake 方法

    • 通过标签找到提示框和信息面板。

    • 初始化背包界面,生成10个道具格子,并设置每个格子的图标和名称。

    • 为每个格子添加 UInterMaager232 脚本,以便处理交互事件。

  3. Start 方法

    • 如果提示框和信息面板在启动时是激活状态,则关闭它们。

UInterMaager232 脚本
  1. 接口实现

    • IPointerEnterHandler:处理鼠标滑入事件。

    • IPointerClickHandler:处理鼠标点击事件。

    • IPointerExitHandler:处理鼠标滑出事件。

  2. OnPointerClick 方法

    • 关闭提示框。

    • 切换信息面板的显示状态。

  3. OnPointerEnter 方法

    • 移动提示框到鼠标位置。

    • 如果提示框未激活,则激活它。

  4. OnPointerExit 方法

    • 如果提示框激活,则关闭它。

  5. MoveTip 方法

    • 获取提示框的 RectTransform

    • 获取鼠标在屏幕上的位置。

    • 将屏幕坐标转换为画布坐标。

    • 计算提示框在鼠标右下角的位置。

    • 设置提示框的位置。

总结

通过以上两个脚本,我们实现了一个简单的背包系统,包括初始化物品栏、鼠标滑入显示提示框、鼠标点击显示信息面板等功能。你可以根据需要进一步扩展这个系统,例如添加物品拾取、物品使用等功能。

使用本教程前先学习!

【UGUI】事件侦听EventSystem系统0学-CSDN博客文章浏览阅读1.4k次,点赞23次,收藏23次。实现它主要有三个核心组件:当谈论这些组件时,我们实际上是在谈论游戏中管理事件和交互的“守护神”。让我生动地为你解释一下这三个组件的作用:🖼️ **BaseRaycaster(图形光线投射器)**:它是一个基础的射线投射器,用于确定用户点击的目标对象。Unity提供了一些默认的射线投射器,比如PhysicsRaycaster(用于3D物体)、Physics2DRaycaster(用于2D物体)和GraphicRaycaster(用于UI元素)。如果你有特殊需求,也可以自定义你自己的射线投射器。_eventsystemhttps://blog.csdn.net/leoysq/article/details/134693945?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522E96802B4-FB66-43F2-9AC5-A9F757EFDC88%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=E96802B4-FB66-43F2-9AC5-A9F757EFDC88&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-11-134693945-null-null.nonecase&utm_term=UGUI&spm=1018.2226.3001.4450

http://www.lryc.cn/news/489202.html

相关文章:

  • ubuntu20.04中编译安装gcc 9.2.0
  • ss 命令的基本用法
  • Leetcode198. 打家劫舍(HOT100)
  • kafka基础
  • STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
  • Python设计模式详解之2 —— 工厂模式
  • 【Zookeeper】二、主从应用(master-worker架构)
  • Diffusion【2】:VAE
  • 高级java每日一道面试题-2024年11月19日-基本篇-获取一个类Class对象的方式有哪些?
  • xilinx xapp1171学习笔记
  • 一次需升级系统的wxpython安装(macOS M1)
  • el-table 数据去重后合并表尾合计行,金额千分位分割并保留两位小数,表尾合计行表格合并
  • Springboot整合mybatis-plus使用pageHelper进行分页
  • 【Xbim+C#】创建拉伸的墙
  • 【阅读记录-章节3】Build a Large Language Model (From Scratch)
  • three.js 对 模型使用 视频进行贴图修改材质
  • MySQL - 数据库基础 | 数据库操作 | 表操作
  • maven父子项目
  • NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标
  • MyBatis——#{} 和 ${} 的区别和动态 SQL
  • 解决sql字符串
  • 深度解析:Android APP集成与拉起微信小程序开发全攻略
  • Leetcode 被围绕的区域
  • ssm框架-spring-spring声明式事务
  • React第五节 组件三大属性之 props 用法详解
  • 测评部署和管理 WordPress 最方便的面板
  • 【系统分析师】-2024年11月论文-论DevOps开发
  • 算法【子数组最大累加和问题与扩展】
  • 小程序23-页面的跳转:navigation 组件详解
  • AI社媒引流工具:解锁智能化营销的新未来