Unity VR背包系统项目(1)

背包系统脚本

cs 复制代码
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);
        }

    }
}

脚本解析

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

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

* 假设这个类已经实现,用于定义可拾取物品的逻辑。
* 在`Update`方法中,用于检查拾取物品

背包内对象脚本

cs 复制代码
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)这个物品类型];
    }

}

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

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

可拾取物品脚本

cs 复制代码
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()
    {
        
    }
}

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

背包系统_可拾取物品类:
  • 这个类是背包系统中用于表示一个可拾取的物品的类。
  • 它定义了物品的类型和数量,以及与背包系统交互的逻辑。
背包系统背包.物品类型 拾取物品类型:
  • 这个属性是一个枚举类型,它定义了背包中物品的类型。
  • 它允许您在Unity编辑器中为不同的物品类型指定不同的拾取物品类型。
  • 例如,如果一个物品的类型是"香蕉",那么它的拾取物品类型可能是"香蕉"。
int数量:
  • 这个属性定义了当前物品的数量。
  • 它允许您在Unity编辑器中为每个物品指定一个数量。
  • 例如,一个物品可能有1个、2个或更多数量。
相关推荐
charon877816 小时前
UE ARPG | 虚幻引擎战斗系统
游戏引擎
小春熙子17 小时前
Unity图形学之Shader结构
unity·游戏引擎·技术美术
Sitarrrr19 小时前
【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
3d·unity
极梦网络无忧19 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
逐·風1 天前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
_oP_i1 天前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
代码盗圣1 天前
GODOT 4 不用scons编译cpp扩展的方法
游戏引擎·godot
Leoysq2 天前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
PandaQue2 天前
《潜行者2切尔诺贝利之心》游戏引擎介绍
游戏引擎
_oP_i2 天前
unity中 骨骼、纹理和材质关系
unity·游戏引擎·材质