Unity VR背包系统项目(1)

背包系统脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.InputSystem;

public class 背包系统背包 : MonoBehaviour
{
    public GameObject 左手手柄; // 左手控制器
    public GameObject 右手手柄; // 右手控制器
    public GameObject 父物体;

    public Transform 背包父物体;
    public 背包系统_背包对象 背包对象;
    public int 背包格子数量 = 16;

    public enum 物品类型
    {
        无 = 0,香蕉,易拉罐,衣服,水瓶,电池,鱼骨,香烟,饭盒,针管,饭,药品,纸
    }

    public InputActionReference R扳机;
    public InputActionReference L扳机;
    public InputActionReference B按键;

    public List<背包系统_背包对象> 所有背包对象 = new List<背包系统_背包对象>();

    public void GaiBeiBaoShu(int GeZiShu) 
    {
        for(int fFor = 0; fFor < GeZiShu; fFor++) {
        所有背包对象.Add(Instantiate(背包对象, 背包父物体));
        所有背包对象[所有背包对象.Count - 1].gameObject.SetActive(true);
        }
    }


    void Start()
    {
        GaiBeiBaoShu(背包格子数量);
    }

    void Update()
    {
        if (R扳机.action.WasPressedThisFrame() || L扳机.action.WasPressedThisFrame())
        {
            RaycastHit hit;
            if (Physics.Raycast(右手手柄.transform.position, 右手手柄.transform.forward, out hit))
            {
                if (hit.collider.GetComponent<背包系统_可拾取物品>()) 
                {
                    if (hit.collider.GetComponent<背包系统_可拾取物品>().拾取物品类型 != 物品类型.无)
                    {
                        for (int fFor = 0; fFor < 所有背包对象.Count; fFor++)
                        {
                            if (所有背包对象[fFor].这个物品类型 == 物品类型.无)
                            {
                                所有背包对象[fFor].这个物品类型 = hit.collider.GetComponent<背包系统_可拾取物品>().拾取物品类型;
                                所有背包对象[fFor].背包放置数量 = hit.collider.GetComponent<背包系统_可拾取物品>().数量;

                                break;
                            }
                        }
                    }
                
                

                    Destroy(hit.collider.gameObject);
                }
            }
        }

        // 当背部按键被按下时
        if (B按键.action.WasPressedThisFrame())
        {
            // 切换背包的显示和隐藏
            父物体.SetActive(!父物体.activeSelf);
        }

    }
}

脚本解析

这个脚本实现了一个基本的背包系统,包括背包格子的实例化、物品的拾取和销毁,以及背包的显示和隐藏。下面是对代码的详细讲解和代码思路:

  1. 背包系统背包类:
    • 这个类是背包系统的核心,负责处理背包的逻辑。
    • 它有一个Start方法,用于在游戏开始时初始化背包,以及一个Update方法,用于在游戏运行时处理背包的交互逻辑。
  2. 背包格子数量:
    • 这个变量定义了背包中格子的数量。
    • Start方法中,通过循环创建背包格子,并将其添加到所有背包对象列表中。
  3. 背包父物体:
    • 这个变量定义了背包中所有物品格子的父对象。
    • GaiBeiBaoShu方法中,使用这个父对象来实例化背包格子。
  4. 所有背包对象:
    • 这是一个列表,用于存储背包中的所有物品格子。
    • GaiBeiBaoShu方法中,创建新的背包物品槽实例,并将其添加到所有背包对象列表中。
  5. GaiBeiBaoShu方法:
    • 这个方法用于初始化背包,通过循环创建背包格子,并将其添加到所有背包对象列表中。
    • Start方法中,调用这个方法来实例化背包中的物品槽。
  6. Update方法:
    • 这个方法是Unity中的生命周期方法,它会在每一帧被调用。
    • 在这个方法中,当玩家按下左右手控制器的扳机键时,会从右手控制器发射射线。
    • 如果射线击中了带有背包系统_可拾取物品脚本的物体,它会遍历背包中的物品,找到一个空的格子,然后将拾取物品的类型和数量赋值给这个背包格子,并销毁被拾取的物品。
  7. 背部按键处理:
    • 当背部按键被按下时,会切换背包的显示和隐藏。
  8. 物品类型枚举:
    • 这个枚举定义了背包中可以存放的物品类型。
    • Update方法中,用于检查拾取物品的类型是否为空。
  9. 背包系统_背包对象类:
    • 假设这个类已经实现,用于存储背包中的物品类型和数量。
    • Update方法中,用于将拾取物品的类型和数量赋值给背包格子。
  10. 背包系统_可拾取物品类:
    • 假设这个类已经实现,用于定义可拾取物品的逻辑。
    • Update方法中,用于检查拾取物品

背包内对象脚本

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

public class 背包系统_背包对象 : MonoBehaviour
{
    public GameObject 物体;
    public 背包系统背包.物品类型 这个物品类型;
    public int 背包放置数量 = 0;
    public Sprite[] 物品贴图;
    public Image 贴图显示;

    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        物体.gameObject.SetActive(背包放置数量>0);
        贴图显示.sprite = 物品贴图[(int)这个物品类型];
    }

}

这个脚本提供了一个基本的框架,用于表示背包中的一个物品格子。可以根据需要添加更多的功能,例如显示物品的详细信息、控制物品的放置数量等。

  1. 背包系统_背包对象类:
    • 这个类是背包系统中用于表示一个具体的背包物品格子的类。
    • 它包含了一些公共的属性和方法,用于在Unity编辑器中配置和控制这个物品格子。
  2. GameObject物体:
    • 这个属性是一个游戏对象,它代表背包中的物品。
    • Update方法中,通过SetActive方法来控制这个物品是否应该在场景中显示。
  3. 背包系统背包.物品类型 这个物品类型:
    • 这个属性是一个枚举类型,它定义了背包中物品的类型。
    • Update方法中,通过这个属性来设置物品的类型。
  4. int背包放置数量:
    • 这个属性定义了当前物品格子中放置的物品数量。
    • Update方法中,通过这个属性来控制物品是否应该在场景中显示。
  5. Sprite[ ]物品贴图:
    • 这个属性是一个Sprite数组,它包含了不同类型物品的贴图。
    • Update方法中,通过这个属性来设置物品的贴图。
  6. Image贴图显示:
    • 这个属性是一个Image组件,它用于在场景中显示物品的贴图。
    • Update方法中,通过这个属性来设置显示的物品贴图。
  7. Start方法:
    • 这个方法是Unity中的生命周期方法,它会在游戏开始时被调用。
    • 在这个方法中,可以进行一些初始化工作,例如设置物品的默认状态。
  8. Update方法:
    • 这个方法是Unity中的生命周期方法,它会在每一帧被调用。
    • 在这个方法中,会根据背包放置数量来控制物品的显示状态,并根据物品类型来设置显示的贴图。

可拾取物品脚本

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

public class 背包系统_可拾取物品 : MonoBehaviour
{
    public 背包系统背包.物品类型 拾取物品类型;
    public int 数量 = 1;

    void Start()
    {
        
    }

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

这个脚本是背包系统中的一部分,负责表示一个可拾取的物品。

  1. 背包系统_可拾取物品类:
    • 这个类是背包系统中用于表示一个可拾取的物品的类。
    • 它定义了物品的类型和数量,以及与背包系统交互的逻辑。
  2. 背包系统背包.物品类型 拾取物品类型:
    • 这个属性是一个枚举类型,它定义了背包中物品的类型。
    • 它允许您在Unity编辑器中为不同的物品类型指定不同的拾取物品类型。
    • 例如,如果一个物品的类型是“香蕉”,那么它的拾取物品类型可能是“香蕉”。
  3. int数量:
    • 这个属性定义了当前物品的数量。
    • 它允许您在Unity编辑器中为每个物品指定一个数量。
    • 例如,一个物品可能有1个、2个或更多数量。

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 05:10:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 05:10:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 05:10:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 05:10:04       20 阅读

热门阅读

  1. 数据分析 -- numpy

    2024-04-03 05:10:04       16 阅读
  2. 物联网虚拟仿真实验教学中心平台建设

    2024-04-03 05:10:04       15 阅读
  3. Python在数据分析与可视化中的深度实践

    2024-04-03 05:10:04       15 阅读
  4. .vimrc文件的语句语法

    2024-04-03 05:10:04       11 阅读
  5. 2024Mathorcup数学建模竞赛A题B题C题D题

    2024-04-03 05:10:04       17 阅读
  6. 服务器是争做时代先锋

    2024-04-03 05:10:04       12 阅读
  7. 【LeetCode热题100】【链表】K 个一组翻转链表

    2024-04-03 05:10:04       13 阅读
  8. LeetCode 20.有效的括号

    2024-04-03 05:10:04       15 阅读
  9. MyBatis数据库逆向生成工具

    2024-04-03 05:10:04       11 阅读
  10. 20款高级 Python 装饰器

    2024-04-03 05:10:04       11 阅读