using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; public class BorderOpsPrototype : MonoBehaviour { public static BorderOpsPrototype Instance { get; private set; } public CurrencyManager currency; public InventoryManager inventory; public TradeManager trade; public OperatorManager operators; public GunsmithManager gunsmith; public RangeManager range; public HeadquartersManager headquarters; public ServerAuthority server; [Header("主界面面板")] public GameObject mainPanel; public GameObject inventoryPanel; public GameObject tradePanel; public GameObject rangePanel; public GameObject gunsmithPanel; public GameObject operatorPanel; public GameObject headquartersPanel; [Header("主界面文本")] public Text hafuCoinText; public Text actionPointsText; public Text currentOperatorText; [Header("仓库")] public Transform warehouseListParent; public GameObject warehouseItemPrefab; public Text warehouseHint; [Header("交易行")] public InputField tradeSearchInput; public Transform marketListParent; public Transform myListingsParent; public GameObject tradeListingPrefab; public Text tradeBalanceText; [Header("靶场")] public Text rangeStatusText; public Button staticTargetButton; public Button movingTargetButton; public Button damageTestButton; public Button exitRangeButton; [Header("改枪台")] public Transform gunsmithBuildListParent; public GameObject gunsmithBuildPrefab; public Text gunsmithHint; [Header("干员")] public Transform operatorListParent; public GameObject operatorEntryPrefab; public Text currentOperatorDetailText; [Header("特勤处")] public Text headquartersLevelText; public Transform departmentListParent; public GameObject departmentEntryPrefab; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; currency = GetComponent() ?? gameObject.AddComponent(); inventory = GetComponent() ?? gameObject.AddComponent(); trade = GetComponent() ?? gameObject.AddComponent(); operators = GetComponent() ?? gameObject.AddComponent(); gunsmith = GetComponent() ?? gameObject.AddComponent(); range = GetComponent() ?? gameObject.AddComponent(); headquarters = GetComponent() ?? gameObject.AddComponent(); server = GetComponent() ?? gameObject.AddComponent(); } private void Start() { RefreshMainInfo(); currency.onHafuCoinChanged.AddListener(_ => RefreshMainInfo()); currency.onActionPointsChanged.AddListener(_ => RefreshMainInfo()); operators.onOperatorChanged.AddListener(op => { if (currentOperatorText != null && op != null) currentOperatorText.text = op.operatorName; }); inventory.onInventoryChanged.AddListener(RefreshWarehouse); trade.onMarketUpdated.AddListener(RefreshMarket); trade.onMyListingsUpdated.AddListener(RefreshMyListings); currency.onHafuCoinChanged.AddListener(UpdateTradeBalance); range.onRangeStateChanged.AddListener(_ => UpdateRangeStatus()); headquarters.onHeadquartersUpdated.AddListener(RefreshHeadquarters); RefreshWarehouse(); RefreshMarket(); RefreshMyListings(); UpdateTradeBalance(currency.hafuCoin); UpdateRangeStatus(); RefreshHeadquarters(); RefreshOperators(); RefreshGunsmithBuilds(); } public void RefreshMainInfo() { if (hafuCoinText != null) hafuCoinText.text = $"哈夫币:{currency.hafuCoin}"; if (actionPointsText != null) actionPointsText.text = $"行动点:{currency.actionPoints}"; var op = operators.currentOperator; if (currentOperatorText != null && op != null) currentOperatorText.text = op.operatorName; } public void OpenInventory() { SetActivePanel(inventoryPanel); RefreshWarehouse(); } public void OpenTrade() { SetActivePanel(tradePanel); RefreshMarket(); RefreshMyListings(); UpdateTradeBalance(currency.hafuCoin); } public void OpenRange() { SetActivePanel(rangePanel); range.EnterRange(); } public void OpenGunsmith() { SetActivePanel(gunsmithPanel); RefreshGunsmithBuilds(); } public void OpenOperators() { SetActivePanel(operatorPanel); RefreshOperators(); } public void OpenHeadquarters() { SetActivePanel(headquartersPanel); RefreshHeadquarters(); } public void StartOperation() { Debug.Log("进入对局:搜打撤模式"); } public void BackToMain() { mainPanel?.SetActive(true); inventoryPanel?.SetActive(false); tradePanel?.SetActive(false); rangePanel?.SetActive(false); gunsmithPanel?.SetActive(false); operatorPanel?.SetActive(false); headquartersPanel?.SetActive(false); range.ExitRange(); } private void SetActivePanel(GameObject panel) { mainPanel?.SetActive(false); inventoryPanel?.SetActive(false); tradePanel?.SetActive(false); rangePanel?.SetActive(false); gunsmithPanel?.SetActive(false); operatorPanel?.SetActive(false); headquartersPanel?.SetActive(false); if (panel != null) panel.SetActive(true); } public void RefreshWarehouse() { if (warehouseListParent == null) return; foreach (Transform child in warehouseListParent) Destroy(child.gameObject); foreach (var item in inventory.warehouse) { if (item.item == null) continue; var entry = CreateEntry(warehouseListParent, warehouseItemPrefab); var text = entry.GetComponentInChildren(); if (text != null) text.text = $"{item.item.itemName} x{item.count}"; } if (warehouseHint != null) warehouseHint.text = $"仓库物品数:{inventory.warehouse.Count}"; } public void RefreshMarket() { FillTradeList(marketListParent, trade.marketListings, true); } public void RefreshMyListings() { FillTradeList(myListingsParent, trade.myListings, false); } private void FillTradeList(Transform parent, List listings, bool isBuy) { if (parent == null || listings == null) return; foreach (Transform child in parent) Destroy(child.gameObject); foreach (var listing in listings) { if (listing.item == null) continue; var entry = CreateEntry(parent, tradeListingPrefab); var text = entry.GetComponentInChildren(); var button = entry.GetComponentInChildren