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

这篇具有很好参考价值的文章主要介绍了Unity 3D期末大作业--背包系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity游戏背包系统的实现

一、项目概述

1. 功能描述

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

卸下装备放入背包
unity3d 背包系统,3D游戏,unity,3d,游戏引擎
将背包中装备赋给游戏角色
unity3d 背包系统,3D游戏,unity,3d,游戏引擎

2. 实现思路

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

主要文件结构如下:
unity3d 背包系统,3D游戏,unity,3d,游戏引擎

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

装备在状态栏和背包之外的移动
为了实现这个效果,可以效仿前面的思路,设置一个空对象,有Image组件,当装备从状态栏/背包中脱离但还没放置到背包/状态栏上时,该空对象的Image则显示刚刚脱离装备格子的装备,其他时间该空对象不显示。且该对象随着鼠标移动。
unity3d 背包系统,3D游戏,unity,3d,游戏引擎

二、项目实现

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;
        }
    }

}

三、效果展示

unity3d 背包系统,3D游戏,unity,3d,游戏引擎
unity3d 背包系统,3D游戏,unity,3d,游戏引擎

相关连接:

Github:/termHomework

bilibili 视频展示文章来源地址https://www.toymoban.com/news/detail-742125.html

到了这里,关于Unity 3D期末大作业--背包系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D学习之UI系统——GUI

    设置Screen Type和Center Type 最终实现效果: 3.1.1 GUI 共同点 3.1.2 文本控件 可以传图片 在unity中拖入图片 可以把Rect 设置成public 的变量,在控件中设置 文字和图片均显示 toolTip 获取当前选中的空间的附带信息 GUI Style 控制样式 3.1.3 按钮控件 必须要按下并抬起才算被点击 长按按钮

    2024年01月22日
    浏览(68)
  • Unity3D学习之UI系统——UGUI

    3.2.1 Screen Space -Overlay 覆盖模式 3.2.2 Screen Space - Camera 摄像机模式 创建专门的摄像机渲染UI 并让主摄像机不渲染UI层 3.2.3 World Space 宽高 * 缩放系数 = UI界面大小 参考分辨率 图片格式要改为Sprite 恒定像素模式计算公式 会根据当前分辨率 和 参考分辨率的比率自动计算UI的缩放量

    2024年02月21日
    浏览(258)
  • Unity3D粒子系统之基础属性介绍(一)

    下文将介绍如何用Unity3D的粒子系统。 (1)Duration:粒子的发射周期 图中的5.00表示在5秒后会进入下一个粒子的发射周期。如果勾选Looping,则5秒后也就是第一个周期结束时粒子会停止发射。Prewarm是预热系统,只有在勾选Looping后才有效,开始播放粒子是已经发射了一段时间的

    2024年02月03日
    浏览(41)
  • Unity3D学习之UI系统——NGUI

    资源商店搜索 学习版自行搜索 导入即可 创建UI 创建NGUI后,挂载在UI Root 和其 子Camera的脚本 分辨率自适应模式的基础 3.1.1 分辨率概念 3.1.2 Root的作用 3.1.3 root脚本各组件 Minimun Height 和 Maximum Height 用于拖动窗口时,如果窗口变得很小了,UI不缩放的话,会挡住游戏,使用Flex

    2024年03月17日
    浏览(83)
  • 【unity小技巧】unity3d环境带雾的昼夜系统变化

    链接:https://pan.baidu.com/s/1qlFSJSju6ZjwCylwkh14eA?pwd=veww 提取码:veww 眩光其实可以简单的理解为太阳或月亮 想要相机显示眩光,需要在相机添加Flare Layer组件 配置参数 配置20 25 30 70 75 80位置的灯光颜色,具体的需要根据自己的天空盒 环境等,调配出适合的颜色和过渡 效果 加眩光

    2024年02月22日
    浏览(53)
  • Unity3d 制作一个简单的NPC对话系统

    ​ 最近在自己写一个比较小的项目,虽然自己是一个策划,但是程序方面我觉得也是很有必要学一学的。 ​ 经过了接近一年的学习,也终于是可以独自写一些小的系统了。 ​ 这次自己写了一个比较简单的NPC对话系统,供大家参考。 进入对话区域 开始对话 Inspector面板可调

    2023年04月08日
    浏览(44)
  • unity3d 布娃娃系统插件 PuppetMaster 木偶师

    PuppetMaster包含一个非常易于使用的视觉布娃娃创建工具,用于人形角色,将角色的动画的姿势映射到木偶的的肌肉使其同步,并保持在那里,直到动画在下一帧覆盖它。   1. 将 人形 角色模型拖动到场景并附加 BipedRagdollCreator . cs 组件。点击 “Create a Ragdoll” 按钮 , 点击 “ D

    2023年04月08日
    浏览(90)
  • Unity3D在车载导航系统的应用场景浅谈

    Unity3D在车载导航系统的应用场景非常广泛,它可以为车载导航系统带来更加逼真、直观和准确的使用体验。以下是几个具体的应用场景: 3D地图导航:Unity3D的实时3D渲染能力使得车载导航系统可以实现3D地图导航功能。通过Unity3D,可以生成超写实风格的3D地图,提供更加逼真

    2024年01月23日
    浏览(56)
  • Unity3D基础入门之粒子系统(属性介绍+火焰粒子系统案例制作)

    一、属性介绍 1、主面板Particle System (1)Duration:粒子发射周期 图中,5.00即在发射5秒后进入下一个粒子发射周期。若没有勾选Looping,则5秒后粒子会停止发射。 (2)Looping:粒子按照周期循环发射 让粒子发射时间循环起来,一直发射粒子。 (3)Prewarm:预热系统 开始播放粒

    2024年02月04日
    浏览(50)
  • 【Unity3d】 教会你如何做一个简单的电梯系统(升降平台)

           博主第一次写博客,语言略俗,有不足之处还请指正!        由于自己还处在unity小白阶段,受2d升降平台的影响(后续我也会上传关于2d升降平台的文章),突发奇想如何用3d做一个电梯系统,查阅网上资料后,发现网上对这方面的讲解少之又少,或者说其他博主提

    2024年02月11日
    浏览(111)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包