黑暗之光 Day2

1.鼠标点击UI检测

UICamera.isOverUI

2.鼠标指针管理

public class CussorManager : MonoBehaviour {
     public static CussorManager instance;       // 单例
 
     public Texture2D cursorAttack;              // 存储鼠标贴图
     public Texture2D cursorLockTarget;
     public Texture2D cursorNormal;
     public Texture2D cursorNpcTalk;
     public Texture2D cursorPick;
 
     void Start()
     {
         instance = this;
     }
 
     public void SetNormal()                     // 设置鼠标为正常
     {
         Cursor.SetCursor(cursorNormal, Vector2.zero, CursorMode.Auto);
     }
 
     public void SetNpcTalk()                    // 设置鼠标为 Npc_talk
     {
         Cursor.SetCursor(cursorNpcTalk, Vector2.zero, CursorMode.Auto);
     }
 }

3.读取物品文件

1 public TextAsset objectsInfoText;
 2 private Dictionary<int, ObjectInfo> objectsInfoDict = new Dictionary<int, ObjectInfo>();
 3 
 4 // 从文件中读取物品信息
 5 void ReadInfo()
 6 {
 7     string text = objectsInfoText.text;                    // 获取文本内容
 8     string[] objectsArr = text.Split('\n');                // 以换行符分割字符
 9     for (int i = 0; i < objectsArr.Length; ++i)            // 遍历每一行
10     {
11         string[] proArr = objectsArr[i].Split(',');         // 以逗号分割属性
12         ObjectInfo info = new ObjectInfo();                 // 物品属性
13         info.id = int.Parse(proArr[0]);
14         info.name = proArr[1];
15         info.iconName = proArr[2];
16         string type = proArr[3];
17         info.type = ObjectType.Material;
18         switch (type)
19         {
20             case "Drug":
21                 info.type = ObjectType.Drug;
22                 break;
23             case "Equip":
24                 info.type = ObjectType.Equipment;
25                 break;
26             case "Mat":
27                 info.type = ObjectType.Material;
28                 break;
29         }
30         if (info.type == ObjectType.Drug)                   // 物品是药品
31         {
32             info.hp = int.Parse(proArr[4]);
33             info.mp = int.Parse(proArr[5]);
34             info.sellPrice = int.Parse(proArr[6]);
35             info.buyPrice = int.Parse(proArr[7]);
36         }
37         objectsInfoDict.Add(info.id, info);                  // 加入字典
38     }
39 }
40 
41 // 根据 ID 查找物品信息
42 public ObjectInfo GetObjectInfoById(int id)
43 {
44     ObjectInfo info;
45     objectsInfoDict.TryGetValue(id, out info);
46     return info;
47 }

4.物品拖拽

继承UIDragDropItem类。

5.模拟拾取物品放入背包

1 // 根据 id 拾取物品
 2 public void GetId(int id)
 3 {
 4     InventoryItemGrid grid = null;
 5     // 查找是否已有该物品
 6     foreach (InventoryItemGrid temp in itemGridList)
 7     {
 8         if (temp.GetId() == id)         // 已有
 9         {
10             grid = temp;
11             break;
12         }
13     }
14     if (grid != null)
15     {
16         grid.PlusNum();                 // 该物品数目+1
17     }
18     else
19     {
20         // 查找是否有空格子
21         foreach (InventoryItemGrid temp in itemGridList)
22         {
23             if (temp.GetId() == 0)      // 有空格子
24             {
25                 grid = temp; break;
26             }
27         }
28         if (grid != null)               // 往空格子里放物品
29         {
30             GameObject itemGo = NGUITools.AddChild(grid.gameObject, inventoryItemPrefab);
31             itemGo.transform.localPosition = Vector3.zero;
32             itemGo.GetComponent<UISprite>().depth = 4;
33             grid.SetId(id);             // 改变各自装的物品
34         }
35     }
36 }
// 根据 id 更换格子物品
public void SetId(int id, int num = )
{
    info = ObjectsInfo.instance.GetObjectInfoById(id);      // 根据 id 查找物品
    this.id = id;
    this.num = num;
    InventoryItem item = GetComponentInChildren<InventoryItem>();
    item.SetIconName(info.iconName);
    numLabel.enabled = true;
    numLabel.text = num.ToString();
}

6.物体拖拽实现

protected override void OnDragDropRelease(GameObject surface)
     {
         print(this.tag);
         base.OnDragDropRelease(surface);
         if (surface != null)
         {
             if (surface.tag == Tags.inventoryItemGrid)              
             {
                 if (surface != this.transform.parent.gameObject)    // 拖拽到空格子
                 {
                     InventoryItemGrid oldGrid = this.transform.parent.GetComponent<InventoryItemGrid>();
                     InventoryItemGrid newGrid = surface.GetComponent<InventoryItemGrid>();
                     newGrid.SetId(oldGrid.GetId(), oldGrid.GetNum());
                     oldGrid.ClearInfo();
                 }
             }
             else if (surface.tag == Tags.inventoryItem)             // 拖拽到有物体的格子
             {
                 InventoryItemGrid grid1 = this.transform.parent.GetComponent<InventoryItemGrid>();
                 InventoryItemGrid grid2 = surface.transform.parent.GetComponent<InventoryItemGrid>();
                 int id = grid1.GetId();
                 int num = grid1.GetNum();
                 grid1.SetId(grid2.GetId(), grid2.GetNum());
                 grid2.SetId(id, num);
             }
         }
 
         ResetPos();
     }
 
     void ResetPos()
     {
         this.transform.localPosition = Vector3.zero;
     }