Unity 3D期末大作业--背包系统

2023-11-04

Unity游戏背包系统的实现

一、项目概述

1. 功能描述

该部分主要实现了游戏中玩家在个人背包和游戏角色之间切换装备,能够从背包中将装备装到游戏角色上也能够将游戏角色的装备卸下放入背包。

卸下装备放入背包
卸下装备放入背包
将背包中装备赋给游戏角色
背包中装备赋给游戏角色

2. 实现思路

本功能无需3D效果,只需要在UI上进行涉及即可,因此主要涉及知识为Unity UI组件的使用以及C#基础编程。

主要文件结构如下:
在这里插入图片描述

背包、装备栏物品切换的实现 :在背包和装备栏上每个存放物品的格子设置一个空对象,并给他们添加Image组件,通过挂载编辑好的脚本可以实现Image上Sprite的改变,从而实现每个物品格子显示空内容还是某个装备。
例如这是背包中第一个装备格子的属性:
在这里插入图片描述
装备栏格子同上(脚本不同)。

装备在状态栏和背包之外的移动
为了实现这个效果,可以效仿前面的思路,设置一个空对象,有Image组件,当装备从状态栏/背包中脱离但还没放置到背包/状态栏上时,该空对象的Image则显示刚刚脱离装备格子的装备,其他时间该空对象不显示。且该对象随着鼠标移动。
在这里插入图片描述

二、项目实现

1. 背包装备格子的处理:

由于给装备格子添加了Button组件,只需要在挂载的脚本中实现按钮点击事件的处理即可。
该事件处理主要考虑两个因素:1.被点击的装备格子是空格子还是有装备的 2.此时是否还有装备从状态栏/背包中卸下但还是放置到某个格子里


using System.Collections;
using System.Collections.Generic;
using MyGameManager;
using UnityEngine;
using UnityEngine.UI;

public class bag : MonoBehaviour
{

    private MyGameSceneManager gsm;
    private Image bag_image;
    public int cli_type;
    public Sprite attack;
    public Sprite deffence;
    public Sprite move;
    public Sprite UIMask;

    void Awake()
    {
        gsm = MyGameSceneManager.GetInstance();
        bag_image = GetComponent<Image>();
    }

    public void On_bag_Button()
    {
        Debug.Log("in bag clicked .....");
        Debug.Log(cli_type);
        Debug.Log(bag_image.sprite);
        int clickType = gsm.GetClicked().GetClickType();
        if (bag_image.sprite != UIMask && clickType == 0)
        {
            Debug.Log(cli_type);

            bag_image.sprite = UIMask;
            gsm.GetClicked().SetClickType(cli_type);
            cli_type = 0;
        }
        else if (bag_image.sprite == UIMask)
        {
            if (clickType == 1)
                bag_image.sprite = attack;
            else if (clickType == 2)
                bag_image.sprite = deffence;
            else if (clickType == 3)
                bag_image.sprite = move;
            cli_type = clickType;
            gsm.GetClicked().SetClickType(0);
        }
    }

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

2. 状态栏装备格子的处理

考虑与背包格子相同的因素即可。
另外,状态栏的三个格子对应不同类型的装备,每个格子只能装备对应类别的装备。



using System.Collections;
using System.Collections.Generic;
using MyGameManager;
using UnityEngine;
using UnityEngine.UI;

public class left : MonoBehaviour
{

    private MyGameSceneManager gsm;
    private Image left_img;
    public int click_type;
    public Sprite zhuangbei;
    public Sprite UIMask;
    

    void Awake()
    {
        gsm = MyGameSceneManager.GetInstance();
        left_img = GetComponent<Image>();
    }

    public void On_left_Button()
    {
        Debug.Log("in left clicked .....");
        int clickType = gsm.GetClicked().GetClickType();
        if (left_img.sprite == zhuangbei && clickType == 0)
        {
            Debug.Log("equip: " + click_type);
            left_img.sprite = UIMask;
            gsm.GetClicked().SetClickType(click_type);
        }
        else if (left_img.sprite == UIMask)
        {
            if (clickType == click_type)
            {
                left_img.sprite = zhuangbei;
                gsm.GetClicked().SetClickType(0);
            }
        }
    }

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

3.卸下的装备随鼠标移动

装备随鼠标移动需要在空对象挂载的脚本中使用 Update()函数。不断判断当前是否有装备从格子中卸下,根据状态修改空对象的Iamge组件。


using System.Collections;
using System.Collections.Generic;
using MyGameManager;
using UnityEngine;
using UnityEngine.UI;

public class clickedImage : MonoBehaviour
{

    private MyGameSceneManager gsm;
    private Image click_image;
  
    private int click_type = 0;
    public Sprite basep;
    public Sprite attack;
    public Sprite jinghua;
    public Sprite deffence;
    public Sprite move;
    public Color None;
    public Color NotNone;
    public Camera cam;


    void Awake()
    {
        gsm = MyGameSceneManager.GetInstance();
        gsm.SetMouse(this);
        click_image = GetComponent<Image>();
    }

    public int GetClickType()
    {
        return click_type;
    }

    public void SetClickType(int cli_type)
    {
        click_type = cli_type;
    }


    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("strat click_type:  ");
        Debug.Log(click_type);
        Debug.Log(transform.position.x);
        Debug.Log(transform.position.y);
        Debug.Log(transform.position.z);
        if (click_type == 0)
        {
            
            click_image.sprite = basep;
            // click_image.color = None;
        }
        else
        {
            // click_image.color = NotNone;
            if (click_type == 1)
                click_image.sprite = attack;
            else if (click_type == 2)
                click_image.sprite = deffence;
            else if (click_type == 3)
                click_image.sprite = move;
            
            Vector3 screenP =Camera.main.WorldToScreenPoint(transform.position);
            Vector3 mp = Input.mousePosition;
            mp.z=screenP.z;
            // Vector3 mmp = cam.ScreenToWorldPoint(mp);
            // transform.position = new Vector3(mp.x - 450, mp.y - 200, 0);
            transform.position = Camera.main.ScreenToWorldPoint(mp);
            // transform.position = mp+new Vector3(-370,-140,0);
            Debug.Log("mp: " + mp);

            // Debug.Log("mmp: " + mmp);
            Debug.Log("position: "+transform.position);
            Debug.Log(Camera.main.ScreenToWorldPoint(mp));

        }

    }
}

4. GameManager类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ActionManager : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

namespace MyGameManager
{

    public class MyGameSceneManager : System.Object
    {
        private static MyGameSceneManager _game_scene_manager;
        private static clickedImage _Clicked;

        public static MyGameSceneManager GetInstance()
        {
            if (_game_scene_manager == null)
            {
                _game_scene_manager = new MyGameSceneManager();
            }
            return _game_scene_manager;
        }

        public void SetMouse(clickedImage _clicked)
        {
            if (_Clicked == null)
            {
                _Clicked = _clicked;
            }
        }

        public clickedImage GetClicked()
        {
            return _Clicked;
        }
    }

}

三、效果展示

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

相关连接:

Github:/termHomework

bilibili 视频展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 3D期末大作业--背包系统 的相关文章

  • 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

    所以我有一个正在旋转然后再次平移和旋转的对象 我将这些翻译的矩阵存储为对象成员 现在 当我进行对象拾取时 我需要知道该对象的 3D 世界坐标 目前我已经能够像这样获得物体的位置 coords 0 finalMatrix 12 坐标 1 最终
  • 使用相机将 3D 透视投影到 2D 屏幕上的基本渲染(无需 opengl)

    假设我有一个如下的数据结构 Camera double x y z ideally the camera angle is positioned to aim at the 0 0 0 point double angleX angleY
  • 使用 glFrustum 进行离轴投影

    我正在尝试使用 OpenGL 对场景进行离轴投影 并且我阅读了该文档罗伯特 库伊马的离轴投影 http csc lsu edu kooima pdfs gen perspective pdf现在对实际需要做什么有了更好的了解 但仍然有一些部
  • 给定表面法线,找到 3D 平面的旋转

    所以我有一个由 2 个向量描述的 3D 平面 P 位于平面上的点N 平面的表面法线 我有一个非常大的扁平方形多边形 我想渲染它来代表这个平面 我可以轻松地将多边形平移到给定点 但随后我需要找到适当的旋转来应用以使表面法线实际上成为表面法线
  • 如何在 OpenGL 中创建廉价的阴影? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有两个模型 A 和 B 以及一个灯 L 我希望模型 A 在模型 B 上投射阴影 我暂时不想考虑阴影体
  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • 如何计算逆运动学[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想知道如何使用逆运动学计算旋转角度 我计划将其用于实时 3D 动画 有人知道一些详细介绍具体解决方案的好文献吗 以下资源调查了逆运动学问题的一些流行
  • 如何在Android中渲染OBJ或FBX? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个 obj 和 fbx 格式的 3D 对象 其中包含 mtl 和纹理文件 我想知道哪个是在 An
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • 如何知道一个点是否在复杂的 3D 形状内(.ply 文件)

    我正在研究一个Java女巫项目真是要了我的命 经过几天在不同论坛上的研究 寻找我真正需要的东西 我来寻求你的帮助 我的数据 ply 文件 包含由许多三角形组成的 3D 形状 一个点 3D坐标 我想知道这个点是否包含在复杂的 3D 形状内 我
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 在 3D 场景中实现“抓取”相机平移工具

    在我的场景中 我有想要 抓取 的地形 然后在移动光标时让相机平移 其高度 视图向量 视野等全部保持不变 因此 最初的 抓取 点将是世界空间中的工作点 我希望在拖动时该点保留在光标下方 我当前的解决方案是获取前一个和当前的屏幕点 取消投影它们

随机推荐

  • ChatGPT的Fine-tuning是什么?

    fine tuning基本概念 Fine tuning 微调 是指在预训练过的模型基础上 使用特定任务的数据进行进一步的训练 以使模型更好地适应该任务 在ChatGPT的情况下 Fine tuning是指在预训练的语言模型上使用对话数据进行
  • dyld: Library not loaded:

    dyld Library not loaded 问题 在使用阿里的开源库LazyScrollView的时候出现的这个问题 本地Xcode11 4 1 真机调试 dyld Library not loaded rpath LazyScroll
  • centos查看系统名称、架信息

    centos查看系统名称 架构 hostnamectl
  • 将一个数组中的元素向后移动k位

    设计一个算法 将数组A 0 n 1 中的元素循环右移K位 假设原数组序列为 a0 a0 an 2 an 1 移动后的序列为 an k an k 1 a0 a1 an k ab k 1 要求只用一个元素大小的附加存储 元素移动或变换次数与n线
  • Python 利用Turtle模块绘制国际象棋棋盘

    使用Turtle模块绘制国际象棋棋盘 使用语言 Python 3 7 3 思路 国际象棋是8 8的一个个小正方形 或者说是9横9纵的线组成 作画的时候 先做9横9纵的线 再填上灰色的小正方形 即可完成 本次画的棋盘边长为160 160 1
  • Hive中LIKE和RLIKE的区别

    1 LIKE和RLIKE的使用示例 SELECT name LIKE Alice FROM table1 表示选择name列内以ALICE作为结尾的数据 相同的功能使用RLIKE实现如下 SELECT name RLIKE Alice FR
  • docker commit 命令

    简介 在软件开发中经常需要保存软件状态 比如git 中每次提交的代码都会有版本号 可以根据提交的版本号进行恢复 docker中通过docker commit 命令提供了一个保存镜像状态的方式 使用 比如有一镜像 adaptor 1 通过do
  • cmd怎么另起一行_西语毕业论文怎么写?西语资料去哪儿找?

    西语毕业论文怎么写 西语资料去哪儿找 1 论文结构 西语 学位论文包括前置 主体 附录等三个部分 以下细节无固定先后之分 视具体学校要求而定 1前置 1 封面 由论文 中 西 文题目 姓名 学号 专业 班级 指 导老师姓名和职称 时间组成
  • 数据结构系列——栈 stack

    本期主题 数据结构之 栈 往期链接 数据结构系列 先进先出队列queue 目录 1 栈定义 2 使用动态数组实现栈 3 有趣的例子 1 栈定义 栈是什么 定义 一个后进先出的数据结构 LIFO last in first out 插入操作称
  • 美国地质调查局SRTM--30米DEM数据

    美国地质调查局 USGS SRTM DEM数据 0 简介 1 数据下载 1 1网址 https lpdaac usgs gov https lpdaac usgs gov 1 2搜索 SRTM 以列表展示 选择SRTMGL1 003 1 3
  • 转--Approximate Inference(近似推断,变分推断,KL散度,平均场, Mean Field )

    题目 PRML读书会第十章 Approximate Inference 近似推断 变分推断 KL散度 平均场 Mean Field 转自 http blog csdn net nietzsche2015 article details 43
  • 使用波束搜索的端到端神经网络系统中的上下文语音识别(论文翻译)

    摘要 最近的研究表明 端到端 E2E 语音识别体系结构 如Listen attent和Spell LAS 可以在LVCSR任务中获得最先进的质量结果 这种体系结构的一个优点是它不需要单独训练的发音模型 语言模型和声学模型 但是 这个属性也引
  • Redis 高可用之持久化

    目录 Redis 高可用 Redis 持久化 RDB 持久化 触发条件 执行流程 启动时加载 修改配置文件 AOF 持久化 配置 执行流程 命令追加 append 文件写入 write 和文件同步 sync 文件重写 rewrite 文件重
  • Unity实现一个可扩展的UGUI无限滑动列表控件

    12月20日新增 增加一个可收缩的滑动列表 适用于游戏中的任务系统 成就等 使用说明 创建时需要两个模板slot 一个是button 另一个则是btn下显示的cell 配置如下图添加ExpandableView脚本 新增的IsDefault
  • Python环境配置

    1 python下载 下载地址 https www python org downloads 找到3 10以上的包下载 2 Pycharm下载 Pycharm下载 选择社区版本的下载就够用 3 Pycharm配置Python环境 Proje
  • 华为鸿蒙4本周发布:官方海报大有玄机!告别“人工智障”!

    一年一度的华为开发者大会2023 HDC Together 将于8月4日至8月6日在东莞松山湖举办 相比去年 今年的华为开发者大会足足提前了三个月 而本次大会主角之一无疑是全新国产操作系统鸿蒙4 HarmonyOS 4 官方之前用了三个词来
  • git查看、修改远程仓库地址

    查看 远程仓库 git remote v 修改 git remote set url origin gitUrl 再查看 git remote v 输出已修改过得git仓库地址 即为完成
  • 分布式数据库资料

    Hadoop是很多组件的集合 主要包括但不限于MapReduce HDFS HBase ZooKeeper MapReduce模仿了Google MapReduce HDFS模仿了Google File System HBase模仿了Goo
  • python项目2to3方案预研

    目录 官方工具2to3 工具安装 参数解释 基本使用 工具缺陷 future 工具安装 参数解释 基本使用 工具缺陷 python modernize 工具安装 参数解释 基本使用 工具缺陷 pyupgrade 工具安装 参数解释 基本使用
  • Unity 3D期末大作业--背包系统

    Unity游戏背包系统的实现 一 项目概述 1 功能描述 该部分主要实现了游戏中玩家在个人背包和游戏角色之间切换装备 能够从背包中将装备装到游戏角色上也能够将游戏角色的装备卸下放入背包 卸下装备放入背包 将背包中装备赋给游戏角色 2 实现思