依然使用 Item 脚本作为案例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable] // 在 Inspector 中可见
public class Item
{
public string name;
public int id;
public Sprite icon;
}
建立 ItemDatabase 挂载到 Main Camera 上面:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemDatabase : MonoBehaviour
{
public List- itemList; // 创建一个物品的列表
public Dictionary
itemDictionary = new Dictionary(); // 创建一个物品的字典并初始化(初始化是必须的)
// key 的类型为 int,value 的类型为 Item
// key 和 value 形成配对
// Start is called before the first frame update
void Start()
{
Item sword = new Item(); // 初始化一个物品
sword.name = "Sword"; // 设定物品的名字
sword.id = 0; // 设定物品的 id
itemList.Add(sword); // 为物品列表添加一个元素
itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素
// 使用列表的时候,我们需要通过遍历整个列表来查找某个元素
// 使用字典的时候,我们可以通过物品的 id 直接查找到对应的元素
var item = itemDictionary[sword.id];
Debug.Log(item.name); // 通过 sword 的 id 就可以查找到对应物品
}
// Update is called once per frame
void Update()
{
}
}
建立 Item:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable] // 在 Inspector 中可见
public class Item
{
public string name;
public int id;
public Sprite icon;
}
建立 ItemDatabase:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemDatabase : MonoBehaviour
{
public Dictionary itemDictionary = new Dictionary();
// 创建一个物品的字典并初始化(初始化是必须的)
// Start is called before the first frame update
void Start()
{
Item sword = new Item(); // 初始化一个物品
sword.name = "Sword"; // 设定物品的名字
sword.id = 0; // 设定物品的 id
Item axe = new Item();
axe.name = "Axe";
axe.id = 1;
Item bike = new Item();
bike.name = "Bike";
bike.id = 2;
itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素
itemDictionary.Add(axe.id, axe);
itemDictionary.Add(bike.id, bike);
// 遍历字典:
foreach(KeyValuePair item in itemDictionary)
{
Debug.Log("Key: " + item.Key);
Debug.Log("Value: " + item.Value.name);
}
// 这里我们也可以写成 foreach(var item in itemDictionary)
// 遍历字典的 key:
foreach(var key in itemDictionary.Keys)
{
Debug.Log("Key: " + key);
}
// 这里的 key 是 int 类型
// 所以也可以写成 foreach(int key in itemDictionary.Keys)
// 遍历字典的 value:
foreach (var value in itemDictionary.Values)
{
Debug.Log("Item Name: " + value.name);
}
}
// Update is called once per frame
void Update()
{
}
}
注意:字典中,key 值是不能有重复的,value 可以重复。
另外,在字典中查找的时候,输入的 key 必须存在,否则会报错,为了避免这种情况,可以在前面插入一个检查的程序:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemDatabase : MonoBehaviour
{
public Dictionary itemDictionary = new Dictionary();
// 创建一个物品的字典并初始化(初始化是必须的)
// Start is called before the first frame update
void Start()
{
Item sword = new Item(); // 初始化一个物品
sword.name = "Sword"; // 设定物品的名字
sword.id = 0; // 设定物品的 id
Item axe = new Item();
axe.name = "Axe";
axe.id = 1;
Item bike = new Item();
bike.name = "Bike";
bike.id = 2;
itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素
itemDictionary.Add(axe.id, axe);
itemDictionary.Add(bike.id, bike);
if (itemDictionary.ContainsKey(60)) // 检测 60 号物品是否存在
{
Debug.Log(itemDictionary[60].name); // 存在的话打印名字
}
else
{
Debug.Log("Key does not exist."); // 否则打印不存在
}
if (itemDictionary.ContainsKey(1)) // 检测 1 号物品是否存在
{
Debug.Log(itemDictionary[1].name); // 存在的话打印名字
}
else
{
Debug.Log("Key does not exist."); // 否则打印不存在
}
}
// Update is called once per frame
void Update()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player
{
public string name;
public int id;
public Player(int id) // 构造函数,id是必须的属性
{
this.id = id;
}
}
public class Main : MonoBehaviour
{
public Dictionary playersDict = new Dictionary();
// 设定一个登陆玩家的字典,并初始化
Player p1;
Player p2;
// Start is called before the first frame update
void Start()
{
p1 = new Player(21); // 登陆一个玩家,分配一个 id
p1.name = "AA";
p2 = new Player(34);
p2.name = "BB";
playersDict.Add(p1.id, p1); // 把登陆的玩家添加到玩家字典
playersDict.Add(p2.id, p2);
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) // 按下空格键
{
if (playersDict.ContainsKey(34)) // 查询玩家 id 是否存在
{
Debug.Log("Player Name: " + playersDict[34].name); // 存在的话打印该玩家名字
}
else
{
Debug.Log("ID not exist!"); // 玩家 id 不存在
}
}
}
}
运行后,会打印 p2 的名字。
设定一个字典,组成名字和年龄的配对:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
public Dictionary player = new Dictionary();
// 建立一个字典,并初始化,key 为玩家名字,value 为玩家年龄
// Start is called before the first frame update
void Start()
{
player.Add("AA", 20); // 添加玩家
player.Add("BB", 21);
player.Add("CC", 34);
int age = player["BB"]; // 获得第二个玩家的年龄
Debug.Log("The age of BB is " + age); // 显示年龄
}
// Update is called once per frame
void Update()
{
}
}
注意:字典只可以通过 key 来查找 value,而不能反过来。
再设计一个 book 的字典:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
public Dictionary book = new Dictionary();
// 建立一个字典,并初始化,key 为玩家名字,value 为玩家年龄
// Start is called before the first frame update
void Start()
{
book.Add(123, "Good to go"); // 添加书本
book.Add(22, "What is that");
book.Add(25, "How to sell");
foreach(KeyValuePair item in book) // 打印所有书目
{
Debug.Log("ID: " + item.Key + " Book: " + item.Value);
}
}
// Update is called once per frame
void Update()
{
}
}