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个或更多数量。
相关推荐
Thomas_YXQ3 小时前
Unity3D Huatuo技术原理剖析详解
unity·unity3d·游戏开发·性能调优·热更新
火云洞红孩儿4 小时前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
虾球xz6 小时前
游戏引擎学习第59天
学习·游戏引擎
zh路西法6 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
橘子遇见BUG9 小时前
Unity Shader学习日记 part 3 线性代数--矩阵变换
学习·线性代数·unity·矩阵·图形渲染
神洛华12 小时前
Y3编辑器教程8:资源管理器与存档、防作弊设置
编辑器·游戏引擎·游戏程序
Moweiii12 小时前
SDL3 GPU编程探索
c++·游戏引擎·图形渲染·sdl·vulkan
Artistation Game12 小时前
一、c#基础
游戏·unity·c#·游戏引擎
成都渲染101云渲染666613 小时前
云渲染,Enscape、D5、Lumion渲染提速教程
运维·服务器·unity·电脑·图形渲染·blender·houdini
超龄魔法少女1 天前
[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换
unity·技术美术·shadergraph