using System.Collections.Generic;
using System.Linq;
using asap.core;
using DataCenter;
using UnityEngine;
namespace EventPartnerGather.Mining
{
///
/// 事件合作伙伴挖矿点管理器
/// 管理所有挖矿点的位置,提供按顺序获取挖矿点的功能
///
/// 建议挂载在:MiningPoints容器对象上
///
/// 场景结构建议:
/// MiningPoints (挂载此脚本)
/// ├── MiningPoint1 (挖矿点1)
/// ├── MiningPoint2 (挖矿点2)
/// ├── MiningPoint3 (挖矿点3)
/// └── ... (更多挖矿点)
///
/// 使用说明:
/// - 将所有挖矿点的Transform拖拽到points数组中
/// - 或者脚本会自动获取所有子Transform作为挖矿点
///
public class EventPartnerMiningPointManager : MonoBehaviour
{
[Header("挖矿点配置")]
[Tooltip("挖矿点Transform数组 - 手动拖拽或自动获取子Transform")]
public List points = new();
[Header("奖杯点配置")]
public Transform trophyPoints;
public float trophyAniDuration = 2.2f;
[Header("矿石间隔 x方向" )]
[SerializeField]
public float cubeWidthX = 1.11f;
[Header("矿石间隔 z方向" )]
[SerializeField]
public float cubeWidthZ = 1.12f;
[Header("矿石Prefab")]
[Tooltip("挖矿点矿石Prefab")]
public GameObject[] miningResourcePrefabs;
[Header("调试信息")]
[Tooltip("当前挖矿点索引")]
[SerializeField] private int _index = 0;
private EventPartnerGatherManager _manager;
private void Awake()
{
_manager = GContext.container.Resolve();
// 如果没有手动设置挖矿点,自动获取子Transform
if (points == null || points.Count == 0)
{
AutoCollectMiningPoints();
}
ValidateMiningPoints();
}
private void Start()
{
InitGenerateOreGroups();
if (trophyPoints)
{
var finished = trophyPoints?.Find("audio_finished");
finished?.gameObject.SetActive(false);
var trophyAnim = trophyPoints?.GetComponent();
if (trophyAnim)
{
trophyAnim.GoToFrame(0);
}
// P_miningtrophy
//
}
}
private void OnEnable()
{
var finished = trophyPoints?.Find("audio_finished");
finished?.gameObject.SetActive(false);
}
private void OnDisable()
{
var finished = trophyPoints?.Find("audio_finished");
finished?.gameObject.SetActive(false);
}
///
///
///
public void InitGenerateOreGroups()
{
// ELog("InitGenerateOreGroups");
var stagePoints = _manager.EventPartnerMineMainData.StagePoint;
var num = points.Count;
var minePoint = _manager.EventPartnerMineMainData.MinePoint;
var minePointShow = _manager.EventPartnerMineMainData.MinePointShow;
for (var i = 0; i < num; ++i)
{
var oreNum = stagePoints[i] / minePoint;
// ELog($"InitOreGroup stageIndex={i} oreNum={oreNum}");
var orePerCol = minePointShow[i];
var oreRoot = points[i].Find("ores");
var orePoint = points[i].Find("ore_point");
var zeroPos = orePoint.position;
var halfColNum = orePerCol / 2;
if (orePerCol % 2 == 1) // 奇数
{
zeroPos.z -= halfColNum * (cubeWidthZ);
}
else
{
zeroPos.z -= (halfColNum - 0.5f)* cubeWidthZ ;
}
for (var n = 0; n < oreNum; ++n)
{
var prefab = miningResourcePrefabs[i];
var ore = Instantiate(prefab,oreRoot);
ore.name = $"ore_{i}_{n}";
ore.transform.position = CalcPosition(zeroPos,n / orePerCol, n % orePerCol);
}
}
return;
Vector3 CalcPosition(Vector3 zeroPos,int col, int row)
{
// ELog($"CalcPosition zeroPos={zeroPos} col={col} row={row}");
return new Vector3(zeroPos.x + col * cubeWidthX, zeroPos.y, zeroPos.z + row * cubeWidthZ);
}
}
///
/// 自动收集所有子Transform作为挖矿点
///
private void AutoCollectMiningPoints()
{
points = new List();
for (int i = 0; i < transform.childCount; i++)
{
var child = transform.GetChild(i);
if (child.gameObject.activeInHierarchy && child.gameObject.name.StartsWith("ore"))
{
points.Add(child);
}
}
ELog($"AutoCollectMiningPoints count={points.Count}");
}
///
/// 验证挖矿点配置
///
private void ValidateMiningPoints()
{
if (points == null || points.Count == 0)
{
LogWarning("ValidateMiningPointsFailed reason=NoPoints");
return;
}
// 移除空引用
for (int i = points.Count - 1; i >= 0; i--)
{
if (!points[i])
{
points.RemoveAt(i);
LogWarning($"RemoveNullMiningPoint index={i}");
}
}
ELog($"ValidateMiningPointsDone validCount={points.Count}");
}
public Transform GetNextPoint()
{
if (points == null || points.Count == 0) return null;
var t = points[_index % points.Count];
_index++;
return t;
}
//
public Transform GetPoint(int curIndex)
{
_index = curIndex;
if (points == null || points.Count == 0) return null;
var t = points[curIndex % points.Count];
return t;
}
public Transform GetTrophyPoint()
{
return trophyPoints;
}
public void ResetPoints()
{
_index = 0;
var num = points.Count;
const string defaultOreName = "rock1";
for (int i = 0; i < num; i++)
{
var oreRoot = points[i].Find("ores");
foreach (Transform ore in oreRoot)
{
ore.gameObject.SetActive(true);
var oreController = ore.gameObject.GetComponent();
if (oreController)
{
Destroy(oreController);
}
foreach (var child in ore.Cast())
{
var childName = child.gameObject.name;
child.gameObject.SetActive(childName.Equals(defaultOreName));
}
}
}
if (trophyPoints)
{
var finished = trophyPoints?.Find("audio_finished");
finished?.gameObject.SetActive(false);
var trophyAnim = trophyPoints?.GetComponent();
if (trophyAnim)
{
trophyAnim.GoToFrame(0);
}
var fxCelebrate = trophyPoints.Find("fx_partnermining_celebrate");
if (fxCelebrate)
{
fxCelebrate.gameObject.SetActive(false);
}
}
}
private static void ELog(object t)
{
#if UNITY_EDITOR
Debug.Log($"EventPartnerMiningPointManager-> {t} ");
#endif
}
private static void LogWarning(object t)
{
Debug.LogWarning($"EventPartnerMiningPointManager-> {t} ");
}
//
}
}