玩家與物品接觸后的判定
? ? ? ?if (hit != null && hit.CompareTag("Item")){Debug.Log("撿東西");var worldItem = hit.gameObject.GetComponent<WorldItem>();if (worldItem != null){var inventory = GetComponent<PlayerInventory>();if (inventory != null){inventory.TryPickItem(worldItem); }}}
玩家的背包腳本
分3部分:
公共函數TryPickItem(實際上也是客戶端的玩家調用)
發給服務端的函數:申請撿東西
服務端發給客戶端的函數:廣播客戶端修改物品
using UnityEngine;
using Mirror;
using System.Collections.Generic;
?
public class PlayerInventory : NetworkBehaviour
{public List<Item> items = new List<Item>();
?// 提供給外部調用的公共函數public void TryPickItem(WorldItem targetItem){if (!isLocalPlayer || targetItem == null) return;Debug.Log("TryPick");CmdPickItem(targetItem.netId);}
?// 服務器端命令函數,用于處理撿取物品的邏輯[Command]void CmdPickItem(uint netId){Debug.Log("發送撿東西");if (NetworkServer.spawned.TryGetValue(netId, out var itemIdentity)){var worldItem = itemIdentity.GetComponent<WorldItem>();if (worldItem != null){Item itemData = worldItem.GetItemData();items.Add(itemData);Debug.Log($"服務端:拾取了 {itemData.itemName}");TargetAddItem(connectionToClient, itemData);NetworkServer.Destroy(worldItem.gameObject);}}}
?// 客戶端RPC函數,用于同步物品到客戶端[TargetRpc]void TargetAddItem(NetworkConnection target, Item item){items.Add(item);Debug.Log($"客戶端:已同步物品 {item.itemName} 到背包");}
}
結果展示
拾取前
拾取后