Unity的C#编程教程_59_字典 Dictionary 详解及应用练习

文章目录

    • C# Dictionary: Introduction
    • C# Dictionary: Looping through Dictionary
    • C# Dictionary: When to Use
    • C# Dictionary: Using Dictionary for Player Connections
    • C# Dictionary: Using Dictionary with Primitive Types

C# Dictionary: Introduction

  • 字典
    • key 和 value 的配对

依然使用 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()
    {
        
    }
}

C# Dictionary: Looping through Dictionary

  • 循环遍历字典元素

建立 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()
    {
        
    }
}

C# Dictionary: When to Use

  • 什么时候使用字典
    • 当我们在操作大型的列表时候,该用字典会更为便利
    • 比如我们的道具系统,玩家购买道具的时候,发出指令(输入对应的物品 id)
    • 如果使用列表,我们需要遍历整个列表来查找该物品,而使用字典的话可以直接通过 key 和 value 配对找到
    • 另外比如我们的物品栏,每个空格对应一个 key,然后可以链接不同的物品(即 value)

C# Dictionary: Using Dictionary for Player Connections

  • 在线玩家监测系统
    • 每个玩家登陆游戏的时候分配一个 id
    • 使用字典把 id 和玩家进行配对组合
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 的名字。

C# Dictionary: Using Dictionary with Primitive Types

  • 在字典中使用一些预设的类型,比如 int 和 string

设定一个字典,组成名字和年龄的配对:

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()
    {

    }
}

你可能感兴趣的:(unity,unity,unity3d,c#,游戏开发)