Unity背包系统制作

说明

在做项目实训的时候用到了背包系统,给自己记个笔记,也希望能帮到其他初学者。
参考Unity在Youtube的官方教程- Adventure Game Unity Tutorial,英语好的话建议看看原版,Unity Asset Store也中有完整的项目包也可以参考。

图片素材

淘宝随便买的,满满的页游风

实现

我们需要的最终效果

  • 可以打开关闭物品栏(不讲)
  • 按P能够存放一瓶红药,按O删除一瓶
  • 重复的物品可以重叠并显示数量
  • 数量为1时不显示数量
  • 不同的物品会存在下一个空格子(自行测试)

在Hierarchy窗口创建我们需要的组件

先给看看Hierarchy窗口的结构,组件的位置、大小、图片这里都不过多陈述了,根据自己的需要调整。

1.创建画布InventoryCanvas
2.在InventoryCanvas下创建空对象Inventory
3.在Inventory下创建Image组件Background。在Background下创建Image组件CloseButton,并Add Component添加Button。
4.在Inventory下创建空对象Grid,然后在Grid下创建空对象ItemSlot(0)
5.在ItemSlot(0)下创建2个Image,分别命名为BackgroundImage,ItemImage,还有一个Text组件CountText。其中,BackgroundImage加上道具边框图片frame.png,ItemImage取消勾选Image(Script).

建立格子

给Grid添加组件Grid Layout Group,然后复制ItemSlot(0),Grid下的多个ItemSlot就会自动排列。你只需要调整格子大小,间隔,锚点等就可以了。

给Grid添加脚本Inventory.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using UnityEngine;
using UnityEngine.UI;
public class Inventory : MonoBehaviour
{
public Image[] itemImages = new Image[numItemSlots];
public Item[] items = new Item[numItemSlots];
public Text[] counts = new Text[numItemSlots];
public const int numItemSlots = 20;
int itemCount = 0;

public void AddItem(Item itemToAdd)
{
for (int i = 0; i < items.Length; i++)
{
if (items[i] == itemToAdd)
{
itemCount += 1;
counts[i].text = itemCount.ToString();
break;
}
else if (items[i] == null)
{
items[i] = itemToAdd;
itemImages[i].sprite = itemToAdd.sprite;
itemImages[i].enabled = true;
return;
}
}
}
public void RemoveItem(Item itemToRemove)
{
for (int i = 0; i < items.Length; i++)
{
if (items[i] == itemToRemove && itemCount > 1 )
{
if (itemCount == 2)
{
itemCount -= 1;
counts[i].text = "";
}
else
{
itemCount -= 1;
counts[i].text = itemCount.ToString();
}
}
else if (items[i] == itemToRemove)
{
items[i] = null;
itemImages[i].sprite = null;
itemImages[i].enabled = false;
return;
}
}
}
}

把ItemSlot下的ItemImage和CountText一一放进去

创建物品Item

先写一个脚本Item.cs,这个脚本创建一个类Item,并且可以使你在菜单中创建Item

1
2
3
4
5
6
7
using UnityEngine;

[CreateAssetMenu]
public class Item : ScriptableObject
{
public Sprite sprite;
}

之后在Asset中创建1个Item,并且把红药.png添加到它的sprite上

游戏管理类GameManager

创建一个空对象GameManager,将脚本GameManager.cs挂在上面,或者挂在摄像机上。并如下设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//游戏管理
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

//枚举游戏状态,运行和暂停
public enum GameState
{
Running,
Pause
}


public class GameManager : MonoBehaviour {
public static GameManager _instance;
public GameState gamestate=GameState.Running;//游戏状态,包括运行暂停
public Inventory inventory;
public Item itemToAdd;

void Awake () {
_instance = this;
}

//测试添加删除物品
private void Update()
{
//按P添加物品
if (Input.GetKeyDown(KeyCode.P))
{
inventory.AddItem(itemToAdd);
}
//按O删除物品
if (Input.GetKeyDown(KeyCode.O))
{
inventory.RemoveItem(itemToAdd);
}
//按ESC暂停游戏
if (Input.GetKeyDown(KeyCode.Escape))
{
_instance.TransformGameState();
}
}

//改变游戏的运行状态,运行与暂停
public void TransformGameState()
{
if (gamestate == GameState.Running)
{
Time.timeScale = 0;
gamestate = GameState.Pause;
}
else if (gamestate == GameState.Pause)
{
Time.timeScale = 1;
gamestate = GameState.Running;
}
}
}

评论